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 861950 ffe 756 a 17831 a 396592 e 71 c 98 b 4 cca 7 fe 5 192.168 . 1.122: 6385 master connected f 66 b 03 da 36 fda 230 cb 5933 fb 27039935 fd 525 ceb 192.168 . 1.122: 6386 master connected e 3 e 9351854 cb 1 bf 30 de 2 b 612 ede 9 c 93 d 92 c 40 a 09 192.168 . 1.71: 6386 master - 0 1670082221324 48 connected 10924 -16383 d 946 f 65359 df 4 c 538 e 95 eb 1449793 b 60 fed 64156 192.168 . 1.71: 6385 slave e 3 e 9351854 cb 1 bf 30 de 2 b 612 ede 9 c 93 d 92 c 40 a 09 0 1670082222327 48 connected 43 d 45869 a 4 fdc 32 aad 3 c 13 dcce 8 d 5 d 36 e 09 dcaea 192.168 . 1.123: 6385 slave fbe 4515 a 4 f 99 b 933302 aa 593 c 51 fc 7 a 45 d 44936 a 0 1670082220322 50 connected fbe 4515 a 4 f 99 b 933302 aa 593 c 51 fc 7 a 45 d 44936 a 192.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 861950 ffe 756 a 17831 a 396592 e 71 c 98 b 4 cca 7 fe 5 后面的 861950 ffe 756 a 17831 a 396592 e 71 c 98 b 4 cca 7 fe 5 id就是主节点id |
7、看到192.168.1.122:6385和192.168.1.122:6386成功加入集群了,但是原来的数据没有了,图中的11109只是刚刚写入的数据:
转自
redis cluster 故障后,主从位于相同节点的修复(丢失了部分数据)_ITPUB博客
http://blog.itpub.net/28916011/viewspace-2926614/