redis cluster 故障后,主从位于相同节点的修复(丢失了部分数据)【转】

今天机房出现故障,有一个机器启动不起来,redis cluster集群丢失了一部分数据,拓扑图如下:

    通过上图可以看到,192.168.1.122启动不起来后,其上的主1和从1因为在一个机器上,就全部丢失了。

    这个布局非常危险,主和从不应该放在一个机器上。

    我找运维,运维给我分配了一个全新的机器,并且绑定的ip还是原来的192.168.1.122。

    在192.168.1.122上,安装了两个全新的,空的redis:

1
2
/usr/local/redis/bin/redis-server /opt/cachecloud/conf/redis-cluster-6385.conf &
/usr/local/redis/bin/redis-server /opt/cachecloud/conf/redis-cluster-6386.conf &

     由于详细的恢复步骤,没记录,我现在凭着记忆,把关键步骤写在这:

    1、现在 192.168.1.122:6385和 192.168.1.122:6386是两个独立的节点,和原来的集群没有任何联系,现在随便个集群节点,登录入集群,加入集群:

1
2
redis> cluster meet 192.168.1.122 6385
redis> cluster meet 192.168.1.122 6386

    2、查看集群

1
2
3
4
5
6
7
8
9
redis> cluster nodes
861950ffe756a17831a396592e71c98b4cca7fe5 192.168.1.122:6385 master connected
f66b03da36fda230cb5933fb27039935fd525ceb 192.168.1.122:6386 master connected
e3e9351854cb1bf30de2b612ede9c93d92c40a09 192.168.1.71:6386 master - 0 1670082221324 48 connected 10924-16383
d946f65359df4c538e95eb1449793b60fed64156 192.168.1.71:6385 slave e3e9351854cb1bf30de2b612ede9c93d92c40a09 0 1670082222327 48 connected
43d45869a4fdc32aad3c13dcce8d5d36e09dcaea 192.168.1.123:6385 slave fbe4515a4f99b933302aa593c51fc7a45d449360 1670082220322 50 connected
fbe4515a4f99b933302aa593c51fc7a45d44936192.168.1.123:6386 master - 0 1670082223329 50 connected 5462-10923
111111111111111111111111111111111111111 fail master   0-5461 disconnect
222222222222222222222222222222222222222 fail slave  disconnect

    3、通过disconnect可以看出,0-5461之间的slot槽位丢失了,现在我们把0-5461号slot,绑定到新节点192.168.1.122:6385上

1
2
3
4
5
6
7
redis> CLUSTER SETSLOT 0 node 861950ffe756a17831a396592e71c98b4cca7fe5
redis> CLUSTER SETSLOT 1 node 861950ffe756a17831a396592e71c98b4cca7fe5
redis> CLUSTER SETSLOT 2 node 861950ffe756a17831a396592e71c98b4cca7fe5
......
redis> CLUSTER SETSLOT 5461 node 861950ffe756a17831a396592e71c98b4cca7fe5
后面的861950ffe756a17831a396592e71c98b4cca7fe5就是192.168.1.122:6385的id,通过cluster nodes可以看到。
上面的命令在集群中的所有主节点上,都要执行一遍。

    4、因为一次只能setslot一个,所以,我写了个脚本,需要在所有集群主节点上执行一遍:

1
2
3
4
5
[root@localhost ~]# cat a.sh
for i in {1..5461}
do
/usr/local/bin/redis-cli -h 192.168.1.122 -p 6385 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5
done
1
2
3
4
5
[root@localhost ~]# cat a.sh
for i in {1..5461}
do
/usr/local/bin/redis-cli -h 192.168.1.71 -p 6386 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5
done
1
2
3
4
5
[root@localhost ~]# cat a.sh
for i in {1..5461}
do
/usr/local/bin/redis-cli -h 192.168.1.123 -p 6386 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5
done

    5、这样,192.168.1.122:6385就成为集群的真正主节点,并且管理着0-5451号slot槽。

    6、然后,将新装的、空的 192.168.1.122:6386作为 192.168.1.122:6386的从节点:

1
2
3
登录到192.168.1.122:6386
192.168.1.122:6386> cluster replicate 861950ffe756a17831a396592e71c98b4cca7fe5
后面的861950ffe756a17831a396592e71c98b4cca7fe5 id就是主节点id

    7、看到192.168.1.122:6385和192.168.1.122:6386成功加入集群了,但是原来的数据没有了,图中的11109只是刚刚写入的数据:

转自

redis cluster 故障后,主从位于相同节点的修复(丢失了部分数据)_ITPUB博客
http://blog.itpub.net/28916011/viewspace-2926614/

posted @ 2023-03-30 16:27  paul_hch  阅读(161)  评论(0编辑  收藏  举报