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 來(lái)執(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)無(wú)法連接時(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)文章
全網(wǎng)最完整的Redis新手入門指導(dǎo)教程
這篇文章主要給大家介紹了Redis新手入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2進(jìn)行日志記錄的過程分享
這篇文章主要介紹了Linux服務(wù)器使用Redis作為數(shù)據(jù)緩存并用log4j2日志記錄,關(guān)于SpringBoot項(xiàng)目配置Redis與log4j2是查詢官方文檔,本文中的Redis配置類、Redis工具類以及l(fā)og4j2.xml配置文件來(lái)自網(wǎng)絡(luò),查證源自何處比較麻煩,所以在此感謝所有人的分享2023-09-09
Redis數(shù)據(jù)庫(kù)的安裝和配置教程詳解
這篇文章主要介紹了Redis數(shù)據(jù)庫(kù)的安裝和配置?,主要包括Linux環(huán)境安裝Redis和windows環(huán)境安裝Redis,redis客戶端安裝方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
RedisDesktopManager遠(yuǎn)程連接redis的實(shí)現(xiàn)
本文主要介紹了RedisDesktopManager遠(yuǎn)程連接redis的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
完美解決linux上啟動(dòng)redis后配置文件未生效的問題
今天小編就為大家分享一篇完美解決linux上啟動(dòng)redis后配置文件未生效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-05-05
springboot中redis并發(fā)鎖的等待時(shí)間設(shè)置長(zhǎng)短的方法
在SpringBoot應(yīng)用中,Redis鎖的等待時(shí)間設(shè)置不當(dāng)可能導(dǎo)致資源浪費(fèi)、響應(yīng)時(shí)間增加、死鎖風(fēng)險(xiǎn)升高、系統(tǒng)負(fù)載增加、業(yè)務(wù)邏輯延遲以及故障恢復(fù)慢等問題,建議合理設(shè)置等待時(shí)間,并考慮使用其他分布式鎖實(shí)現(xiàn)方式提高性能2024-10-10

