redis cluster 叢集故障恢復操作思路

e71hao發表於2022-04-07

問題: redis cluster  叢集為fail,怎麼樣快速恢復?     

     假設你現在有一個3主3從的redis cluster,很不幸運,你丟了2個節點。怎麼可能這麼倒黴呢,假設呀。redis cluster叢集

狀態為fail,丟失了一些分片。遇到一個叢集狀態為fail,怎麼修復?

生產線上redis用不了,所有的人已經站在你旁邊,總監來回的小碎步,正在和老闆解釋故障的情況。運營和開發正在一遍一遍

的催問,系統啥時候修復,電話被打爆了。研發的同學已經在你身後,看著你的操作。形勢看起來十萬火急。

叢集壞了原因分析:

(1)master節點能啟動,但是master節點的IP變化了,叢集還是根據舊的IP去連線節點,導致叢集不能自愈。

(2)master節點某種原因不能啟動,slave節點壞掉,有部分槽位slot丟失

(3)master節點因為網路原因不能連線,部分分片丟失,有部分槽位slot丟失

修復步驟:

step1 需要把dump.rdb或者appendonly.aof檔案複製出來,目的是先恢復redis節點資料, 如果資料能恢復,可能不需要fix修復命令,叢集就可能恢復。

step2 

連線任意一個叢集節點,cluster forget刪除掉有故障的節點。這個時候建議你用call命令,這個命令很好用,寫一條命令,可以在叢集所有節點執行。

redis-cli  --cluster call 192.168.8.101:6381   cluster  forget  <xxx_node_id>

查詢檢查叢集資訊一致。

redis-cli  --cluster call 192.168.8.101:6381   cluster  nodes 

【提示】如果你用redis-cli --cluster del-node命令刪除丟失的節點,命令執行失敗,錯誤提示為連線拒絕。


step3 

meet命令新增節點

redis-cli  --cluster call 192.168.8.101:6381   cluster meet  192.168.8.101 6384

查詢檢查叢集資訊是否一致。

redis-cli  --cluster call 192.168.8.101:6381   cluster  nodes 

redis-cli  --cluster check 192.168.8.101:6381

如果這個時候足夠幸運,cluster應該是恢復了。如果提示[ERR] Not all 16384 slots are covered by nodes.

接下來需要fix修復命令


在這個步驟你也可以使用命令add-node節點增加叢集節點

redis-cli --cluster add-node 192.168.8.102:6384 192.168.8.101:6381

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

>>> Send CLUSTER MEET to node 192.168.8.102:6384 to make it join the cluster.

[OK] New node added correctly.

執行命令成功。


【注意】如果提示[ERR] Not all 16384 slots are covered by nodes.表示add-node命令執行不成功。


step4  

fix修復節點命令

redis-cli --cluster  fix  192.168.8.101  6381

修復節點後發現,很多slots都分散在各個節點,slots不連續,如果你有強迫症的話,你肯定會把想不連續的slots放在一起。

對, 我也是這樣想的,於是我就用下面命令進行線上重分配。


【注意】fix修復命令,不僅可以自動刪除disconnected的節點,而且會遷移沒有分配的slots到正常節點,可以使叢集

狀態fail轉變為ok。我之所以手動先給叢集增加一個節點,手動刪除有故障節點,然後fix修復命令,fix是會遷移的slots,需

要代價的,fix完成後,還需要再平衡rebalance叢集。


step5 

再平衡rebalance叢集

redis-cli --cluster rebalance --cluster-use-empty-masters  --cluster-pipeline 1000 --cluster-simulate  192.168.8.101 6384

  rebalance      host:port # 指定叢集的任意一節點進行平衡叢集節點slot數量 

                 --cluster-weight <node1=w1...nodeN=wN> # 指定叢集節點的權重

                 --cluster-use-empty-masters # 設定可以讓沒有分配slot的主節點參與,預設不允許

                 --cluster-timeout <arg> # 設定migrate命令的超時時間

                 --cluster-simulate # 模擬rebalance操作,不會真正執行遷移操作

                 --cluster-pipeline <arg> # 定義cluster getkeysinslot命令一次取出的key數量,預設值為10

                 --cluster-threshold <arg> # 遷移的slot閾值超過threshold,執行rebalance操作

                 --cluster-replace # 是否直接replace到目標節點



step6

最後不忘記儲存配置  cluster saveconfig



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30393770/viewspace-2886078/,如需轉載,請註明出處,否則將追究法律責任。

相關文章