Redis哨兵模式與主從架構(gòu)對(duì)比分析
Redis 哨兵模式(Sentinel)與主從架構(gòu)是一脈相承的分布式方案,哨兵模式是在主從架構(gòu)基礎(chǔ)上的增強(qiáng),兩者的核心差異體現(xiàn)在高可用能力、架構(gòu)復(fù)雜度和適用場(chǎng)景上。
具體比較情況如下:
一、核心架構(gòu)與組件
| 維度 | 主從架構(gòu) | 哨兵模式 |
|---|---|---|
| 核心組件 | 主庫(kù)(Master)+ 從庫(kù)(Slave) | 主庫(kù) + 從庫(kù) + 哨兵節(jié)點(diǎn)(Sentinel) |
| 節(jié)點(diǎn)功能 | 主庫(kù)負(fù)責(zé)讀寫(xiě),從庫(kù)僅同步數(shù)據(jù)并提供讀服務(wù) | 主從節(jié)點(diǎn)功能同上;哨兵節(jié)點(diǎn)不存數(shù)據(jù),僅負(fù)責(zé)監(jiān)控、決策和通知 |
| 最小部署 | 2 節(jié)點(diǎn)(1 主 1 從) | 5 節(jié)點(diǎn)(1 主 1 從 + 3 哨兵,3 個(gè)哨兵保證高可用) |
二、核心能力對(duì)比
1. 數(shù)據(jù)同步與存儲(chǔ)
- 兩者一致:均基于 “主從復(fù)制” 機(jī)制,從庫(kù)異步同步主庫(kù)數(shù)據(jù),所有節(jié)點(diǎn)存儲(chǔ)完整數(shù)據(jù)集(無(wú)分片)。
- 一致性特點(diǎn):默認(rèn)存在主從數(shù)據(jù)延遲(主庫(kù)寫(xiě)成功后立即返回,數(shù)據(jù)異步同步到從庫(kù)),極端情況下主庫(kù)宕機(jī)可能丟失未同步數(shù)據(jù)。
2. 高可用機(jī)制(核心差異)
| 能力 | 主從架構(gòu) | 哨兵模式 |
|---|---|---|
| 故障檢測(cè) | 無(wú)原生機(jī)制,需人工或外部工具監(jiān)控 | 哨兵節(jié)點(diǎn)通過(guò)PING定期檢測(cè)所有節(jié)點(diǎn),自動(dòng)識(shí)別故障 |
| 主庫(kù)故障恢復(fù) | 需手動(dòng)操作: 1. 選一個(gè)從庫(kù)執(zhí)行SLAVEOF NO ONE升級(jí)為主庫(kù) 2. 其他從庫(kù)重新配置主庫(kù)地址 3. 通知客戶端更新連接 | 全自動(dòng)切換: 1. 哨兵協(xié)商確認(rèn)主庫(kù)故障(客觀下線) 2. 從從庫(kù)中選舉新主庫(kù) 3. 自動(dòng)配置其他從庫(kù)同步新主庫(kù) 4. 通知客戶端新主庫(kù)地址 |
| 恢復(fù)時(shí)間 | 分鐘級(jí)甚至更長(zhǎng)(依賴人工響應(yīng)速度) | 秒級(jí)(通常 10-30 秒,取決于配置) |
| 容錯(cuò)能力 | 主庫(kù)故障后寫(xiě)服務(wù)完全不可用,直到人工恢復(fù) | 主庫(kù)故障后,哨兵自動(dòng)完成切換,寫(xiě)服務(wù)短暫中斷后恢復(fù) |
3. 讀寫(xiě)與擴(kuò)展能力
兩者一致:
- 寫(xiě)請(qǐng)求僅由主庫(kù)處理,寫(xiě)性能受限于單機(jī)配置(無(wú)法通過(guò)加節(jié)點(diǎn)擴(kuò)展)。
- 讀請(qǐng)求可分流到從庫(kù),讀性能可通過(guò)增加從庫(kù)擴(kuò)展。
- 存儲(chǔ)能力受限于單機(jī)內(nèi)存(所有節(jié)點(diǎn)存全量數(shù)據(jù),無(wú)法分片)。
4. 客戶端接入
- 主從架構(gòu):客戶端需硬編碼主庫(kù)地址,主庫(kù)故障后需手動(dòng)修改客戶端配置。
- 哨兵模式:客戶端連接哨兵集群(而非直接連接主庫(kù)),哨兵會(huì)自動(dòng)告知客戶端當(dāng)前主庫(kù)地址,無(wú)需手動(dòng)修改。
三、優(yōu)勢(shì)與局限
| 架構(gòu) | 優(yōu)勢(shì) | 局限 |
|---|---|---|
| 主從架構(gòu) | 部署簡(jiǎn)單(僅需配置主從關(guān)系) | 1. 主庫(kù)故障需手動(dòng)恢復(fù),可用性低 2. 客戶端需硬編碼主庫(kù)地址 |
| 哨兵模式 | 1. 主庫(kù)故障自動(dòng)切換,高可用性強(qiáng) 2. 客戶端無(wú)需關(guān)心主庫(kù)地址變化 | 1. 部署復(fù)雜度高于主從架構(gòu)(需維護(hù)哨兵節(jié)點(diǎn)) 2. 仍無(wú)法解決單機(jī)內(nèi)存限制和寫(xiě)性能瓶頸 |
四、適用場(chǎng)景
| 架構(gòu) | 適用場(chǎng)景 |
|---|---|
| 主從架構(gòu) | 1. 對(duì)可用性要求不高(如內(nèi)部非核心服務(wù)) 2. 讀多寫(xiě)少,數(shù)據(jù)量小 3. 可接受人工干預(yù)故障恢復(fù) |
| 哨兵模式 | 1. 對(duì)可用性要求高(如線上核心服務(wù)) 2. 讀多寫(xiě)少,數(shù)據(jù)量中等 3. 無(wú)法接受主庫(kù)故障后長(zhǎng)時(shí)間不可用 |
總結(jié)
哨兵模式是主從架構(gòu)的 “高可用增強(qiáng)版”,核心價(jià)值是解決了主庫(kù)故障后的自動(dòng)恢復(fù)問(wèn)題,大幅提升了集群可用性,但未改變 “全量數(shù)據(jù)存儲(chǔ)”“單主寫(xiě)” 的本質(zhì),因此仍適用于數(shù)據(jù)量可控、讀多寫(xiě)少的場(chǎng)景。
如果需要突破單機(jī)內(nèi)存限制或擴(kuò)展寫(xiě)性能,則需使用 Redis 集群(Redis Cluster)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redisson如何解決redis分布式鎖過(guò)期時(shí)間到了業(yè)務(wù)沒(méi)執(zhí)行完問(wèn)題
這篇文章主要介紹了Redisson如何解決redis分布式鎖過(guò)期時(shí)間到了業(yè)務(wù)沒(méi)執(zhí)行完問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Redis的Hash類(lèi)型及相關(guān)命令小結(jié)
edis Hash是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)字段和值的映射關(guān)系,本文就來(lái)介紹一下Redis的Hash類(lèi)型及相關(guān)命令小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Redis數(shù)據(jù)一致性問(wèn)題的三種解決方案
Redis(Remote?Dictionary?Server?),是一個(gè)高性能的基于Key-Value結(jié)構(gòu)存儲(chǔ)的NoSQL開(kāi)源數(shù)據(jù)庫(kù),大部分公司采用Redis來(lái)實(shí)現(xiàn)分布式緩存,用來(lái)提高數(shù)據(jù)查詢效率,本文就給大家介紹三種Redis數(shù)據(jù)一致性問(wèn)題的解決方案,需要的朋友可以參考下2023-07-07
Redis中哈希結(jié)構(gòu)(Dict)的實(shí)現(xiàn)
本文主要介紹了Redis中哈希結(jié)構(gòu)(Dict)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
如何通過(guò)redis減庫(kù)存的秒殺場(chǎng)景實(shí)現(xiàn)
本文通過(guò)解決秒殺系統(tǒng)中的一個(gè)場(chǎng)景即數(shù)據(jù)預(yù)加載,即把庫(kù)存數(shù)據(jù)事先加載到緩存,然后通過(guò)緩存來(lái)更新庫(kù)存,簡(jiǎn)單介紹了如何通過(guò)redis減庫(kù)存的秒殺場(chǎng)景實(shí)現(xiàn),感興趣的可以了解一下2022-06-06
Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法
Redis數(shù)據(jù)庫(kù)依賴于主存,在關(guān)系型數(shù)據(jù)庫(kù)以外再配套R(shí)edis管理緩存數(shù)據(jù)將對(duì)性能會(huì)有很大的提升,這里我們就來(lái)看一下Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法2016-06-06

