redis資料丟失你怎麼處理?

solution發表於2021-09-09

1. 兩種資料丟失的情況

主備切換的過程,可能導致資料丟失;

1.1. 非同步複製導致的資料丟

圖片描述

因為master -> slave的複製是非同步的,所以可能有部分資料還沒複製到slave,master就當機了,此時這些部分資料就丟失了

1.2 腦裂導致的資料丟失

圖片描述

腦裂就是說,某個maser 所在機器突然脫離了正常的網路,跟其他slave機器不能連線,但是實際上master還執行著,此時哨兵可能就會認為master 當機了,然後開啟選舉,將其他slave切換成了master,這個時候,叢集裡面就會有2個master,也就是所謂的腦裂,此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的資料可能也丟失了,因此master再次恢復的時候,會被作為一個slave掛到新的master 上去,自己的資料將會清空,重新從新的master 複製資料

2. 解決非同步複製和腦裂資料導致的資料丟失

   # redis.conf 配置
   Min-slaves-to-write 1 
   Min-slaves-max-lag 10

上面這兩個配置可以減少非同步複製和腦裂導致的資料丟失

###2.1 減少非同步複製的資料丟失

有了min-slaves-max-lag這個配置,可以確保說,一旦slave複製資料和ack延遲太長,就認為可能master 當機後損失的資料太多了,那麼就拒絕寫請求,這樣可以吧master當機時由於部分資料丟失。

2.2 減少腦裂的資料丟失

如果一個master出現了腦裂,跟其他slave丟了連線,那麼上面這兩個配置可以去確保說,如果不能繼續給指定數量的slave傳送資料,而且slave超過10秒沒有給自己ack訊息,那麼就直接拒絕客戶端的寫請求,這樣腦裂活的舊master就不會接受client的新資料,也就避免了資料丟失,上面配置確保了,如果跟任何一個slave丟了連線,在10秒後發現沒有slave給自己ack,那麼就拒絕新的寫請求,因此腦裂場景下,最多丟失10秒的資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2825789/,如需轉載,請註明出處,否則將追究法律責任。

相關文章