關於Redis哨兵機制,7張圖詳解!

阿風的架構筆記發表於2021-05-21

寫在前面

之前有位朋友去面試被問到Redis哨兵機制,這道題其實很多小夥伴都應該有被問到過!本文將跟大家一起來探討如何回答這個問題!同時用XMind畫了一張導圖記錄Redis的學習筆記和一些面試解析(原始檔對部分節點有詳細備註和參考資料,歡迎關注我的公眾號:阿風的架構筆記 後臺傳送【Redis】拿下載連結,已經完善更新):

img

先聊聊什麼是哨兵機制?

Redis的哨兵(sentinel) 系統用於管理多個 Redis 伺服器,該系統執行以下三個任務:

監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。

提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程式傳送通知。

自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級為新的Master, 並讓失效Master的其他Slave改為複製新的Master; 當客戶端試圖連線失效的Master時,叢集也會向客戶端返回新Master的地址,使得叢集可以使用Master代替失效Master。

1.為什麼要有哨兵機制?

哨兵機制的出現是為了解決主從複製的缺點的!再這談談redis的主從複製的缺點:

  • 主從複製,若主節點出現問題,則不能提供服務,需要人工修改配置將從變主
  • 主從複製主節點的寫能力單機,能力有限
  • 單機節點的儲存能力也有限

2.哨兵機制(sentinel)的高可用

原理: 當主節點出現故障時,由Redis Sentinel自動完成故障發現和轉移,並通知應用方,實現高可用性。

image.png

其實整個過程只需要一個哨兵節點來完成,首先使用Raft演算法(選舉演算法)實現選舉機制,選出一個哨兵節點來完成轉移和通知

3.哨兵的定時監控任務

任務1: 每個哨兵節點每10秒會向主節點和從節點傳送info命令獲取最拓撲結構圖,哨兵配置時只要配置對主節點的監控即可,通過向主節點傳送info,獲取從節點的資訊,並當有新的從節點加入時可以馬上感知到。

image.png

任務2: 每個哨兵節點每隔2秒會向redis資料節點的指定頻道上傳送該哨兵節點對於主節點的判斷以及當前哨兵節點的資訊,同時每個哨兵節點也會訂閱該頻道,來了解其它哨兵節點的資訊及對主節點的判斷,其實就是通過訊息publish和subscribe來完成的。

image.png

任務3: 每隔1秒每個哨兵會向主節點、從節點及其餘哨兵節點傳送一次ping命令做一次心跳檢測,這個也是哨兵用來判斷節點是否正常的重要依據。

客觀下線: 當主觀下線的節點是主節點時,此時該哨兵3節點會通過指令sentinel is-masterdown-by-addr尋求其它哨兵節點對主節點的判斷,當超過quorum(選舉)個數,此時哨兵節點則認為該主節點確實有問題,這樣就客觀下線了,大部分哨兵節點都同意下線操作,也就說是客觀下線。

4.領導者哨兵選舉流程

  • 每個線上的哨兵節點都可以成為領導者,當它確認(比如哨兵3)主節點下線時,會向其它哨兵發is-master-down-by-addr命令,徵求判斷並要求將自己設定為領導者,由領導者處理故障轉移;
  • 當其它哨兵收到此命令時,可以同意或者拒絕它成為領導者;
  • 如果哨兵3發現自己在選舉的票數大於等於num(sentinels)/2+1時,將成為領導者,如果沒有超過,繼續選舉…………

5.故障轉移機制

由Sentinel節點定期監控發現主節點是否出現了故障: sentinel會向master傳送心跳PING來確認master是否存活,如果master在“一定時間範圍”內不回應PONG 或者是回覆了一個錯誤訊息,那麼這個sentinel會主觀地(單方面地)認為這個master已經不可用了

image.png

當主節點出現故障, 此時3個Sentinel節點共同選舉了Sentinel3節點為領導,負載處理主節點的故障轉移

image.png

由Sentinel3領導者節點執行故障轉移,過程和主從複製一樣,但是自動執行

image.png

流程:

  1. 將slave-1脫離原從節點,升級主節點,
  2. 將從節點slave-2指向新的主節點
  3. 通知客戶端主節點已更換
  4. 將原主節點(oldMaster)變成從節點,指向新的主節點

故障轉移後的redis sentinel的拓撲結構圖

5.哨兵機制-故障轉移詳細流程-確認主節點

  • 過濾掉不健康的(下線或斷線),沒有回覆過哨兵ping響應的從節點
  • 選擇salve-priority從節點優先順序最高(redis.conf)的
  • 選擇複製偏移量最大,此指複製最完整的從節點

總結

redis哨兵的作用:

  1. 監控主資料庫和從資料庫是否正常執行。
  2. 主資料庫出現故障時,可以自動將從資料庫轉換為主資料庫,實現自動切換。

看完三件事❤️


如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:

  1. 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  2. 關注公眾號 『 阿風的架構筆記 』,不定期分享原創知識。
  3. 同時可以期待後續文章ing?
  4. 關注後回覆【666】掃碼即可獲取架構進階學習資料包

相關文章