今天機房出現故障,有一個機器啓動不起來,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/