9. 【Redis主從架構】Redis哨兵主備切換時數據丟失問題:異步複製,集羣腦裂
- redis哨兵主備切換兩種數據丟失的情況
- 解決異步複製和腦裂導致的數據丟失
1. 兩種導致數據丟失的情況
1.1 異步複製導致數據丟失
因爲 master -> slave的複製都是異步的,所以有可能出現master內存中的部分數據來不及複製到slave上,master就宕機了,隨後通過哨兵執行主備切換,導致這部分數據丟失。
1.2 腦裂導致的數據丟失
- 腦裂
腦裂:某個master所在的機器突然脫離了正常的網絡,跟其他slave節點不能連接。但實際上master是正常運行的。但哨兵就有可能認爲master宕機了,然後開始從剩下的哨兵中選舉出一個哨兵執行故障轉移,將salve切換成master。
此時集羣中就會出現兩個master,也就是所謂的腦裂,此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續往舊的master中寫數據。因此舊的master再次恢復的時候,會被作爲一個slave掛到新的master上去,自己的數據就會被清空,重新從master上面複製數據,導致後面那部分往舊master寫入的數據就丟失了。
2. 解決數據丟失的問題
2.1 解決異步數據複製導致數據丟失的問題
# 要求至少一個salve,完成數據同步,才認爲數據寫入成功
min-slaves-to-write 1
# 配置複製和不同延遲不能超過10秒
min-slaves-max-lag 10
如果說一旦所有的slave,數據複製和同步延遲都超過了10秒,master就不會接受任何請求了。
上面兩個配置可以減少異步複製和腦裂導致的數據丟失問題。
- (1) 減少異步複製的數據丟失
添加了 min-slaves-max-lag 配置之後,就可以確保,一旦slave複製數據和ack延時太長,就認爲可能master宕機後損失的數據過多,那麼就拒絕寫請求,這樣就可以把master宕機時由於部分數據未同步到slave導致的數據丟失降低到可控範圍。
- (2)減少腦裂的數據丟失
如果一個master出現了腦裂,即master跟其他slave丟失了連接,那麼上面兩個配置就可以確保說,不能給指定數量的slave發送數據,且slave超過10s沒有給masterack消息,那麼就直接拒絕客戶端的寫請求。
這樣腦裂後的舊master就不會接收client的寫請求,也就避免了數據丟失。
上面的配置確保了,如果個任何一個salve丟失了連接,master在10s內沒有接收到slave的ack響應,那麼就會拒絕新的寫請求。因此在腦裂場景下,最多就丟失了10秒的數據。
參考 石衫老師 《億級流量教程》課程筆記
親,覺得對你有用的話,點個讚唄!!!