redis系列(二)-------redis的高可用之哨兵模式

一、簡介

            聲明: 該文章內容參考自 51CTO技術棧 公衆號的部分內容,純屬學習記錄使用。

            

二、redis高可用相關

2.1 持久化

  • 持久化主要作用是數據備份,即將數據存儲在硬盤,保證數據不會因爲進程退出而丟失。

2.2 複製

  • redis高可用的基礎,哨兵和集羣都是在該基礎上實現高可用的。複製主要實現了數據的多機備份,以及對讀操作的負載均衡和簡單的故障恢復。
  • 缺陷:故障時無法自動恢復,需手動進行切換;寫操作無法負載均衡;存儲能力受到單機的限制;

2.3 哨兵

  • 哨兵在複製的基礎上實現了故障的自動化回覆;
  • 缺陷:寫操作無法負載均衡;存儲能力受到單機的限制;

2.4 集羣

  • 使用集羣,解解決了redis的寫操作無法負載均衡的問題,以及存儲能力收到單機限制的問題。

 

三、哨兵

3.1 哨兵原理

3.1.1 哨兵架構圖

  • 由倆部分組成:哨兵節點集合和數據節點集合。
    • 哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲數據,負責對數據節點和七月的哨兵節點進行監控;一個哨兵節點可以監控多個主節點;
    • 數據節點:主節點和從節點都是數據節點;

 

3.1.2 功能

  • 監控
    • 哨兵節點會不斷的檢查主節點和從節點的運行情況是否正常;
  • 自動故障轉移
    • 當主節點不能正常工作時,哨兵節點會選舉一個從節點作爲主節點,並讓其它從節點改爲複製新的主節點;
  • 配置提供者
    • 客戶端在初始化時,通過鏈接哨兵節點來獲取當前redis服務的主節點地址;
  • 通知
    • 哨兵可以將故障轉移的結果發送給客戶端;

 

3.1.3 哨兵大致原理

  • 首先,哨兵節點會針對其他的哨兵節點和數據節點進行監控,當發現節點不可達時,會對節點做下線標識;
  • 如果被標記的節點是主節點,它會和其它的哨兵節點進行協商,當大多數的哨兵節點都認爲該節點不可達時,則會選舉出一個哨兵節點來完成故障自動轉移工作,同時會將該變化通知到redis的應用方。

 

3.1.4 哨兵故障轉移流程

  • 主節點出現故障,此時倆個從節點與主節點失去連接,主從複製失敗;
  • 每個哨兵節點通過定期監控發現主節點出現了故障,然後將該節點標記爲不可達;
  • 多個哨兵結點對主節點的故障達成一致則會選取其中一個哨兵節點負責處理主節點的失效轉移;
  • 哨兵節點會選取另一個從節點作爲主節點,然後建立新的主從關係,失效的舊的節點會在恢復後自動變爲從節點;

3.1.5 底層原理

  • 特殊命令
    • 哨兵節點是運行在特殊模式下的redis節點,其支持的命令和普通的redis節點不同。如下:
    • TODO
  • 定時任務
    • 每個哨兵節點都維護了三個定時任務,分別如下:
      • 通過向主從節點發送info命令獲取最新的主從結構;
      • 通過發佈訂閱功能獲取其它哨兵節點的信息;
      • 通過向其它節點發送ping命令進行心跳檢測,判斷是否下線;
  • 主觀下線
    • 在心跳檢測的定時任務中,如果其它節點超過一定時間沒有回覆,哨兵節點會將其主觀下線,標記不可達;
  • 客觀下線
    • 哨兵節點在對主節點進行主觀下線後,會通過sentinelis-master-down-by-addr命令詢問其它哨兵節點該主節點的狀態,如果判斷主節點下線的哨兵節點數量達到一定的閾值,則會對該主節點進行客觀下線;
    • 注意:客觀下線時主節點纔有的概念;如果從節點和哨兵節點發生故障,被哨兵節點主觀下線後,不會再有後續的客觀下線和故障轉移操作;
  • 選舉領導者哨兵節點
    • 當主節點被判斷客觀下線之後,各個哨兵節點會進行協商,選舉出一個領導者哨兵節點,並有該領導者節點對其進行故障轉移操作;
    • 監視該主節點的所有哨兵節點都有可能被選舉爲領導者,選舉使用的是Raft算法,基本思路是先到先得:即在一輪選舉中,哨兵A向哨兵B發送成爲領導者的請求,如果B沒有同意過其它哨兵節點,則會同意A成爲哨兵節點;
    • 一般來說,哨兵選擇的速度很快,誰先完成客觀下線,一般就能成爲領導者;
  • 故障轉移
    • 選舉出的領導者哨兵節點開始進行故障轉移,該操作大致有以下三步:
      • 在從節點中選擇新的主節點:選擇的原則是:首先過濾掉不健康的從節點,然後選擇優先級最高的從節點(由slaver-priority指定)。如果優先級無法區分,則選擇複製偏移量最大的從節點;如果仍無法區分,則選擇runid最小的從節點;
      • 更新主從狀態:通過slaveof no one命令,讓選出來的從節點成爲主節點,並通過slaveof命令讓其它從節點成爲其從節點;
      • 將已經下線的主節點設置爲新的主節點的從節點。當故障的主節點恢復後重新上線則其會成爲新的主節點的從節點。

 

 

3.1.6 部署注意點

  • 哨兵節點不能部署在同一臺物理機上,避免單臺機器故障;
  • 選舉策略是一半加一個節點,所以領導者選舉至少三臺,且是奇數臺;

 

四、搭建步驟

五、故障模擬

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章