redis cluster 集群故障恢复操作思路

问题: redis cluster  集群为fail,怎么样快速恢复?     

     假设你现在有一个3主3从的redis cluster,很不幸运,你丢了2个节点。怎么可能这么倒霉呢,假设呀。redis cluster集群

状态为fail,丢失了一些分片。遇到一个集群状态为fail,怎么修复?

生产线上redis用不了,所有的人已经站在你旁边,总监来回的小碎步,正在和老板解释故障的情况。运营和开发正在一遍一遍

的催问,系统啥时候修复,电话被打爆了。研发的同学已经在你身后,看着你的操作。形势看起来十万火急。

集群坏了原因分析:

(1)master节点能启动,但是master节点的IP变化了,集群还是根据旧的IP去连接节点,导致集群不能自愈。

(2)master节点某种原因不能启动,slave节点坏掉,有部分槽位slot丢失

(3)master节点因为网络原因不能连接,部分分片丢失,有部分槽位slot丢失

修复步骤:

step1 需要把dump.rdb或者appendonly.aof文件拷贝出来,目的是先恢复redis节点数据, 如果数据能恢复,可能不需要fix修复命令,集群就可能恢复。

step2 

连接任意一个集群节点,cluster forget删除掉有故障的节点。这个时候建议你用call命令,这个命令很好用,写一条命令,可以在集群所有节点执行。

redis-cli  --cluster call 192.168.8.101:6381   cluster  forget 

查询检查集群信息一致。

redis-cli  --cluster call 192.168.8.101:6381   cluster  nodes 

【提示】如果你用redis-cli --cluster del-node命令删除丢失的节点,命令执行失败,错误提示为连接拒绝。


step3 

meet命令添加节点

redis-cli  --cluster call 192.168.8.101:6381   cluster meet  192.168.8.101 6384

查询检查集群信息是否一致。

redis-cli  --cluster call 192.168.8.101:6381   cluster  nodes 

redis-cli  --cluster check 192.168.8.101:6381

如果这个时候足够幸运,cluster应该是恢复了。如果提示[ERR] Not all 16384 slots are covered by nodes.

接下来需要fix修复命令


在这个步骤你也可以使用命令add-node节点增加集群节点

redis-cli --cluster add-node 192.168.8.102:6384 192.168.8.101:6381

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

>>> Send CLUSTER MEET to node 192.168.8.102:6384 to make it join the cluster.

[OK] New node added correctly.

执行命令成功。


【注意】如果提示[ERR] Not all 16384 slots are covered by nodes.表示add-node命令执行不成功。


step4  

fix修复节点命令

redis-cli --cluster  fix  192.168.8.101  6381

修复节点后发现,很多slots都分散在各个节点,slots不连续,如果你有强迫症的话,你肯定会把想不连续的slots放在一起。

对, 我也是这样想的,于是我就用下面命令进行在线重分配。


【注意】fix修复命令,不仅可以自动删除disconnected的节点,而且会迁移没有分配的slots到正常节点,可以使集群

状态fail转变为ok。我之所以手动先给集群增加一个节点,手动删除有故障节点,然后fix修复命令,fix是会迁移的slots,需

要代价的,fix完成后,还需要再平衡rebalance集群。


step5 

再平衡rebalance集群

redis-cli --cluster rebalance --cluster-use-empty-masters  --cluster-pipeline 1000 --cluster-simulate  192.168.8.101 6384

  rebalance      host:port # 指定集群的任意一节点进行平衡集群节点slot数量 

                 --cluster-weight # 指定集群节点的权重

                 --cluster-use-empty-masters # 设置可以让没有分配slot的主节点参与,默认不允许

                 --cluster-timeout # 设置migrate命令的超时时间

                 --cluster-simulate # 模拟rebalance操作,不会真正执行迁移操作

                 --cluster-pipeline # 定义cluster getkeysinslot命令一次取出的key数量,默认值为10

                 --cluster-threshold # 迁移的slot阈值超过threshold,执行rebalance操作

                 --cluster-replace # 是否直接replace到目标节点



step6

最后不忘记保存配置  cluster saveconfig



请使用浏览器的分享功能分享到微信等