天天看點

Redis哨兵主備切換的資料丢失問題資料丢失的場景資料丢失的解決方案

資料丢失的場景

主備切換的過程,可能會導緻資料丢失

  • 異步複制

    由于

    M => R

    的複制是異步的,是以可能有部分資料還沒複制到R,M就當機,于是這些資料就丢失了
  • 腦裂

    某M所在節點突然脫離正常的網絡,無法和其他slave機器連接配接,但實際上master還運作着

此時哨兵可能就會認為M當機了,然後開啟選舉,将其他S切換成M。這時,叢集裡就會有兩個M-腦裂

此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的資料可能也丢失了

是以舊master再次恢複時,會被作為一個slave挂到新的master上去,自己的資料會被清空,重新從新的master複制資料

Redis哨兵主備切換的資料丢失問題資料丢失的場景資料丢失的解決方案

資料丢失的解決方案

如下配置可以減少異步複制和腦裂導緻的資料丢失

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

配置要求至少有1個slave,資料複制和同步的延遲不能超過10秒

一旦所有的slave,資料複制和同步的延遲都超過了10秒鐘,master就不再接收任何請求!

2.1 異步複制資料丢失解決方案

min-slaves-max-lag

 配置

即可確定,一旦slave複制資料和ack延時過長,就認為可能master當機後損失的資料太多了,那麼就拒絕寫請求

這樣就可把master當機時由于部分資料未同步到slave導緻的資料丢失降低在可控範圍

Redis哨兵主備切換的資料丢失問題資料丢失的場景資料丢失的解決方案

2.2 腦裂資料丢失解決方案

若一個master出現了腦裂,跟其他slave失去連接配接,那麼開始的兩個配置可以確定

若不能繼續給指定數量的slave發送資料,而且slave超過10秒沒有給自己ack消息,那麼就直接拒絕用戶端的寫請求

這樣腦裂後的舊master就不會接受client的新資料,也就避免了資料丢失

上面的配置就確定了,如果跟任何一個slave丢了連接配接,在10秒後發現沒有slave給自己ack,那麼就拒絕新的寫請求

是以在腦裂場景下,最多就丢失10秒的資料

Redis哨兵主備切換的資料丢失問題資料丢失的場景資料丢失的解決方案

繼續閱讀