中发生数据丢失_如何防止Redis脑裂导致数据丢失?
所謂的腦裂,就是指在主從集群中,同時有兩個主節(jié)點,它們都能接收寫請求。而腦裂最直接的影響,就是客戶端不知道應該往哪個主節(jié)點寫入數(shù)據(jù),結(jié)果就是不同的客戶端會往不同的主節(jié)點上寫入數(shù)據(jù)。而且,嚴重的話,腦裂會進一步導致數(shù)據(jù)丟失。
為什么會發(fā)生腦裂?
1.確認是不是數(shù)據(jù)同步出現(xiàn)了問題
在主從集群中發(fā)生數(shù)據(jù)丟失,最常見的原因就是主庫的數(shù)據(jù)還沒有同步到從庫,結(jié)果主庫發(fā)生了故障,等從庫升級為主庫后,未同步的數(shù)據(jù)就丟失了。如果是這種情況的數(shù)據(jù)丟失,我們可以通過比對主從庫上的復制進度差值來進行判斷,也就是計算 master_repl_offset 和 slave_repl_offset 的差值。如果從庫上的 slave_repl_offset 小于原主庫的 master_repl_offset,那么,我們就可以認定數(shù)據(jù)丟失是由數(shù)據(jù)同步未完成導致的。2.排查客戶端的操作日志,發(fā)現(xiàn)腦裂現(xiàn)象
在排查客戶端的操作日志時,我們發(fā)現(xiàn),在主從切換后的一段時間內(nèi),有一個客戶端仍然在和原主庫通信,并沒有和升級的新主庫進行交互。這就相當于主從集群中同時有了兩個主庫。根據(jù)這個跡象,我們就想到了在分布式主從集群發(fā)生故障時會出現(xiàn)的一個問題:腦裂。
但是,不同客戶端給兩個主庫發(fā)送數(shù)據(jù)寫操作,按道理來說,只會導致新數(shù)據(jù)會分布在不同的主庫上,并不會造成數(shù)據(jù)丟失。那么,為什么我們的數(shù)據(jù)仍然丟失了呢?
3.發(fā)現(xiàn)是原主庫假故障導致的腦裂
我們是采用哨兵機制進行主從切換的,當主從切換發(fā)生時,一定是有超過預設數(shù)量(quorum 配置項)的哨兵實例和主庫的心跳都超時了,才會把主庫判斷為客觀下線,然后,哨兵開始執(zhí)行切換操作。哨兵切換完成后,客戶端會和新主庫進行通信,發(fā)送請求操作。
但是,在切換過程中,既然客戶端仍然和原主庫通信,這就表明,原主庫并沒有真的發(fā)生故障(例如主庫進程掛掉)。
為什么腦裂會導致數(shù)據(jù)丟失?
主從切換后,從庫一旦升級為新主庫,哨兵就會讓原主庫執(zhí)行 slave of 命令,和新主庫重新進行全量同步。而在全量同步執(zhí)行的最后階段,原主庫需要清空本地的數(shù)據(jù),加載新主庫發(fā)送的 RDB 文件,這樣一來,原主庫在主從切換期間保存的新寫數(shù)據(jù)就丟失了。
如何應對腦裂問題?
Redis 已經(jīng)提供了兩個配置項來限制主庫的請求處理,分別是 min-slaves-to-write 和 min-slaves-max-lag。
- min-slaves-to-write:這個配置項設置了主庫能進行數(shù)據(jù)同步的最少從庫數(shù)量;
- min-slaves-max-lag:這個配置項設置了主從庫間進行數(shù)據(jù)復制時,從庫給主庫發(fā)送 ACK 消息的最大延遲(以秒為單位)。
我們可以把 min-slaves-to-write 和 min-slaves-max-lag 這兩個配置項搭配起來使用,分別給它們設置一定的閾值,假設為 N 和 T。這兩個配置項組合后的要求是,主庫連接的從庫中至少有 N 個從庫,和主庫進行數(shù)據(jù)復制時的 ACK 消息延遲不能超過 T 秒,否則,主庫就不會再接收客戶端的請求了。
即使原主庫是假故障,它在假故障期間也無法響應哨兵心跳,也不能和從庫進行同步,自然也就無法和從庫進行 ACK 確認了。這樣一來,min-slaves-to-write 和 min-slaves-max-lag 的組合要求就無法得到滿足,原主庫就會被限制接收客戶端請求,客戶端也就不能在原主庫中寫入新數(shù)據(jù)了。
往期推薦
一個幾乎每個系統(tǒng)必踩的坑兒:訪問數(shù)據(jù)庫超時
設計模式行為型:觀察者模式(ObserverPattern)
API和SDK有什么區(qū)別?
雪花算法的實現(xiàn)思想
設計模式行為型:中介模式(MediatorPattern)
網(wǎng)絡資源加載很慢?CDN加速服務了解一下!
如何保證核心鏈路穩(wěn)定性的流控和熔斷機制?
總結(jié)
以上是生活随笔為你收集整理的中发生数据丢失_如何防止Redis脑裂导致数据丢失?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京人艺院长、著名导演任鸣去世 其话剧《
- 下一篇: mysql题目_MySQL练习题