1 數據丟失的兩個場景
主備切換的過程,可能會導致數據丟失
1.1 異步復制
由于 master => slave的復制是異步的,所以可能有部分數據還沒復制到slave,master就宕機,于是這些數據就丟失了
1.2 腦裂導致
腦裂,也就是說,某個master所在節點突然脫離正常的網絡,無法和其他slave機器連接,但實際上master還運行著
此時哨兵可能就會認為master宕機了,然后開啟選舉,將其他slave切換成了master
這個時候,集群里就會有兩個master,也就是所謂的腦裂
此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的數據可能也丟失了
因此舊master再次恢復時,會被作為一個slave掛到新的master上去,自己的數據會被清空,重新從新的master復制數據
2 數據丟失的解決方案
如下配置可以減少異步復制和腦裂導致的數據丟失
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秒的數據
參考
《Java工程師面試突擊第1季-中華石杉老師》
歡迎關注全是硬核干貨的公眾號:JavaEdge