Redis 高可用與集群原理深度解析
Redis 高可用與集群原理
1. 前言
Redis 單機(jī)雖然高性能,但一旦節(jié)點(diǎn)宕機(jī),數(shù)據(jù)丟失或服務(wù)不可用問題會(huì)非常嚴(yán)重。為了解決這一問題,Redis 提供了主從復(fù)制、哨兵(Sentinel)、Cluster 集群 等高可用機(jī)制。
這一篇文章我們重點(diǎn)拆解:
- Sentinel 哨兵機(jī)制:如何發(fā)現(xiàn)故障、如何自動(dòng)主從切換。
- Cluster 集群架構(gòu):如何實(shí)現(xiàn)分片存儲(chǔ)與高可用。
- Gossip 協(xié)議:節(jié)點(diǎn)間如何通信。
- 故障轉(zhuǎn)移源碼剖析:Redis 內(nèi)部實(shí)現(xiàn)流程。
2. Redis 高可用架構(gòu)演進(jìn)
- 主從復(fù)制(Replication)
- 提供讀寫分離,但主節(jié)點(diǎn)宕機(jī)會(huì)導(dǎo)致服務(wù)中斷,需要人工干預(yù)。
- 哨兵(Sentinel)
- 自動(dòng)監(jiān)控主節(jié)點(diǎn)健康,支持 自動(dòng)故障轉(zhuǎn)移。
- Cluster 集群
- 支持 數(shù)據(jù)分片(水平擴(kuò)展),并內(nèi)置高可用。
?? 可以理解為:
復(fù)制 = 數(shù)據(jù)冗余
Sentinel = 自動(dòng)運(yùn)維
Cluster = 擴(kuò)展能力 + 內(nèi)置高可用
3. Sentinel 哨兵機(jī)制
3.1 Sentinel 的作用
- 監(jiān)控(Monitoring):周期性檢測(cè) Master 和 Slave 是否可達(dá)。
- 通知(Notification):當(dāng)節(jié)點(diǎn)異常時(shí),向客戶端/其他哨兵發(fā)送通知。
- 故障轉(zhuǎn)移(Failover):自動(dòng)將一個(gè) Slave 提升為新的 Master,并讓其他 Slave 復(fù)制它。
3.2 故障檢測(cè)機(jī)制
- 主觀下線(SDOWN):某個(gè) Sentinel 認(rèn)為 Master 不可達(dá)。
- 客觀下線(ODOWN):多數(shù) Sentinel 達(dá)成共識(shí),確認(rèn) Master 宕機(jī)。
3.3 Leader 選舉
在多個(gè) Sentinel 中,需要選出一個(gè) Leader 來執(zhí)行故障轉(zhuǎn)移,算法基于 Raft 的選舉思想:
- 每個(gè) Sentinel 給候選者投票。
- 超過半數(shù)票數(shù)的 Sentinel 當(dāng)選 Leader。
3.4 源碼剖析(sentinel.c)
哨兵檢測(cè)主觀下線:
// sentinel.c
if (mst->flags & SRI_MASTER) {
if ((mst->flags & SRI_S_DOWN) == 0 && mst->link->disconnected) {
mst->flags |= SRI_S_DOWN; // 標(biāo)記主觀下線
sentinelEvent(LL_WARNING, "+sdown", mst, "%@");
}
}這段代碼表明,當(dāng)哨兵發(fā)現(xiàn)主節(jié)點(diǎn)無法連接時(shí),會(huì)標(biāo)記為 S_DOWN。
4. Redis Cluster 集群架構(gòu)
4.1 核心特性
- 分布式存儲(chǔ):采用 16384 個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。
- 高可用:每個(gè)分片至少有 1 個(gè) Master 和若干 Slave。
- 自動(dòng)故障轉(zhuǎn)移:某個(gè) Master 掛掉時(shí),其 Slave 自動(dòng)升級(jí)為新的 Master。
4.2 集群拓?fù)?/h4>
┌───────────┐
│ Client │
└─────┬─────┘
│
┌─────────────▼─────────────┐
│ Cluster │
│ ┌────────┐ ┌────────┐ │
│ │ Master │ │ Master │ │ ...
│ │ Slot 0 │ │ Slot 5461 │
│ └───▲────┘ └────▲───┘ │
│ │ │ │
│ ┌─┴─┐ ┌─┴─┐ │
│ │Slave│ │Slave│ │
│ └─────┘ └─────┘ │
└────────────────────────────┘
┌───────────┐
│ Client │
└─────┬─────┘
│
┌─────────────▼─────────────┐
│ Cluster │
│ ┌────────┐ ┌────────┐ │
│ │ Master │ │ Master │ │ ...
│ │ Slot 0 │ │ Slot 5461 │
│ └───▲────┘ └────▲───┘ │
│ │ │ │
│ ┌─┴─┐ ┌─┴─┐ │
│ │Slave│ │Slave│ │
│ └─────┘ └─────┘ │
└────────────────────────────┘4.3 請(qǐng)求路由
- Client 向某個(gè)節(jié)點(diǎn)發(fā)起請(qǐng)求。
- 如果 Key 不在本節(jié)點(diǎn)的槽位范圍,返回
MOVED重定向。 - 客戶端更新槽位映射表,下次直連正確節(jié)點(diǎn)。
5. Gossip 協(xié)議
Redis Cluster 中節(jié)點(diǎn)通信依賴 Gossip 協(xié)議,類似于 流言傳播:
- 每個(gè)節(jié)點(diǎn)周期性地向隨機(jī)節(jié)點(diǎn)發(fā)送 PING。
- 接收節(jié)點(diǎn)返回 PONG,附帶自己已知的集群信息。
- 這樣集群拓?fù)湫畔⒅饾u在所有節(jié)點(diǎn)中收斂。
消息類型:
- MEET:新節(jié)點(diǎn)加入。
- PING/PONG:心跳檢測(cè)與狀態(tài)同步。
- FAIL:節(jié)點(diǎn)失效信息。
?? Gossip 的特點(diǎn)是 去中心化、最終一致性。
6. 故障轉(zhuǎn)移源碼剖析
當(dāng) Master 宕機(jī)時(shí),Cluster 的轉(zhuǎn)移邏輯如下:
- 檢測(cè)故障
// cluster.c
if (node->flags & (CLUSTER_NODE_FAIL | CLUSTER_NODE_PFAIL)) {
// 標(biāo)記為下線
}- Slave 競(jìng)選新 Master
- 每個(gè) Slave 會(huì)嘗試升級(jí)為 Master。
- 使用投票機(jī)制,獲得過半節(jié)點(diǎn)支持的 Slave 升級(jí)。
- 重新分配槽位
// cluster.c clusterFailoverReplaceYourMaster();
執(zhí)行槽位遷移,客戶端可繼續(xù)訪問。
- 客戶端感知
- 客戶端收到
MOVED/ASK,刷新槽位映射。
7. 總結(jié)
本文深入分析了 Redis 高可用與集群原理:
- Sentinel:實(shí)現(xiàn)了自動(dòng)故障轉(zhuǎn)移,基于 SDOWN/ODOWN 和選舉機(jī)制。
- Cluster:通過哈希槽實(shí)現(xiàn)數(shù)據(jù)分片和自動(dòng)轉(zhuǎn)移。
- Gossip 協(xié)議:支撐集群中節(jié)點(diǎn)間的通信和狀態(tài)同步。
- 源碼剖析:揭示了 Redis 在
sentinel.c、cluster.c中的故障轉(zhuǎn)移實(shí)現(xiàn)。
?? 下一步可以寫 Redis 持久化(RDB/AOF)與復(fù)制原理,這樣整個(gè)高可用 + 數(shù)據(jù)可靠性體系就完整了。
到此這篇關(guān)于Redis 高可用與集群原理深度解析的文章就介紹到這了,更多相關(guān)Redis 高可用集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問題排查解決
這篇文章主要為大家介紹了生產(chǎn)redisson延時(shí)隊(duì)列不消費(fèi)問題排查解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猂edis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
解決linux下redis數(shù)據(jù)庫(kù)overcommit_memory問題
這篇文章介紹了解決linux下redis數(shù)據(jù)庫(kù)overcommit_memory問題的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
redis+lua實(shí)現(xiàn)限流的項(xiàng)目實(shí)踐
redis有很多限流的算法(比如:令牌桶,計(jì)數(shù)器,時(shí)間窗口)等,在分布式里面進(jìn)行限流的話,我們則可以使用redis+lua腳本進(jìn)行限流,下面就來介紹一下redis+lua實(shí)現(xiàn)限流2023-10-10
解決 Redis 數(shù)據(jù)傾斜、熱點(diǎn)等問題
?單臺(tái)機(jī)器的硬件配置有上限制約,一般我們會(huì)采用分布式架構(gòu)將多臺(tái)機(jī)器組成一個(gè)集群,這篇文章主要介紹了解決 Redis 數(shù)據(jù)傾斜、熱點(diǎn)等問題,需要的朋友可以參考下2022-12-12

