1. 程式人生 > >redis叢集伸縮實踐之官方redis-cluster伸縮

redis叢集伸縮實踐之官方redis-cluster伸縮

redis叢集由於各種原因,可能需要下線機器,例如某臺機器經常故障,需要換掉;例如某些時間段不需要那麼多機器,都可以下線機器。某些時刻又需要增加機器,例如淘寶雙十一促銷,京東618等。下面我來實踐redis官方叢集的節點伸縮。這個例子單機實現叢集。

ps:建議使用redis-trib.rb,能夠避免新節點已經加入過其他叢集,造成故障

一、節點增加

1、前期準備

1)建立配置檔案


配置的說明可以看我上一篇文章

2)複製多份檔案

sed "s/7000/7007/g" redis-7000.conf >redis-7007.conf


3)啟動前面6個redis,檢視程序


4)將這六個redis都加入叢集

redis-trib.rb create --replicas 1 127.0.0.1:7000  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 

127.0.0.1:7004 127.0.0.1:7005 

回車,過一會輸入yes,得到最終結果,他們都加入叢集了


5)驗證是否加入叢集並分配槽,看到以下資訊說明正確


2、增加節點:

原理:其實就是meet操作

1)啟動要增加的兩個節點

redis-server redis-7006.conf

redis-server redis-7007.conf

7007作為從節點。

2)新增節點

檢視官方的命令,redis-trib.rb如下:


有個add-node 就是加入叢集的命令

先把從節點加入7000的叢集

redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

找出7006的id,把7007以從節點的形式加入7000的叢集

redis-trib.rb add-node --slave --master-id b818ae7a3a8e8e671d648c4d4ad38a1138ef8dd3 

127.0.0.1:7007 127.0.0.1:7000 

成功,檢視節點資訊,剛好4主4從


3、遷移槽和資料

加入節點之後,加入的節點是沒有分配到槽和資料的,需要我們手動分配

1)遷移槽和資料的原理:

A、對目標節點發送:cluster setslot {slot} import {sourceNodeId}命令,讓目標節點準備匯入槽的資料。

B、對源節點發送:cluster setslot {slot} migrating {targetNodeId}命令,讓源節點準備遷出槽的資料。

C、源節點迴圈執行cluster getkeysinslot {slot} {count} 命令,每次獲取count個數據槽的鍵。

D、在源節點上執行migrate {targetIp} {targetPort} key 0 {timeout}命令把指定的key做遷移。

E、重複執行步驟3~4直到槽下所有的資料都遷移到目標節點

F、向叢集內所有主節點發送cluster setlot {slot} node {targetNodeId}命令,通知槽分配給目標節點。

ps:在這個過程中,3.0.6版本可以使用pipeline進行批量遷移,但是

如果有過期資料和非過期資料鍵混合,會出bug,但是在3.2.8之後修復了。

2)執行遷移資料


計算好要遷移的資料,4096,輸入

找到要遷移的id7006的fefb18c90335bb7359a517f7c4d415e1d0cc3d81

並且所有的節點都要遷移槽,輸入all


輸入回車之後過一會還有一個提示,輸入yes


然後檢視槽的分配,成功了


二、節點收縮

添加了節點之後,下面下線7006和7007這個節點

節點下線主要分為以下幾個步驟

1、下線槽

如果有槽,下線槽。

先把7006的1365個槽遷移到7000,然後遷移1366個槽到7001,然後遷移1365個槽到7002


遷移成功:


2、忘記節點

下線其實是一個forget的操作 redis-cli -p 7000 cluster forget {downNodeId}

我們這裡使用redis-trib.rb 的這個工具的del-node工具,先下線7007再下線7006。(下線節點的時候,需要先下線所有從節點,因為如果先下線主節點,會觸發故障自動轉移。

開啟redis-trib.rb的原始碼,找到del-node


再找到delnode_cluster_cmd,可以看到裡面有一個forget操作,說明是執行forget操作


那麼開始,下線從節點7007,在下線7006


最後檢視一下,已經下線成功:


最後注意一下,因為這個例子是在同一個機器沒有網路延時,資料量也很少,所以遷移很快。實際生產過程中用到叢集的情況下,資料量一般會挺多,遷移需要時間,必須做好計劃再遷移。另外用命令列遷移可能會不好操作,也容易出錯,可以使用一些開源的視覺化工具。