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 6385redis> cluster meet 192.168.1.122 6386 |
2、查看集群
|
1
2
3
4
5
6
7
8
9
|
redis> cluster nodes861950ffe756a17831a396592e71c98b4cca7fe5 192.168.1.122:6385 master connectedf66b03da36fda230cb5933fb27039935fd525ceb 192.168.1.122:6386 master connectede3e9351854cb1bf30de2b612ede9c93d92c40a09 192.168.1.71:6386 master - 0 1670082221324 48 connected 10924-16383d946f65359df4c538e95eb1449793b60fed64156 192.168.1.71:6385 slave e3e9351854cb1bf30de2b612ede9c93d92c40a09 0 1670082222327 48 connected43d45869a4fdc32aad3c13dcce8d5d36e09dcaea 192.168.1.123:6385 slave fbe4515a4f99b933302aa593c51fc7a45d44936a 0 1670082220322 50 connectedfbe4515a4f99b933302aa593c51fc7a45d44936a 192.168.1.123:6386 master - 0 1670082223329 50 connected 5462-10923111111111111111111111111111111111111111 fail master 0-5461 disconnect222222222222222222222222222222222222222 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 861950ffe756a17831a396592e71c98b4cca7fe5redis> CLUSTER SETSLOT 1 node 861950ffe756a17831a396592e71c98b4cca7fe5redis> 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.shfor i in {1..5461}do/usr/local/bin/redis-cli -h 192.168.1.122 -p 6385 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5done |
|
1
2
3
4
5
|
[root@localhost ~]# cat a.shfor i in {1..5461}do/usr/local/bin/redis-cli -h 192.168.1.71 -p 6386 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5done |
|
1
2
3
4
5
|
[root@localhost ~]# cat a.shfor i in {1..5461}do/usr/local/bin/redis-cli -h 192.168.1.123 -p 6386 -a admin -c CLUSTER SETSLOT $i node 861950ffe756a17831a396592e71c98b4cca7fe5done |
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:6386192.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/

浙公网安备 33010602011771号