Redis Cluster FlushAll失敗

轉自:http://longlongblog.cn/2017/11/01/58/

問題背景

Flush是一個極少用到的操作,不過既然碰到過詭異的現象,也記錄在此。

問題場景是在Reids Cluster中使用主從模式,向主節點發送flush命令,預期主從節點都會清空數據庫。但是詭異的現象出現了,我們得到的結果是主從節點發生了切換,並且數據並沒有被清空。

問題分析

分析以上case,Redis採用單線程模型,flush操作執行的時候會阻塞所有其它操作,包括集羣間心跳包。當Redis中有大量數據的時候,flush操作會消耗較長時間。所以該節點較長時間不能跟集羣通信,當達到一定閾值的時候,集羣會判定該節點爲fail,並且會切換主從狀態。

Redis採用異步的方式進行主從同步,flush操作在主節點執行完成之後,纔會將命令同步到從節點。此時老的從節點變爲了主節點,它不會再接受來自老的主節點的刪除數據的操作。

當老的主節點flush完成的時候,它恢復與集羣中其它節點的通訊,得知自己被變成了從節點,所又會把數據同步過來。最終造成了主從節點發生了切換,並且數據沒有被清空的現象。

解決方案

解決方式:臨時調大集羣中所有節點的cluster-node-timeout參數

port 7000  //7000-7005
cluster-enabled yes   //開啓集羣
cluster-config-file nodes.conf  //保存節點配置,自動創建,自動更新
cluster-node-timeout 5000    //集羣超時時間,節點超過這個時間沒反應就斷定是宕機
appendonly yes   //存儲方式,aof,將寫操作記錄保存到日誌中

 

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