Redis Sentinel執行流程

Redis Sentinel執行流程

Sentinel是Redis的高可用解決方案:由一個或多個Sentinel實例組成Sentinel Cluster,可以監控任意多個master服務器,及這些master下屬的slave服務器。當被監視的master進入下線狀態時,Sentinel Cluster會自動將其下屬的slave中的一個升級爲master,然後由新的master代替已下線的master繼續提供服務。

本文主要介紹Sentinel的執行流程

一. 啓動並初始化Sentinel

Sentinel本質上是一個運行在特殊模式下的Redis服務器,因此它的啓動方式與普通Redis類似,但是也有一些不同,其中之一就是Sentinel並不提供數據庫的功能,因此不會進行持久化操作,啓動時也不會根據RDB或AOF文件加載數據。

Sentinel實例啓動後,會根據配置的master地址,向主服務器建立連接。每個Sentinel會創建2個連向主服務器的異步網絡連接:

  1. 命令連接:這個連接專門用於向主服務器發送命令,並接收響應;
  2. 訂閱連接:這個連接專門用於訂閱主服務器的_sentinel_:hello 這個Channel。

二. 獲取主服務器信息

Sentinel默認每10s一次,向被監控的主服務器發送info命令,獲取主服務器和其下屬從服務器的信息。

三. 獲取從服務器信息

當Sentinel發現主服務器有新的從服務器出現時,Sentinel還會向從服務器建立命令連接和訂閱連接。在命令連接建立之後,Sentinel還是默認10s一次,向從服務器發送info命令,並記錄從服務器的信息。

四. 向主服務器和從服務器發送消息

默認情況下,Sentinel每2s一次,向所有被監視的主服務器和從服務器所訂閱的_sentinel_:hello頻道上發送消息,消息中會攜帶Sentinel自身的信息和主服務器的信息。

五. 接收來自主服務器和從服務器的頻道信息

多個監控同一個主服務器的Sentinel,都會發送頻道消息,這樣其他的Sentinel就都會接收到。Sentinel集羣中的各個節點,通過頻道消息感知彼此的存在。

當Sentinel通過頻道消息感知到一個新的Sentinel加入時,就會創建一個新的連接連向這個新的Sentinel,同樣新的Sentinel也會與所有已經存在的Sentinel建立連接。最終,監控同一個主服務器的多個Sentinel就構成了一個相互連接的網絡,他們之間就會可以命令連接進行通信。

Sentinel彼此之間只創建命令連接,而不創建訂閱連接,因爲Sentinel通過訂閱主服務器或從服務器,就可以感知到新的Sentinel的加入,而一旦新Sentinel加入後,相互感知的Sentinel通過命令連接來通信就可以了。

六. 檢測主觀下線狀態

默認情況下,Sentinel每秒一次向所有與它建立了命令連接的實例(包括主服務器、從服務器和其他Sentinel)發送PING命令,並根據回覆判斷實例是否在線。如果在Sentinel配置文件中的down-after-milliseconds毫秒內,連接向Sentinel返回無效回覆,那麼Sentinel就會認爲該實例主觀下線(SDown)

七. 檢查客觀下線狀態

當一個Sentinel將一個主服務器判斷爲主觀下線後,爲了確認是否真的下線,這個Sentinel會向同時監控這個主服務器的所有其他Sentinel發送查詢命令,判斷它們是否也任務主服務器下線(包括主觀下線和客觀下線)。如果達到Sentinel配置中的quorum數量的Sentinel實例都判斷主服務器爲主觀下線,則該主服務器就會被判定爲客觀下線。

八. 選舉Leader Sentinel

當一個主服務器被判定爲客觀下線後,監視這個主服務器的所有Sentinel會通過選舉算法,選出一個Leader Sentinel去執行failover操作。

九. 故障轉移

當選舉出Leader Sentinel後,Leader Sentinel會對下線的主服務器執行故障轉移操作,主要有一下三個步驟:

  1. 在已下線的主服務器的所有下屬從服務器中,選舉出一個作爲新的主服務器。
  2. 將所有從服務器改爲複製新的主服務器。
  3. 將已下線的主服務器設置爲新的主服務器的從服務器。

在從服務器列表在選舉出新的主服務器,需經過以下流程:

  1. 刪除列表中下線或者斷線狀態的實例。
  2. 刪除列表中最近5s沒有回覆Leader Sentinel INFO信息的實例。
  3. 刪除與主服務器斷開時間超過down-after-milliseconds的實例,確保剩餘的從服務器的數據都是比較新的。
  4. 根據設置的優先級,選擇優先級最高的從服務器。
  5. 如果優先級相同,則比較從服務器的複製偏移量(偏移量最大的從服務器中的數據是最新的)。
  6. 如果複製偏移量也相同,那麼選擇runId最小的從服務器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章