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