【Redis主從架構】Redis哨兵主備切換時數據丟失問題:異步複製,集羣腦裂

9. 【Redis主從架構】Redis哨兵主備切換時數據丟失問題:異步複製,集羣腦裂

  1. redis哨兵主備切換兩種數據丟失的情況
  2. 解決異步複製和腦裂導致的數據丟失

1. 兩種導致數據丟失的情況

1.1 異步複製導致數據丟失

因爲 master -> slave的複製都是異步的,所以有可能出現master內存中的部分數據來不及複製到slave上master就宕機了,隨後通過哨兵執行主備切換,導致這部分數據丟失

1

1.2 腦裂導致的數據丟失

  • 腦裂

腦裂:某個master所在的機器突然脫離了正常的網絡,跟其他slave節點不能連接。但實際上master是正常運行的。但哨兵就有可能認爲master宕機了,然後開始從剩下的哨兵中選舉出一個哨兵執行故障轉移,將salve切換成master

此時集羣中就會出現兩個master,也就是所謂的腦裂,此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續往舊的master中寫數據。因此舊的master再次恢復的時候,會被作爲一個slave掛到新的master上去,自己的數據就會被清空,重新從master上面複製數據,導致後面那部分往舊master寫入的數據就丟失了。

2

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導致的數據丟失降低到可控範圍

3

  • (2)減少腦裂的數據丟失

如果一個master出現了腦裂,即master跟其他slave丟失了連接,那麼上面兩個配置就可以確保說,不能給指定數量的slave發送數據,且slave超過10s沒有給masterack消息,那麼就直接拒絕客戶端的寫請求

這樣腦裂後的舊master就不會接收client的寫請求,也就避免了數據丟失

上面的配置確保了,如果個任何一個salve丟失了連接,master在10s內沒有接收到slave的ack響應,那麼就會拒絕新的寫請求。因此在腦裂場景下,最多就丟失了10秒的數據

4

參考 石衫老師 《億級流量教程》課程筆記

親,覺得對你有用的話,點個讚唄!!!

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