資料丢失的場景
主備切換的過程,可能會導緻資料丢失
-
異步複制
由于
的複制是異步的,是以可能有部分資料還沒複制到R,M就當機,于是這些資料就丢失了M => R
-
腦裂
某M所在節點突然脫離正常的網絡,無法和其他slave機器連接配接,但實際上master還運作着
此時哨兵可能就會認為M當機了,然後開啟選舉,将其他S切換成M。這時,叢集裡就會有兩個M-腦裂
此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的資料可能也丢失了
是以舊master再次恢複時,會被作為一個slave挂到新的master上去,自己的資料會被清空,重新從新的master複制資料

資料丢失的解決方案
如下配置可以減少異步複制和腦裂導緻的資料丢失
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導緻的資料丢失降低在可控範圍
2.2 腦裂資料丢失解決方案
若一個master出現了腦裂,跟其他slave失去連接配接,那麼開始的兩個配置可以確定
若不能繼續給指定數量的slave發送資料,而且slave超過10秒沒有給自己ack消息,那麼就直接拒絕用戶端的寫請求
這樣腦裂後的舊master就不會接受client的新資料,也就避免了資料丢失
上面的配置就確定了,如果跟任何一個slave丢了連接配接,在10秒後發現沒有slave給自己ack,那麼就拒絕新的寫請求
是以在腦裂場景下,最多就丢失10秒的資料