四、針對redis容災切換導致"腦裂"的情況
網上參考到別人部落格說,redis容災切換的時候,有機率出現腦裂的情況。
什麼是腦裂:
sentinel判斷master宕機,切換slave為新master的過程中,業務資料還在持續往原master寫入資料,因為此時新master還是slave,沒有寫入許可權,就會出現數丟失的情況。
解決方案:
看了很多文章,都是說對redis的配置新增兩個設定。
1 min-slaves-to-write 1 2 min-slaves-max-lag 10
引數解釋:
要求至少有1個slave,資料複製和同步延遲不能超過10秒
如果說一旦所有的slave,資料複製和同步的延遲都超過了10秒鐘,那麼master就會拒絕接收任何請求。
作用:
減少非同步複製的資料丟失
配置min-slaves-max-lag為10s後,根據目前master->slave的複製速度,如果資料同步完成所需要時間超過10s,就會認為master未來宕機後損失的資料會很多,master就拒絕寫入新請求。
這樣就能將master和slave資料差控制在10s內,即使master宕機也只是這未複製的10s資料。
減少腦裂的資料丟失:
如果不能繼續給指定數量的slave傳送資料,而且slave超過10秒沒有給自己ack訊息,那麼就直接拒絕寫入新請求。這樣腦裂後的舊master就不會接受client的新資料,也就避免了資料丟失。
因此在腦裂場景下,最多就丟失10秒的資料
但以上配置,還是會有資料丟失的情況,如果業務資料是會重複上送的倒還好,但是一旦資料是狀態發生變更才推送一次的情況,就會對業務資料準確性有出入。而且上面的配置,因為我在這邊自身業務資料有可能還沒達到一定量,目前沒復現,所以在這裡,也請教下各位看官大大,是否還有其他更好的優化方案?歡迎各位看官大大來指定迷津~~~~
借鑑的文章參考:https://blog.csdn.net/wdehxiang/article/details/108342501