大家好,我是小米,31 歲,熱愛技術、熱愛分享、熱愛奶茶(雖然醫生説我應該喝無糖)的大哥哥。

最近又陪朋友刷 Java 社招面試,他一臉生無可戀:“面試官又問我 Redis sentinel 哨兵模式,我記得好像是監控主從的?但細節我又忘了……”

我拍着他的肩膀,遞上一杯奶茶,笑着説:“兄弟,這題我用一杯奶茶講給你聽。聽完包你從懵到精通。”

喝口奶茶,我們開始講故事。

如果 Redis 是一家奶茶店

想象一下:Redis 就像是一家超火爆的奶茶店,排隊排到三公里外那種。

店裏有:

  • 一個店長(master):負責“衝奶茶、點單、打包”,超級忙。
  • 幾個店員(slave):負責“複製店長的手藝”,同步店長製作奶茶的過程,但不接單。

某天,店長幹累了,“啪”地一下暈倒了……

整個奶茶店瞬間癱瘓,顧客全跑了。

這就是:Redis 單點故障,master 掛了,整條服務崩盤。

怎麼辦?讓我們登場——哨兵(Sentinel)!

哨兵模式出現:給奶茶店安排一羣“店長監督員”

“哨兵模式”(Redis Sentinel)就是給 Redis 奶茶店安排一羣“監督員”。

這些監督員整天圍着店長轉:

  • 盯着店長有沒有暈倒
  • 盯着店員們是不是正常複製數據
  • 一旦店長真的倒了,他們會召開“緊急會議”
  • 選一個店員當新店長
  • 通知所有顧客:‘新店長上任了!繼續喝奶茶吧!’

這就是 Redis 哨兵模式的核心功能,Redis Sentinel 的三大職責:

  • 監控(Monitoring):Sentinel 會持續監控 master 和 slave 是否正常。
  • 故障恢復(Failover):master 掛了,自動選舉一個 slave 為新的 master,建立新的主從結構。
  • 通知(Notification):有變化時通過 API 或腳本通知客户端、其他程序:“master 換人啦!”

是不是,很像一羣專業的店長監督員?

哨兵是怎麼判斷“店長真的掛了”的?

哨兵不會店長一咳嗽就説他掛了,Redis 的 Sentinel 有嚴格的判斷標準。

1. 主觀下線(SDOWN)

某個哨兵認為 master 沒回應,於是説:

“我覺得店長暈了。”

但“我覺得”不能作為證據。

這只是 主觀下線

2. 客觀下線(ODOWN)

只有當多個哨兵一起投票,説:

“對,我也覺得店長掛了。”

哨兵集羣才會確認:

“OK,店長真的掛了。”

這叫 客觀下線(ODOWN)。只有 ODOWN 狀態,哨兵才會啓動真正的故障轉移流程(failover)。

你以為選新店長很簡單?哨兵的“競選大會”來了!

當 master 被判定 ODOWN 後,哨兵會啓動 failover 流程。流程就像一場嚴格的競選:

1、挑選健康的 slave

  • 數據同步最好
  • 與主節點延遲最小
  • 網絡狀態最好

有點像:誰的手藝最像店長?誰最靠譜?

2、讓候選 slave 執行 slaveof no one

這一步很關鍵!它意味着:“我不是店員了,我現在升職當店長!”

3、重新配置剩餘的 slave

指令:SLAVEOF 新master

意思是:“以後你們都跟着新店長學手藝。”

4、通知所有客户端

以前的客户端都連接舊 master。現在哨兵會告訴客户端:“master 換人了,地址在這裏,去找新店長點單吧!”

整個過程自動完成,無需人工干預。

重點來了:哨兵集羣怎麼工作?

要保證哨兵模式可靠,必須部署多個 Sentinel 節點。為什麼?

因為一個哨兵説 master 感覺掛了,不準。多個哨兵一起説 master 掛了,才會啓動 failover。

就像:

一個人説“店長暈了”,可能是看錯了;三個人都説“店長躺地板上了”,那八成是真的。

哨兵模式的架構:其實是“三層”

為了讓你徹底理解,我用最簡單的方式總結哨兵模式三層架構:

1、數據層:master + slave 結構

負責:

  • 處理讀寫(master)
  • 複製數據(slave)

2、 哨兵層:多個 Sentinel 組成集羣

負責:

  • 監控 master/slave 狀態
  • 選新 master
  • 通知客户端

哨兵之間會互相通信,投票決定 master 是否宕機。

3、客户端層

客户端不再直接寫死 master 地址,而是:

  • 連哨兵
  • 哨兵告訴客户端真正的 master 是誰
  • master 改變時,哨兵會通知你

這樣客户端自動適應故障恢復,非常穩。

面試問:哨兵模式有什麼缺點?

這是高頻問題,我給你總結成三句話,面試官聽完會很滿意。

1、Redis 哨兵模式仍存在腦裂風險

如果網絡分區,可能出現:

  • A 以為 master 掛了,選一個 slave 做新 master
  • 但舊 master 實際還活着

就出現兩個 master(腦裂)。

2、不支持水平擴展寫操作

哨兵模式仍然只有一個 master,寫能力受限。

3、可靠性比集羣模式弱

哨兵能解決“高可用”,不能解決“數據分片、擴容”問題。

哨兵和集羣有什麼區別?

如果你在面試現場回答下面這句話,面試官會瘋狂點頭:

Sentinel 負責“高可用”;

Redis Cluster 負責“高可用 + 分片 + 擴展”。

前者是保護 master,不讓它宕機;

後者是讓數據可以橫向擴展。

一句話就區分了。

哨兵模式典型部署方式(面試官超愛問)

最常見的是:

  • 1 主 2 從
  • 3~5 個 Sentinel

一個參考部署:

master(1台)

slave(2台)

sentinel(3台)

Sentinel 必須是奇數個,因為投票要多數同意才“客觀下線”。

面試官問你為什麼要奇數個,你就説:

因為哨兵是投票機制,必須多數派決定才能 failover,奇數能避免平票。

完美!

哨兵模式的完整工作流程(面試官最喜歡)

讀這一篇,你能把哨兵模式講給 HR 聽她都能懂!_Redis

我幫你總結成“六步口訣”——面試答題直接背!

Redis 哨兵模式 六步口訣

  1. sentinel 監控 master
  2. master 無心跳 → 主觀下線 SDOWN
  3. 多數 sentinel 投票 → 客觀下線 ODOWN
  4. 選 slave 當新 master
  5. 通知所有 slave 重新跟隨新 master
  6. 通知客户端:新的 master 地址是誰

這套邏輯你能流利描述出來,這道題基本穩了。

我朋友面試最終怎麼樣了?

第二天,我朋友去面試。面試官果然問了:“你講一下 Redis 哨兵模式?”

朋友立刻把奶茶故事搬出來——從監控、選主、投票、failover,一路講得順溜爆炸。

面試官聽得連連點頭:“不錯,講得很清楚。”

最終他也順利拿到了 offer。後來他發消息給我,説:“哨兵模式,我現在講給 HR 聽都能聽懂。”

我笑了半天。

END

如果你需要在簡短面試裏速答,可以用下面這段話,邏輯清晰、要點齊全:

Redis 哨兵模式是一種實現 Redis 高可用的機制。

它由多個 Sentinel 節點組成,負責監控 master 和 slave 的狀態。

一旦 master 進入客觀下線狀態,Sentinel 會通過投票選舉一個最佳 slave 作為新 master,並通知其他 slave 重新複製它,也會把新 master 的信息通知客户端。


Sentinel 的核心功能包括:監控、故障轉移、通知。

它解決了 Redis 單點故障問題,但仍然只有一個 master,不支持分片,因此可用性不如 Redis Cluster。

Sentinel 推薦部署奇數個節點,通過多數派選舉避免誤判。

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!