一、會產生數據丟失的場景
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)感謝!