(十五)高併發redis學習筆記:淺談主從加哨兵模式下的數據丟失和腦裂問題

1、兩種數據丟失的情況

主備切換的過程,可能會導致數據丟失

1.1異步複製導致的數據丟失

master node到 slave node的複製是異步的,不能完全保證剛剛接受就寫到slave,所以可能有部分數據還沒複製到slave,還在內存中,master就宕機了,此時這些部分數據就丟失了,這個是不能避免的,我們把複製的閾值降低,只能減少損失。

1.2 腦裂導致的數據丟失

腦裂,一般是指在高可用系統中,兩個節點直接,心跳檢測不互通,本來是一個整體,分裂成爲兩個獨立的個體。而且他們互相認爲對方有問題,但是實際兩個都沒有問題,他們就會像腦裂一樣,兩個東西想控制一個大腦,可能會存在資源爭奪,影響兩個系統運行,也有可能兩個都在同時讀寫,數據會出錯。
一般應付腦裂問題,有可能得幾個原因:

  • 服務器之間的鏈路故障,無法通信。
  • 網卡或者驅動有問題,ip配置或者衝突等。
  • 防火牆把傳輸擋住了等等。

在redis中也就是,某個master所在機器突然脫離了正常的網絡,跟其他slave機器不能連接,但是實際上master還運行着,此時哨兵可能就會認爲master宕機了,然後開啓選舉,將其他slave切換成了master。這個時候,集羣裏就會有兩個master,也就是所謂的腦裂。

此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master,我們發現了這個腦裂問題之後,需要停掉一個master,選擇舊的master。

因此舊master再次恢復的時候,會被作爲一個slave掛到新的master上去,自己的數據會清空,重新從新的master複製數據,那這段時間寫到舊的master的數據就相當於丟失了。

2、解決異步複製和腦裂導致的數據丟失

老版本的參數:

min-slaves-to-write 1
min-slaves-max-lag 10

新版本的參數:

min-replicas-to-write 3 
min-replicas-max-lag 10

意思是,要求至少有1個slave,數據複製和同步的延遲不能超過10秒,如果說一旦所有的slave,數據複製和同步的延遲都超過了10秒鐘,那麼這個時候,master就不會再接收任何請求了,這時候集羣就是有問題的了。客戶端當然也應該對redis拒絕寫入的情景,做服務降級。
上面兩個配置可以減少異步複製和腦裂導致的數據丟失。

  • (1)減少異步複製的數據丟失
    有了min-slaves-max-lag這個配置,就可以確保說,一旦slave複製數據和ack延時太長,就認爲可能master宕機後損失的數據太多了,那麼就拒絕寫請求,這樣可以把master宕機時由於部分數據未同步到slave導致的數據丟失降低的可控範圍內。

  • (2)減少腦裂的數據丟失
    如果一個master出現了腦裂,跟其他slave丟了連接,那麼上面兩個配置可以確保說,如果不能繼續給指定數量的slave發送數據,而且slave超過10秒沒有給自己ack消息,那麼就直接拒絕客戶端的寫請求。這樣腦裂後的舊master就不會接受client的新數據,也就避免了數據丟失。

上面的配置就確保了,如果跟任何一個slave丟了連接,在10秒後發現沒有slave給自己ack,那麼就拒絕新的寫請求,因此在腦裂場景下,最多就丟失10秒的數據。

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