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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章