一、數據丟失的情況
異步復制同步丟失
集群產生腦裂數據丟失
1.異步復制丟失
對於Redis主節點與從節點之間的數據復制,是異步復制的,當客戶端發送寫請求給master節點的時候,客戶端會返回OK,然后同步到各個slave節點中。
如果此時master還沒來得及同步給slave節點時發生宕機,那么master內存中的數據會丟失;
要是master中開啟持久化設置數據可不可以保證不丟失呢?答案是否定的。在master 發生宕機后,sentinel集群檢測到master發生故障,重新選舉新的master,如果舊的master在故障恢復后重啟,那么此時它需要同步新master的數據,此時新的master的數據是空的(假設這段時間中沒有數據寫入)。那么舊master中的數據就會被刷新掉,此時數據還是會丟失。
2.集群產生腦裂
首先我們需要理解集群的腦裂現象,這就好比一個人有兩個大腦,那么到底受誰來控制呢?在分布式集群中,分布式協作框架zookeeper很好的解決了這個問題,通過控制半數以上的機器來解決。
那么在Redis中,集群腦裂產生數據丟失的現象是怎么樣的呢?
假設我們有一個redis集群,正常情況下client會向master發送請求,然后同步到salve,sentinel集群監控着集群,在集群發生故障時進行自動故障轉移。
此時,由於某種原因,比如網絡原因,集群出現了分區,master與slave節點之間斷開了聯系,sentinel監控到一段時間沒有聯系認為master故障,然后重新選舉,將slave切換為新的master。但是master可能並沒有發生故障,只是網絡產生分區,此時client任然在舊的master上寫數據,而新的master中沒有數據,如果不及時發現問題進行處理可能舊的master中堆積大量數據。在發現問題之后,舊的master降為slave同步新的master數據,那么之前的數據被刷新掉,大量數據丟失。