【Redis】Sentinel哨兵

🛡? 深入理解 Redis Sentinel:高可用架構的守護者

在實際開發中,我們常用 Redis 構建緩存系統或數據中間件。然而,主從復制雖然能實現數據同步,但無法自動故障轉移(failover),這就意味著如果主節點宕機,必須手動介入切換,非常影響系統可用性。

為了解決這個問題,Redis 提供了專門的高可用組件 —— Redis Sentinel(哨兵)

本文將帶你系統了解:

  • 為什么需要 Sentinel?
  • Sentinel 的工作機制與核心原理
  • 自動故障轉移的流程
  • 如何配置 Sentinel 模式
  • Sentinel 的優缺點與實踐建議

?? 一、為什么需要 Redis Sentinel?

我們知道,Redis 主從復制模式如下圖:

       Master/   \Slave1  Slave2

在主從結構中:

  • 主節點(Master)負責寫操作
  • 從節點(Slave)同步數據,負責讀操作

但存在一個致命缺陷:

? 如果 Master 宕機,整個寫服務就會癱瘓!主從無法自行切換主節點,只能人工干預。

因此,我們需要一種機制能夠自動識別 Master 的故障,并切換角色 —— 這就是 Sentinel 的職責


🔧 二、什么是 Redis Sentinel?

Redis Sentinel(哨兵) 是 Redis 官方提供的分布式系統監控與故障轉移組件,具備以下核心能力:

  1. 監控(Monitoring):持續監控主從節點是否在線;
  2. 通知(Notification):當某個節點出現問題時,通過 API 通知系統管理員或其他服務;
  3. 自動故障轉移(Automatic Failover):當主節點宕機,自動從從節點中選舉新的主節點;
  4. 服務發現(Configuration Provider):客戶端可以通過 Sentinel 獲取當前主節點地址。

?? 三、Sentinel 的核心原理

Sentinel 是一組獨立的進程,它們互相通信共同協作完成主節點的監控與切換

Sentinel 監控機制

每個 Sentinel 定期向主從節點發送 PING 命令:

  • 超過 down-after-milliseconds 時間未響應,會被標記為 主觀下線(sdown)
  • 多個 Sentinel 一致認為某節點下線,稱為 客觀下線(odown)

🧱 四、Sentinel 的部署與配置

1?? 啟動 Redis 主從節點

# 啟動主節點
redis-server ./redis.conf# 啟動從節點(配置 replicaof)
redis-server --port 6380
redis-cli -p 6380 replicaof 127.0.0.1 6379

2?? 創建 Sentinel 配置文件(sentinel.conf)

port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1

解釋:

  • mymaster:主節點名稱(自定義)
  • 127.0.0.1 6379:主節點地址
  • 2:quorum,判定客觀下線至少需要 2 個哨兵同意
  • down-after-milliseconds:節點無響應時間(ms)
  • failover-timeout:最大故障轉移超時時間
  • parallel-syncs:故障轉移時同時同步從節點的數量

3?? 啟動 Sentinel

redis-sentinel ./sentinel.conf

多個 sentinel 節點建議分布式部署(推薦奇數個,如 3 個或 5 個)


🔁 五、故障轉移后客戶端怎么處理?

故障轉移后,客戶端需要獲取新主節點地址,否則繼續訪問舊主節點會失敗。

? 方法一:使用 Sentinel 模式客戶端

很多 Redis 客戶端支持連接 Sentinel 節點,自動發現新的 Master,例如:

  • Jedis(Java)
  • Lettuce(Spring Data Redis)
  • StackExchange.Redis(.NET)

? 方法二:通過 Sentinel 命令查詢主節點

redis-cli -p 26379
SENTINEL get-master-addr-by-name mymaster

返回新的主節點 IP 和端口,客戶端可動態切換連接。


🧠 六、優缺點分析

優點缺點
自動監控、自動故障轉移配置復雜,依賴哨兵自身穩定性
架構簡單,不依賴第三方服務延遲仍然存在,不能強一致
客戶端支持服務發現無法橫向擴展,仍受限單主寫

? 七、適用場景與實踐建議

適用場景:

  • 中小型系統,高可用 Redis 方案
  • 需要主從自動切換,但不需要分片
  • 高性價比替代 Redis Cluster

建議:

  • Sentinel 節點部署在不同主機,避免單點失敗;
  • quorum + 哨兵節點數應滿足多數派;
  • 搭配 DNS + 代理等方式實現客戶端透明切換;
  • 注意客戶端的連接模式配置,避免連接舊主節點。

📚 總結

能力是否支持
主從自動同步? 主從復制實現
主節點宕機自動轉移? Sentinel 實現
客戶端服務發現? 通過哨兵查詢
高可用讀寫分離? 從節點讀,主節點寫
分布式分片?(需 Redis Cluster)

Redis Sentinel 是 Redis 官方推薦的高可用方案之一。對比 Redis Cluster 更加輕量,適合對數據量、分片要求不高但高可用需求強烈的中小型系統。


當然可以,下面是一篇圍繞 Redis Sentinel(哨兵)實現原理 的技術博客,重點突出其核心工作機制:定時監控 → 主觀下線 → 客觀下線 → 領導者選舉 → 故障轉移,適合用于面試準備、團隊分享、CSDN/掘金博客發布。


🛡? Redis Sentinel 實現原理全解析:監控、判定、選舉與故障轉移

在 Redis 的高可用架構中,主從復制解決了讀寫分離和數據冗余問題,但卻無法完成自動故障轉移。這意味著,一旦主節點(Master)宕機,我們需要人工介入,將某個從節點(Slave)提升為主節點。

為了彌補這一缺陷,Redis 提供了一個獨立的、強大的高可用組件 —— Redis Sentinel(哨兵),實現主從架構下的 自動監控、故障檢測與主從切換

本篇博客將聚焦 Sentinel 的 實現原理,逐步剖析其核心機制:

定時監控 → 主觀下線 → 客觀下線 → 領導者選舉 → 故障轉移


?? 1. 為什么需要 Sentinel?

主從復制雖好,但當 Master 出現故障:

  • Slave 不會自動“上位”
  • 客戶端依然連接舊 Master,訪問失敗
  • 需要人為手動切換主從、修改配置、通知客戶端

🔧 這對系統可用性、容錯性要求較高的場景,是不可接受的。

因此,我們需要一個機制來完成這些事情的自動化 —— Sentinel 哨兵系統應運而生。


?? 2. Sentinel 實現原理總覽

下面我們圍繞 Sentinel 的核心四步展開詳細講解:

Sentinel 原理核心流程:定時監控↓
主觀下線(sdown)↓
客觀下線(odown)↓
選舉領導者↓
執行故障轉移

🔍 3. 定時監控:PING 檢測健康狀態

每個 Sentinel 節點都會以固定頻率(默認 1 秒)向所有監控的 Redis 實例(包括主從和其他 Sentinel)發送 PING 命令。

  • 若某個節點在 down-after-milliseconds 時間內沒有回復(默認 5 秒),
  • Sentinel 會將其標記為 主觀下線(Subjectively Down, sdown)
sentinel down-after-milliseconds mymaster 5000

? 這一步是單哨兵的主觀判斷,并不代表真正的故障。


🚨 4. 主觀下線 → 客觀下線

如果一個節點被多個 Sentinel 同時標記為 sdown,并且達到配置的投票數量(quorum),則會升級為:

客觀下線(Objectively Down, odown)

sentinel monitor mymaster 127.0.0.1 6379 2

以上配置中,表示至少兩個 Sentinel 一致認為 mymaster 宕機,才認定為 odown

? 多哨兵一致達成共識,保證判斷的可靠性,防止網絡波動帶來的誤判。


🗳? 5. 領導者選舉(Leader Election)

一旦發生 odown,需要一個 Sentinel 作為Leader(領導者),負責協調主從切換。

采用的是 Redis 自帶的Raft 類似的投票機制

  • 所有 Sentinel 參與選舉,每個 Sentinel 只能投一票;
  • 第一個獲得多數票的 Sentinel 成為 Leader;
  • 其他 Sentinel 退讓,監聽轉移過程。
SENTINEL is-master-down-by-addr <ip> <port> <runid> <config-epoch>

該命令是 Sentinel 之間互相交換“票據”的基礎。


🔁 6. 故障轉移(Failover)

當 Leader Sentinel 被選出后,它開始執行核心任務 —— 自動故障轉移

轉移步驟如下:

  1. 從原主節點的從節點列表中挑選一個健康的從節點作為新主節點;
  2. 向選中的從節點發送 SLAVEOF NO ONE 指令,將其提升為主節點
  3. 通知其他從節點:執行 SLAVEOF <new-master-ip> <port>跟隨新的主節點
  4. 更新自身和其他 Sentinel 的配置,如 epoch(配置版本號)、角色切換信息等。

🔔 Redis 的從節點可以快速接管主節點工作,且不會丟失大量數據(只會丟失少量未同步的寫操作)。


📦 7. 一張圖總結 Sentinel 原理

定時 PING 主節點
是否超時
標記為 sdown
詢問其他 Sentinel
超過 quorum?
判定為 odown
發起領導者選舉
Leader Sentinel 選出新主節點
下發 SLAVEOF 指令切換主從
更新配置并通知客戶端

?? 8. Sentinel 的局限與注意事項

問題描述應對方式
網絡抖動誤判下線誤觸發 failover合理設置 down-after 時間
配置不一致多個 Sentinel 配置不同步使用同一個 sentinel.conf 模板啟動
客戶端未自動切換老連接依然訪問舊主使用支持 Sentinel 的客戶端庫
只支持單主架構無法分片可考慮 Redis Cluster 替代

? 9. 實踐建議

  • 部署至少 3 個 Sentinel 實例,確保選舉機制有效;
  • 將 Sentinel 與 Redis 節點部署在不同主機或容器中
  • 配置合理的 down-after-millisecondsquorum 值;
  • 使用 Redis 客戶端支持 Sentinel 服務發現,如:Lettuce、Jedis、Redisson;
  • 可結合 Nginx、DNS、注冊中心等實現透明故障切換

📚 總結

階段說明
監控哨兵定時發送 PING,判斷節點存活
主觀下線單個 Sentinel 判斷某節點不可用
客觀下線多個 Sentinel 一致判斷,形成共識
領導者選舉多個 Sentinel 選出 Leader 協調切換
故障轉移將從節點提升為新主節點,并通知其他節點

Redis Sentinel 是 Redis 高可用方案中的核心技術之一,它通過輕量級的組件設計和自動化的監控機制,讓 Redis 從“單點架構”演化為“具備自我修復能力”的健壯系統。


🚦Redis Sentinel 中的主觀下線與客觀下線機制詳解

在 Redis Sentinel 高可用機制中,“主觀下線(sdown)”與“客觀下線(odown)”是兩個非常關鍵的概念,它們直接決定了 Sentinel 是否會對某個節點執行故障轉移操作。

很多初學者容易混淆這兩個術語,本文將結合實際機制、源碼命令、以及時序過程,為你徹底講清楚這兩者的區別與配合原理


?? 什么是 Redis Sentinel?

Redis Sentinel 是 Redis 提供的一種高可用解決方案,具備:

  • 節點健康監控
  • 故障發現與自動轉移
  • 客戶端服務發現

其中,Sentinel 通過不斷的健康檢測,發現故障節點并自動完成主從切換。

而主觀下線和客觀下線就是故障判定的兩個階段。
在這里插入圖片描述


🔍 1. 主觀下線(Subjectively Down)

? 定義:

主觀下線指的是某個 Sentinel 節點認為目標 Redis 節點已經不可達,但這種判斷是該 Sentinel 自己獨立作出的并不代表共識或最終結論

? 判定機制:

每個 Sentinel 會:

  • 每隔 1 秒 向所有被監控的 Redis 實例(主節點、從節點、其他 Sentinel)發送一次 PING 命令;
  • 如果某個 Redis 節點在指定時間段(down-after-milliseconds,比如 5 秒)內沒有做出有效回復
  • 那么該 Sentinel 會將這個節點標記為 主觀下線(sdown)

? 示例配置:

sentinel down-after-milliseconds mymaster 5000

即:如果主節點在 5 秒內沒回應,則該 Sentinel 節點主觀判定其“掛了”。

? 特點總結:

特性描述
判定者單個 Sentinel
時間依據down-after-milliseconds
目標節點Master/Slave/Sentinel
是否觸發故障轉移? 不會單獨觸發
是否可被誤判? 可能因為網絡抖動誤判

🧠 2. 客觀下線(Objectively Down)

? 定義:

當一個 Redis 主節點被多個 Sentinel 節點同時標記為主觀下線,且滿足 quorum 票數要求,就會被認為是客觀下線(odown),也就是集體判定其“真的掛了”。

? 判定機制:

  • 當某個 Sentinel 檢測到 Master 節點 sdown 后,會發送:
SENTINEL is-master-down-by-addr

向其他 Sentinel 詢問是否也判定該主節點 sdown。

  • 如果超過配置的 quorum 個數(如 2 個)也認為 sdown,則標記為 客觀下線(odown)
  • 此時,Sentinel 會進入下一階段:領導者選舉和 failover 故障轉移

? 示例配置:

sentinel monitor mymaster 127.0.0.1 6379 2

表示:若至少有 2 個 Sentinel 一致認定主節點不可用,即進入 odown 狀態。

? 特點總結:

特性描述
判定者多個 Sentinel
依據quorum 投票一致
目標節點只針對主節點(Master)
是否觸發故障轉移? 是故障轉移的前提條件
是否可信? 更可靠(多數派共識)

🖼? 3. 時序圖對比示意

Sentinel1 Sentinel2 Sentinel3 Master Master 宕機 PING PING PING 未響應超時,sdown 未響應超時,sdown is-master-down-by-addr? 是(sdown) is-master-down-by-addr? 是(sdown) quorum 達成 → 標記 odown Sentinel1 Sentinel2 Sentinel3 Master

📌 4. 實際生活中的類比

  • 主觀下線就像某個員工說“老王今天好像沒來上班”
  • 客觀下線是多個員工都說“是的,老王真的請假了”,老板才會安排別的人頂替他的工作

? 5. 總結對比表

對比項主觀下線(sdown)客觀下線(odown)
判定來源單個 Sentinel 節點多個 Sentinel 達成共識
適用對象所有 Redis 節點僅主節點
是否可靠否(可能誤判)是(基于投票)
是否觸發故障轉移? 否? 是
實現命令自動 ping 判定is-master-down-by-addr

🎯 總結

Redis Sentinel 的下線機制是其高可用設計的關鍵之一:

  • 主觀下線(sdown)是單哨兵的臨時判斷
  • 客觀下線(odown)是多哨兵一致的最終裁決

只有當達到 客觀下線,Sentinel 系統才會啟動領導者選舉和主從切換流程,從而實現 Redis 的自動故障恢復。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87549.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell腳本應用及實戰演練

文章目錄 一、Shell腳本語言的基本結構1、Shell腳本的用途&#xff1a;2、 Shell腳本基本結構&#xff1a;3、 創建Shell腳本過程4、 腳本注釋規范 二、Shell腳本語言的變量用法詳解位置與預定義變量 三、 Shell字符串詳解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

軟件工程瀑布模型學習指南

軟件工程瀑布模型學習指南 一、瀑布模型核心概念 1.1 定義與特點 瀑布模型是一種經典的軟件開發流程,將項目劃分為順序性的階段,每個階段有明確的輸入和輸出,如同瀑布流水般單向推進。其特點包括: 階段間具有明確的順序性和依賴性強調文檔驅動和階段評審適合需求明確、穩…

獲取gitlab上項目分支版本(二)

獲取gitlab上項目分支版本_gitlab代碼分支版本在哪-CSDN博客 原先寫過一版&#xff0c;但是這次想更新一下項目的分支信息時&#xff0c;提示我 git服務器上的Python版本是2.7.3&#xff0c;這個錯誤表明當前Python環境中沒有安裝requests庫&#xff0c;服務器也沒有連接外網&…

主流防火墻策略繞過漏洞的修復方案與加固實踐

主流防火墻策略繞過漏洞的修復方案與加固實踐 流量關鍵點分析&#xff08;攻擊手法&#xff09; 攻擊者通過精心構造的TCP序列號攻擊和惡意標志組合繞過防火墻DPI檢測&#xff0c;核心手法如下&#xff1a; TCP連接建立&#xff08;正常握手&#xff09; 1049&#xff1a;客戶…

泛微OAe9-后端二開常見數據庫操作

泛微OAe9-后端二開常見數據庫操作 文章目錄 泛微OAe9-后端二開常見數據庫操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存儲過程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 適用于操作 OA 自己的庫。OA 數據庫…

【數據分析八:hypothesis testing】假設檢驗

本節我們講述假設檢驗和抽樣方法 有關假設檢驗的詳細內容&#xff0c;可以參考我以往的博客 概率論與數理統計總復習_概率論與數理統計復習-CSDN博客文章瀏覽閱讀1.5k次&#xff0c;點贊33次&#xff0c;收藏23次。中科大使用的教輔《概率論和數理統計》&#xff0c;帶大家復…

AI免費工具:promptpilot、今天學點啥、中英文翻譯

promptpilot 激發模型潛能&#xff0c;輕松優化 Prompt https://promptpilot.volcengine.com/startup 今天學點啥 https://metaso.cn/study 能生成網頁和語音播報 中英文翻譯 沉浸式翻譯&#xff0c;瀏覽器插件&#xff0c;ai翻譯

計算機網絡學習筆記:TCP三報文握手、四報文揮手

文章目錄 前言一、TCP三報文握手二、TCP四報文揮手三、TCP保活計時器 前言 TCP通信&#xff0c;通常需要經歷三個階段&#xff1a;三報文握手->發送&#xff0c;接收數據->四報文揮手。 一、TCP三報文握手 三報文握手處于TCP的連接建立階段&#xff0c;主要解決了以下的…

kafka部署和基本操作

一、部署kafka 解壓 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5學習教程,從入門到精通,Bootstrap 5 導航語法知識點及案例代碼(17)

Bootstrap 5 導航語法知識點及案例代碼 Bootstrap 5 提供了強大的導航組件&#xff0c;幫助開發者快速構建響應式且美觀的導航欄。 一、Bootstrap 5 導航組件概述 Bootstrap 5 提供了多種導航組件&#xff0c;主要包括&#xff1a; 導航欄&#xff08;Navbar&#xff09;&am…

清除 docker 無用的 鏡像/容器

清除 docker 無用的 鏡像/容器 刪除 <none> 的 docker 鏡像 使用以下命令刪除所有 的 Docker 鏡像&#xff08;即懸空鏡像 / dangling images&#xff09;&#xff1a; docker image prune -f這會自動刪除所有沒有 tag 的鏡像&#xff08;&#xff09;&#xff0c;不會…

使用Charles抓包工具提升API調試與性能優化效率

在軟件開發過程中&#xff0c;網絡請求調試和性能優化往往成為開發者遇到的挑戰&#xff0c;尤其是在進行API接口調試時。開發者需要確保網絡請求的正確性、響應時間以及系統的整體性能。然而&#xff0c;傳統的調試方法常常無法提供足夠的細節來深入分析問題&#xff0c;進而影…

如何協調各項目關鍵節點的沖突與依賴

在多項目并行的環境下&#xff0c;關鍵節點間的沖突與依賴是導致項目延期、資源浪費和溝通誤解的主要根源。要高效協調此類問題&#xff0c;企業應重點從建立透明的進度依賴圖、使用項目管理工具對齊節點、推動跨部門協同機制入手。其中&#xff0c;通過Gantt圖或關鍵路徑法實現…

mongodb單節點改副本集模式

前一陣將三節點的副本集改成了單節點&#xff0c;但后面業務代碼出現問題&#xff1a;無法使用事務&#xff0c;因為事務只有在副本集上能用&#xff0c;單節點無法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前僅有一臺服務器&#xff0c;所以考慮在一臺服務器上…

Android 修改了頁面的xml布局,使用了databinding,這時候編譯時需要用到apt嗎

deepseek回答&#xff1a; 在 Android 開發中使用 DataBinding 時&#xff0c;不需要顯式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是詳細說明&#xff1a; 1. DataBinding 的編譯機制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服務器如何從http升級到https(nginx)

1.證書申請 可以到阿里云或者華為云去申請證書&#xff0c;申請完下載證書是個壓縮包&#xff0c;然后解壓 可以到到幾個文件夾&#xff0c;找到 .Nginx 文件夾打開 會有兩個文件&#xff0c;將這兩個文件上傳至nginx/conf/cert文件夾下&#xff08;cert需要手…

6.19_JAVA_微服務

1、跑后端的時候要把數據庫跑起來&#xff0c;否則會報錯。 2、predicate斷言&#xff1a; 預言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc編程一個集合。 5、 6、shortcutFieldOrd…

Linux 基礎命令:`ls`、`cd`、`du` 快速入門

在 Linux 系統中&#xff0c;ls、cd 和 du 是日常操作中最常用的三個命令。掌握它們能大幅提升文件管理效率。 1. ls&#xff1a;查看目錄內容 用途&#xff1a;列出當前或指定目錄下的文件和子目錄。 常用命令&#xff1a; ls -l # 詳細列表&#xff08;權限、大…

408第一季 - 數據結構 - 散列表

散列表 概念 散列表本身就是為了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 沖突 沖突怎么辦&#xff1f; 線性探測法 就往后找&#xff0c;1跑到索引為2 然后查找&#xff0c;可以發現&#xff0c;只要沒沖突就只用查找1次 然后你想找10的話&#xff0c;發現索引為0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一個基于 Lucene 的分布式搜索服務器&#xff0c;具有高效的全文檢索能力。在現代應用中&#xff0c;尤其是需要強大搜索功能的系統中&#xff0c;Elasticsearch 被廣泛使用。 Spring Boot 提供了對 Elasticsearch 的集成支持&#xff0c;使得開發者可以輕松地…