问题: 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
--cluster-simulate # 模拟rebalance操作,不会真正执行迁移操作
--cluster-pipeline
--cluster-threshold
--cluster-replace # 是否直接replace到目标节点
step6
最后不忘记保存配置 cluster saveconfig