Redis哨兵模式主備切換時數據丟失問題


一、會產生數據丟失的場景

1、異步復制導致的數據丟失

  因為master--》slaver的復制是異步的,所以可能有部分數據還沒有復制到slave,master就宕機了,此時master中的數據和slaver中的數據不同步,即數據丟失;

2、腦裂導致數據丟失

  1、什么是腦裂?

    當某個master所在的機器突然脫離正常的網絡,不能與其他slaver機器鏈接,但實際上master還運行者,這時候哨兵會認為master宕機了,然后開啟選舉,將其他的slaver推舉為新的master。這時候集群  中就會出現兩個master,這中現象就是腦裂。

  2、腦裂引發的數據丟失的問題

    當一個slaver被推舉為新的master的時候,但此時客戶端還沒來得及切換到新的master,client仍然繼續向舊的master中傳輸數據,因此當舊的master恢復的時候,會在為一個新的slaver節點,並掛到新的  master上,自己的數據會被清空,重新從新的master復制數據;

二、解決方案

1、redis層面:通過配置控制同步事件

  •   redis.conf配置如下:
    min-slaves-to-write 1     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秒的數據

2、生產者層面:做降級限流

  降級:先將消息寫到本地的磁盤中或者放到臨時消息隊列中,每個10分鍾去本地磁盤或者隊列里取,來嘗試重新發給master;

  限流:在網關減慢請求涌入的速度;

摘抄自(https://www.cnblogs.com/mrmirror/p/13605507.html)感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM