天天看點

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

Redis Cluster叢集收縮主從節點

1.Cluster叢集收縮概念

當項目壓力承載力過高時,需要增加節點來提高負載,當項目壓力不是很大時,也希望能夠将叢集收縮下來,給其他項目使用,這就要用到叢集收縮了

叢集收縮操作和叢集擴容是一樣的,隻需要把方向反過來即可。

擴容的時候執行一次指令就可以實作槽位遷移成功,而收縮的時候有幾個主節點就需要執行多少次,比如除去要下線的節點,還有3個主節點,那麼就需要執行三次,填寫遷移出槽位的數量也需要除以3,每個節點也需要平均配置設定。

收縮的時候首先要填寫分出多少個槽位,然後填寫要分給誰,最後填寫從哪分出槽位,一般分多少個槽位,就需要看要下線的主機上有多少個槽位,然後除以叢集主節點數,使每一個主機點分到的槽位都是相同的,填寫要配置設定給誰的時候,第一次填寫第一個主節點的ID,第二次填寫第二個主節點的ID,最後填寫提供槽位的節點ID,就是下線節點的ID号。

叢集收縮擴容槽位的時候不會影響資料的使用。

叢集收縮的源端就是要下線的主節點,目标端就是線上的主節點(配置設定給誰的節點)。

咱們要清楚一點,隻有主節點是有槽位的,是以呢需要将主節點的槽位配置設定給其他主節點,當槽位清空後,這個主機節點就可以下線了。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

收縮叢集前後對比圖

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

叢集收縮操作步驟:

​ 1.執行reshard指令将需要下線的主節點進行槽位分散。

​ 2.有幾個主節點就需要執行幾次reshard指令,首先填寫要分出的槽位數,然後填寫分給誰,最後填寫從哪裡分。

​ 3.當槽位分散完成後,要下線的主節點沒有任何資料時,将節點從叢集中删除。

叢集資訊

目前叢集時四主四從共8個節點,我們需要将叢集改為三主三從,收縮出兩個節點給其他程式使用。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

2.将6390主節點從叢集中收縮

2.1.計算需要分給每一個節點的槽位數

可以看到6390節點上有4096個槽位,删除要下線的6390節點後,我們還有3個主節點,4096除3得到1365,配置設定槽位的時候給每個節點配置設定1365個槽位即可均勻。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

2.2.配置設定1365個槽位給192.168.81.210的6380節點

我們需要将192.168.81.240的6390節點分出1365個槽位給192.168.81.210的6380節點。

隻需要把What is the receiving node ID填寫成192.168.81.210的6380節點ID即可,指的是配置設定出來的槽位要給誰。

然後source node填寫192.168.81.240的6390節點的ID,這裡指的是從哪個節點上分出1365個槽位,填寫ID後,回車後會提示還要從哪個節點上配置設定槽位,因為隻有6390需要分出槽位,是以在這裡填寫done,表示隻有這個一個節點分出1365個槽位給其他節點。

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365				#配置設定出多少個槽位

What is the receiving node ID? 80e256579658eb256c5b710a3f82c439665794ba				#将槽位分給那個節點

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8					#從哪個節點分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes			#輸入yes繼續

           

下面是收縮節點的過程截圖。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

資料遷移過程。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

槽位分出遷移成功。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

2.3.配置設定1365個槽位給192.168.81.220的6380節點

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1365				#配置設定出多少個槽位

What is the receiving node ID? 10dc7f3f9a753140a8494adbbe5a13d0026451a1				#将槽位分給那個節點

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8					#從哪個節點分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes			#輸入yes繼續
           

收縮過程截圖展示。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

2.4.配置設定1365個槽位給192.168.81.230的6380節點

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 1366				#配置設定出多少個槽位

What is the receiving node ID? a4381138fdc142f18881b7b6ca8ae5b0d02a3228				#将槽位分給那個節點

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6bee155f136f40e28e1f60c8ddec3b158cd8f8e8					#從哪個節點分出槽位
Source node #2:done

Do you want to proceed with the proposed reshard plan (yes/no)? yes			#輸入yes繼續

           

收縮過程截圖展示。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

當最後一個節點遷移完資料後,6390主節點槽位數變為0。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

2.5.檢視目前叢集槽位配置設定

槽位及資料已經從6390即将下線的主機遷移完畢,可以看下目前叢集三個主節點的槽位數。

可以非常清楚的看到,現在每個主節點的槽位數為5461。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

如果覺得槽位重新配置設定後順序不太滿意,那麼在執行一下reshard,把其它節點的槽位都分給192.168.81.210的6380上,這樣一來,210的6380擁有的槽位就是0-16383,然後在将210的槽位一個節點分給5461個,分完之後,各節點的順序就一緻了。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

3.驗證資料遷移過程是否導緻資料異常

多開幾個視窗,一個執行資料槽位遷移,一個不斷建立key,一個檢視key的建立進度,一個檢視key的資料。

持續測試,發現沒有任何資料異常,全部顯示ok。

Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

4.将下線的主節點從叢集中删除

4.1.删除節點

使用redis-trib删除一個節點,如果這個節點存在複制關系,有節點在複制目前節點或者目前節點複制别的節點的資料,redis-trib會自動處理複制關系,然後将節點删除,節點删除後會把對應的程序也停止運作。

删除節點之前必須確定該節點沒有任何槽位和資料,否則會删除失敗。

指令:

./redis-trib.rb del-node 節點IP:端口 ID

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.240:6390 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8
>>> Removing node 6bee155f136f40e28e1f60c8ddec3b158cd8f8e8 from cluster 192.168.81.240:6390
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.240:6391 f6b9320dfbc929ad5a31cdb149360b0fd8de2e60
>>> Removing node f6b9320dfbc929ad5a31cdb149360b0fd8de2e60 from cluster 192.168.81.240:6391
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

           
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

4.2.調整主從交叉複制

删掉192.168.81.240伺服器上的兩個redis節點後,192.168.81.210伺服器上的6380就沒有了複制關系,我們需要把192.168.81.230的6381節點複制192.168.81.210的6380節點。

[root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6381
192.168.81.230:6381> CLUSTER REPLICATE 80e256579658eb256c5b710a3f82c439665794ba
OK
           
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

4.3.當節點存在資料無法删除

[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb del-node 192.168.81.220:6380 10dc7f3f9a753140a8494adbbe5a13d0026451a1
>>> Removing node 10dc7f3f9a753140a8494adbbe5a13d0026451a1 from cluster 192.168.81.220:6380
[ERR] Node 192.168.81.220:6380 is not empty! Reshard data away and try again.

           
Redis Cluster叢集收縮主從節點 #yyds幹貨盤點# Redis Cluster叢集收縮主從節點

5.将下線主機清空叢集資訊

redis-trib雖然能夠将節點在叢集中删除,但是無法将其的叢集資訊清空,如果叢集資訊還有保留,那麼該接地那就無法加入其它叢集。

192.168.81.240:6390> CLUSTER reset
OK
           

繼續閱讀