轉自: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,將寫操作記錄保存到日誌中