首頁 > 資料庫 > Redis > 主體

實例詳解Redis Cluster叢集收縮主從節點

WBOY
發布: 2022-04-21 21:15:50
轉載
3399 人瀏覽過

這篇文章為大家帶來了關於Redis的相關知識,其中主要介紹了Redis Cluster集群收縮主從節點的相關問題,包括了Cluster集群收縮概念、將6390主節點從集群中收縮、驗證資料遷移過程是否導致資料異常等,希望對大家有幫助。

實例詳解Redis Cluster叢集收縮主從節點

推薦學習:Redis影片教學

#1.Cluster叢集收縮概念

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

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

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

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

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

群集收縮的源端就是要下線的主節點,目標端就是在線的主節點(分配給誰的節點)。
咱們要清楚一點,只有主節點是有槽位的,因此呢需要將主節點的槽位分配給其他主節點,當槽位清空後,這個主機節點就可以下線了。

實例詳解Redis Cluster叢集收縮主從節點
收縮群集前後對比圖
實例詳解Redis Cluster叢集收縮主從節點

群集收縮操作步驟:

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

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

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

集群資訊

目前集群時四主四從共8個節點,我們需要將集群改為三主三從,並收縮兩個節點給其他程序使用。
實例詳解Redis Cluster叢集收縮主從節點

2.將6390主節點從群集中縮小

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

可以看到6390節點上有4096個槽位,刪除要下線的6390節點後,我們還有3個主節點,4096除3得到1365,分配槽位的時候給每個節點分配1365個槽位即可均勻。
實例詳解Redis Cluster叢集收縮主從節點

2.2.分配1365個插槽給192.168.81.210的6380節點

我們需要將192.168.81.240的6390節點分出1365節點分出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叢集收縮主從節點
資料遷移過程。
實例詳解Redis Cluster叢集收縮主從節點
槽位分出遷移成功。
實例詳解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叢集收縮主從節點
實例詳解Redis Cluster叢集收縮主從節點
實例詳解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叢集收縮主從節點
實例詳解Redis Cluster叢集收縮主從節點

当最后一个节点迁移完数据后,6390主节点槽位数变为0。

實例詳解Redis Cluster叢集收縮主從節點

2.5.查看当前集群槽位分配

槽位及数据已经从6390即将下线的主机迁移完毕,可以看下当前集群三个主节点的槽位数。

可以非常清楚的看到,现在每个主节点的槽位数为5461。

實例詳解Redis Cluster叢集收縮主從節點

如果觉得槽位重新分配后顺序不太满意,那么在执行一下reshard,把其它节点的槽位都分给192.168.81.210的6380上,这样一来,210的6380拥有的槽位就是0-16383,然后在将210的槽位一个节点分给5461个,分完之后,各节点的顺序就一致了。
實例詳解Redis Cluster叢集收縮主從節點

3.验证数据迁移过程是否导致数据异常

多开几个窗口,一个执行数据槽位迁移,一个不断创建key,一个查看key的创建进度,一个查看key的数据。
持续测试,发现没有任何数据异常,全部显示ok。
實例詳解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叢集收縮主從節點

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叢集收縮主從節點

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叢集收縮主從節點

5.将下线主机清空集群信息

redis-trib虽然能够将节点在集群中删除,但是无法将其的集群信息清空,如果集群信息还有保留,那么该接地那就无法加入其它集群。

實例詳解Redis Cluster叢集收縮主從節點

在下线的redis节点上使用cluster reset删除集群信息即可。

192.168.81.240:6390> CLUSTER reset
OK
登入後複製

實例詳解Redis Cluster叢集收縮主從節點

推荐学习:Redis视频教程

以上是實例詳解Redis Cluster叢集收縮主從節點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板