Redis數據若是丟失應該如何處理?

點擊上方☝亂敲代碼 輕鬆關注!
web

及時獲取有趣有料的技術文章

1. 兩種數據丟失的狀況

主備切換的過程,可能致使數據丟失;redis

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

上面這兩個配置能夠減小異步複製和腦裂致使的數據丟失app

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秒的數據。編輯器



本文分享自微信公衆號 - 亂敲代碼(lqcoder)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。flex

相關文章
相關標籤/搜索