redis專題系列17 -- redis 叢集模式之Cluster叢集

Cluster叢集就是一個提供在多個Redis間節點間共享資料的程式集,是Redis 3。0版本以後引入的,是redis官方推薦的效能最高的叢集模式。

架構模型

redis專題系列17 -- redis 叢集模式之Cluster叢集

1。採取了去中心化的思想,沒有中心節點

2。其對key的演算法並非一致性hash演算法,而是採用了雜湊槽模型,每個叢集擁有16384個hash slot,儲存時,使用CRC16演算法對key校驗,然後對16384取模得到對應的雜湊槽。

3。節點之間採用輕量通訊協議,佔用頻寬少,效率高

4。自動負載均衡,自動failover,支援動態擴充套件。

5。Cluster模式也是基於主從模式+哨兵衍生出來的,只不過資料節點本身也是哨兵節點,如果有半數節點發現某個節點異常,則共同決定故障節點狀態,如果主節點故障,則其從節點晉升為主節點,主節點重啟後降級為從節點。但是如果叢集沒有設定salve節點,一旦主節點掛掉,整個叢集便進入fail狀態,因為叢集的slot對映不完整。如果叢集超過半數以上的master掛掉,無論是否有slave,叢集都會進入fail狀態。

6。叢集的規模至少有3臺以上的master,這樣比較合適叢集的部署。

架構搭建實戰

環境: win10 X64, redis 3.2.100

1。準備6份配置檔案,3主3從,下面奉上其中一份配置的詳情:

redis專題系列17 -- redis 叢集模式之Cluster叢集

埠號依次從7000~7005,同樣的叢集配置檔案的名稱與埠號保持一致。

2。下載並安裝ruby執行時環境

最新版本官網地址:https://github。com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2。6。5-1/rubyinstaller-2。6。5-1-x64。exe

按照提示一步步向下走就好了,安裝成功後,可以使用

ruby -v

檢查是否成功。

redis專題系列17 -- redis 叢集模式之Cluster叢集

孤安裝的是2。6。3,國內網站下載的,官網太慢

3。下載ruby環境下Redis的驅動,考慮到相容性,這裡下載的是4。1。3版本

下載地址:https://rubygems。org/downloads/redis-4。1。3。gem,注意如果ruby的版本低於2。3。0,安裝驅動時會報錯。

4。安裝Redis驅動

gem install ——local path_to_gem/redis-4。1。3。gem

5。下載建立Redis叢集的ruby指令碼檔案redis-trib。rb,路徑如下

github地址:https://github。com/beebol/redis-trib。rb,解壓然後放到redis的安裝目錄下(建議)。

redis專題系列17 -- redis 叢集模式之Cluster叢集

redis-trib。rb指令碼

6。cd到redis安裝目錄,依次啟動7000~7005

redis-server redis。7000。confredis-server redis。7001。confredis-server redis。7002。confredis-server redis。7003。confredis-server redis。7004。confredis-server redis。7005。conf

啟動成功:

redis專題系列17 -- redis 叢集模式之Cluster叢集

cluster模式

同時看到安裝目錄生成了對應節點的節點配置檔案:

redis專題系列17 -- redis 叢集模式之Cluster叢集

內容即記錄自己節點的資訊:

redis專題系列17 -- redis 叢集模式之Cluster叢集

nodes。7000。conf

7。使用redis-trib。rb指令碼配置叢集,本例配置為3主3從模式

redis專題系列17 -- redis 叢集模式之Cluster叢集

首先看命令:

redis專題系列17 -- redis 叢集模式之Cluster叢集

執行命令後,會為叢集配置master及對應的slave,最後你只需要在確認時輸入yes即可,接著為3個master分配16384個hash slot:

redis專題系列17 -- redis 叢集模式之Cluster叢集

master 7000對應的slot為:0-5460,master 7001對應的slot: 5461-10922,master 7002的slot範圍:10923-16383,此時,16384個slot全部分配完畢。

8。同時將分配的資訊更新到了nodes。7000。conf檔案中,其他節點也會同步,如下:

redis專題系列17 -- redis 叢集模式之Cluster叢集

其他節點資訊也被更新到nodes。7000。conf檔案中

9。測試

>redis-cli -c -p 7000127。0。0。1:7000> set foo bar-> Redirected to slot [12182] located at 127。0。0。1:7002OK127。0。0。1:7002> get foo “bar”

可以看到redis將key foo經過CRC16(foo)對16384取模,定位到7002的slot上,並將值bar寫入到7002的機器,返回client處理結果後,然後將命令同步到7005的從節點上。取值直接從7002執行命令。

10。故障模擬

此時kill掉7002的服務,觀察叢集的變化,此時執行命令 get foo

127。0。0。1:7000> get foo-> Redirected to slot [12182] located at 127。0。0。1:7005“bar”

看到,叢集將自動跳轉到7005取值了,那麼7005是slave還是master呢?

redis專題系列17 -- redis 叢集模式之Cluster叢集

nodes。7000。conf

從上面的配置資訊中看到,7005成功晉升為master節點。

10。重啟7002節點,看nodes。7000。conf配置資訊的變化

redis專題系列17 -- redis 叢集模式之Cluster叢集

7002重啟後成為7005的子節點

此時一個簡單的redis cluster 叢集就搭建和部署OK了。

擴充套件:除了nodes。xxx。conf看cluster的叢集配置資訊,也可以透過cluster nodes檢視。

redis專題系列17 -- redis 叢集模式之Cluster叢集

下一篇文章將接著介紹Cluster模式下節點的動態擴充套件。