1. 程式人生 > >redis之叢集模式

redis之叢集模式

本文主要介紹搭建redis的叢集架構,其中會記錄搭建遇到的坑。在之前的哨兵模式下,我們做到了高可用階段,哨兵模式同樣也存在一些不足之處,比如寫資料在固定的master節點,就算有多個master節點,master之間也要有通訊來同步資料,這些都給master增加一定的壓力。
redis的叢集模式思想之給每個master節點分配一定數量的slot(共16384個),set資料的時候,根據CRC16(key) mode 16384計算出分配到哪個slot,在高併發下將資料讀寫分散到不同的master到達分散式的效果,這一過程很像hashmap的存取方式。
下面我們會從零一步步搭建redis叢集模式,此時預設你已經會搭建redis複製和哨兵模式,因為redis叢集會用到部分相同的知識點。
redis叢集要求必須有6個節點才可以搭建,所以我們使用兩臺伺服器,6個redis,伺服器:
(1)192.168.121.139:6379
(2)192.168.121.139:6380
(3)192.168.121.139:6383
(4)192.168.121.140:6381
(5)192.168.121.140:6382
(6)192.168.121.140:6384
首先,整個結構圖如下面所示,大腦有個概念圖
在這裡插入圖片描述

第一步:配置並啟動redis各個節點
在複製模式基礎上,再次新增上redis的配置檔案中關於叢集的設定如下

#開啟叢集
cluster-enabled yes
#叢集的配置檔案,自動生成,不需要手動建立
cluster-config-file nodes-6381.conf
#斷定為節點下線的超時時間
cluster-node-timeout 15000

啟動6個redis節點,這裡需要注意的是,如果節點工作目錄下有rdb或aof檔案,需要將其刪除,否則建立叢集會失敗。
第二步:建立redis叢集
我是用的redis版本是4.0的,內部提供了建立叢集的命令,redis-trib.rb,這個命令的執行依賴於ruby,所以我們需要安裝ruby(這裡是使用rvm下載ruby的)。下面的安裝步驟按照順序執行即可。
(1)gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
(2)curl -sSL

https://get.rvm.io | bash -s stable
(3)find / -name rvm -print(列印rvm安裝路徑)
在這裡插入圖片描述
(4)source /usr/local/rvm/scripts/rvm
(5)rvm list known(檢視有哪些ruby版本)
在這裡插入圖片描述
這裡我選擇2.5.1版本的。
(6)rvm install 2.5.1(這一步驟時間有點長)
(7)rvm use 2.5.1(使用該版本的,機器重啟會還原)
(8)rvm use 2.5.1 --default(設定預設版本,機器重啟不會還原)
(9)ruby --version(檢視ruby版本)
(10)gem install redis(安裝叢集相關依賴)

第三步:建立叢集
執行下面的命令

./redis-trib.rb create --replicas 1 192.168.121.139:6379 192.168.121.139:6380 192.168.121.139:6383 192.168.121.140:6381 192.168.121.140:6382 192.168.121.140:6384
–replicas 1:表示每個master有一個從節點,所以形成3主3從
執行完上面的命令,立馬會列印主從節點和slot分配的資訊
在這裡插入圖片描述
輸入“yes”進入下一步。這裡要注意的是如果一直等待下去,那麼檢視下redis各個節點的埠是否開放,同時對於每個節點都會有個叢集匯流排節點(redis埠+10000),該埠也要開放。另外,在redis的配置檔案中,bind 的配置,主機ip放到迴環ip前面(我就是因為這個原因搞了很久)。
叢集建立成功會列印下面資訊
在這裡插入圖片描述

第四步:測試
經過上面步驟,我們已經成功搭建redis叢集,下面我們測試下
(1)當我們向6379master寫資料的時候,驚奇的發現
在這裡插入圖片描述
這個原因是因為,set的資料key並不屬於6379的slot範圍,所以會列印該資料應該set到6380節點,同時也給出了slot=12706
(2)首先我們通過cluster nodes檢視當前節點資訊
在這裡插入圖片描述
當我們關掉master6379節點後,再次檢視節點資訊
在這裡插入圖片描述
如果此時我們再次把6384掛機,那麼整個redis叢集就不能提供服務了,再次嘗試set資料就會提示叢集下線
在這裡插入圖片描述
(3)除了上面的一個節點的master和slave全部掛機,整個叢集不能服務。還有另外一種就是超過半數的master節點同時掛機,此時叢集也不能提供服務
(4)每個從節點是不能讀寫資料的,因為從節點不會分配slot,任意的資料操作都會提示下面資訊
在這裡插入圖片描述