網上參考到別人博客說,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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/472857.html
標籤:Java
下一篇:Mybatis快速上手
