說說Redis主從的腦裂行為,你看懂了嗎?
前言
大家好,我是田螺。
分享一道大廠面試真題:說說redis主從的腦裂?
我們可以按照這幾個維度來回答:
- 什么是腦裂行為
- 主從集群中為什么會發(fā)生腦裂?
- 腦裂為什么又會導(dǎo)致數(shù)據(jù)丟失呢?
- 我們該如何避免和應(yīng)對腦裂的發(fā)生呢?
1. 什么是腦裂
什么是腦裂行為?
- 腦裂(Split-Brain)是指在分布式系統(tǒng)中,網(wǎng)絡(luò)分區(qū)導(dǎo)致多個節(jié)點之間失去聯(lián)系,形成了兩個或多個獨立的“腦”,每個腦都認為自己是主節(jié)點,導(dǎo)致數(shù)據(jù)寫入的沖突和不一致。
圖片
- 在 Redis 的主從架構(gòu)中,如果主節(jié)點和從節(jié)點因網(wǎng)絡(luò)故障或其他原因失去聯(lián)系,哨兵開始選舉了新的主節(jié)點,而舊的主節(jié)點恢復(fù)過來繼續(xù)接受寫請求,也就是存在兩個redis主節(jié)點了,這就是redis的腦裂行為。
2. 主從集群中為什么會發(fā)生腦裂?
腦裂行為在Redis主從集群中可能發(fā)生的原因,主要包括以下幾點:
圖片
- 網(wǎng)絡(luò)故障:在網(wǎng)絡(luò)故障或不穩(wěn)定的情況下,主節(jié)點與哨兵或從節(jié)點之間的通信可能會中斷。這時,哨兵可能會誤認為主節(jié)點已宕機。
- 哨兵的選舉機制:當哨兵無法與主節(jié)點通信時,會啟動選舉過程,從現(xiàn)有的從節(jié)點中選出一個新的主節(jié)點。如果此時網(wǎng)絡(luò)恢復(fù),主節(jié)點仍在運行,就會導(dǎo)致出現(xiàn)兩個主節(jié)點。
- 假故障: 哨兵的故障轉(zhuǎn)移策略在網(wǎng)絡(luò)異常時會過于敏感,容易在錯誤的情況下進行主節(jié)點的選舉。也就是因為假故障導(dǎo)致又多選一個主節(jié)點出來。
3. 腦裂為什么又會導(dǎo)致數(shù)據(jù)丟失呢?
Redis的主從切換后,一旦從庫被提升為新的主庫,哨兵會指示原主庫去執(zhí)行主從復(fù)制命令,以便與新主庫進行全量同步數(shù)據(jù)。最后在全量同步的階段的話,原主庫需要清除本地數(shù)據(jù),加載來自新主庫的RDB文件(我們知道,redis主從同步是基于rdb文件的)。這就會導(dǎo)致在主從切換期間,原主庫接收的新寫數(shù)據(jù)會丟失啦。
還是上個簡單的圖,方便大家理解吧:
圖片
上圖,大家可以發(fā)現(xiàn):
- 當舊的主庫因為假死(假故障) 的原因,導(dǎo)致哨兵開始選舉新的主庫。在選舉新主庫期間,舊的主庫莫名奇妙又好了,它可以繼續(xù)接受寫入的請求了。
- 然后新主庫選好了,就有兩個主庫在同時處理寫請求啦。等到新主庫選好之后,舊的主庫就變成從庫了,它需要從新的主庫那里同步數(shù)據(jù)過來,這樣一來,在切換期間,舊主庫保存的數(shù)據(jù)就丟失啦。
4. 我們該如何避免/應(yīng)對腦裂的發(fā)生呢?
為了避免腦裂的發(fā)生,我們嘗試這些方法:
圖片
- 使用 Quorum 配置:確保哨兵數(shù)量為奇數(shù),并設(shè)定適當?shù)耐镀币?guī)則,以減少誤判的可能性。
- 合理設(shè)置超時參數(shù):調(diào)整哨兵的 down-after-milliseconds 和 failover-timeout 參數(shù),以適應(yīng)實際網(wǎng)絡(luò)環(huán)境,減少誤判。
- 網(wǎng)絡(luò)隔離與監(jiān)控:確保網(wǎng)絡(luò)穩(wěn)定,監(jiān)控網(wǎng)絡(luò)狀態(tài)和延遲,以便在問題出現(xiàn)時及時處理。
- 引入代理層:使用代理(如 Codis)來管理客戶端與 Redis 的連接,避免直接連接導(dǎo)致的腦裂。
還有個比較推薦的方式,那就是min-slaves-to-write 和 min-slaves-max-lag 這兩個參數(shù),可以有效減少 Redis 腦裂的風(fēng)險
- min-slaves-to-write:該參數(shù)設(shè)置在執(zhí)行寫操作時,至少需要有多少個從節(jié)點在線并且處于同步狀態(tài)。如果在線的從節(jié)點數(shù)量低于此值,主節(jié)點將拒絕寫入請求,從而避免在不一致的情況下進行寫操作。
- min-slaves-max-lag:這個參數(shù)定義了允許的最大復(fù)制延遲(以秒為單位)。如果從節(jié)點的復(fù)制延遲超過此閾值,主節(jié)點將不會考慮這些從節(jié)點為有效,從而減少因落后節(jié)點引起的數(shù)據(jù)不一致問題。