redis - 哨兵(高可用)中提過,Sentinel並不保證數據的零丟失,可是他也提供了能讓數據最小丟失的方法。
第一個數據丟失的場景,以下圖,數據丟失的時候,是因爲redis的複製是異步的,也就是說他是ap模型的,ap模擬相對於cp模型來講,性能是更好的,可是數據的一致性就沒辦法保證了。因此客戶端在master寫入數據後就正確返回,master再異步把數據同步給slave。
第二個數據丟失的場景,以下圖,出現了腦裂,雖然master是正常的,可是Sentinel集羣卻沒法和他通訊,此時就會認爲master宕機了而作故障轉移,可是通知客戶端以前,客戶端仍是會一直寫入數據到舊master,而舊master在網絡處理後,重啓鏈接到新master,會刪除舊的數據,致使這部分的數據丟失。
redis提供瞭如下兩個配置來最大程度的減小數據丟失:redis
min-replicas-to-write 1 min-replicas-max-lag 10
這個意思是至少有1個slave已經有10秒沒有同步,則master暫停接收請求。因此不會說master一直寫入數據,而slave沒有同步,若是發生以上兩個場景,最多丟失10秒的數據。從另一方面說,10秒後下降了可用性,提升了數據的一致性,從ap模型暫時的變成了cp模型。segmentfault