1. 程式人生 > 其它 >四、針對redis容災切換導致"腦裂"的情況

四、針對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