【Redis主從架構】redis哨兵核心原理的深入解析(包括slave選舉算法)

10.【Redis主從架構】redis哨兵核心原理的深入解析(包括slave選舉算法)

1. sdown和odown轉換機制

1.1 sdown-主觀宕機

sdown是主觀宕機,就一個哨兵如果自己覺得一個master宕機了,那麼就是主觀宕機了。

  • 主觀宕機原理:

sdown 達成的條件很簡單,如果一個哨兵ping一個master,超過 is-master-down-after-milliseconds指定毫秒數之後,如果還沒有響應,就主觀認爲master宕機了。

1.2 odown-客官宕機

odown客觀宕機,如果quorum數量的哨兵都覺得一個master宕機了,就認爲master宕機了。

  • 客觀宕機原理:

如果一個哨兵在指定時間內,收到了quorum指定數量的其他哨兵也認爲這個master是sdown了,那麼就認爲是odown了,客觀認爲是master宕機

2. 哨兵集羣的自動發現機制

哨兵互相之間的發現,是通過redis的pub/sub系統實現的,每個哨兵都會往
sentinel:hello這個channel裏面發送一個消息,這時候其他哨兵都可以消費到這條消息,並感知到其他哨兵的存在。

每隔兩秒鐘,每個哨兵都會往自己健康的某個master+slaves對應的_sentinel_(可以理解爲Topic,MQ廣播機制):hello channel裏發送一個消息,內容是自己的host,ip和runid還有對這個master的配置

每個哨兵都會去監聽自己監控的每個master+slaves對應的_sentinel_:hello channel,然後去感知同樣在監聽這個master+slaves的其他哨兵的存在。

每個哨兵還會跟其他哨兵交換對master的監控配置互相進行監控配置的同步

3. slave配置的自動糾正

哨兵會負責自動糾正salve的一些配置,如果 slave 如果要成爲 master,哨兵會確保slave在複製新的master的數據。

如果一個slave連接到一個錯誤的master上,比如故障轉移之後,那麼哨兵會確保他們連接到正確的master上

4. slave->master選舉算法

如果一個master被認爲odown了,而且majority哨兵會允許主備切換,那麼某個哨兵會執行主備切換操作,此時需要先選舉一個slave出來。選舉的過程中會考慮slave的一些信息

  1. 跟master斷開連接的時長
  2. slave優先級
  3. 複製offset
  4. run id
  • 哨兵什麼時候認爲salve不適合選舉成爲master

一個slave跟master斷開連接的時間已經超過了down-after-milliseconds的10倍,外加master宕機的時長,那麼salve被認爲不適合被選舉爲master

(down-after-milliseconds * 10) + millisecond_since_master_is_in_SDOWN_state

  • slave選舉爲master需考慮的因素,即salve如何排序?
  1. 按照slave優先級進項排序,slave priority越低,優先級越高
  2. 如果slave priority相同,那麼看replicate offset哪個slave複製了更多的數據,offset越靠後,優先級就越高
  3. 如果上面兩個條件都相同,那麼就選擇一個run id比較小的按個slave

5. quorum 和 majority 參數詳解

quorum: 影響redis客觀宕機,必須要有quorum數量的哨兵認爲master宕機了,才認爲是odown,然後選舉一個哨兵來做主備切換

majority:影響 選舉 做主備切換的哨兵,選舉出來做哨兵切換的哨兵,必須得到majority個哨兵的授權,才能正式執行主備切換。

如果quorum < majority, 比如majority就是3,quorum設置爲2,那麼3個哨兵授權就可以進行主備切換。

如果quorum >= majority, 那麼必須quorum數量的哨兵都授權,比如5個哨兵,quorum是5,那麼必須5個哨兵都同一授權,才能進行主備切換。

6. configuration epoch

哨兵會對一套 redis master+slave進行監控,會有相應的監控的配置

執行切換的按個哨兵,會從要切換到新master (slave->master) 那裏得到一個configuration epoch,這就是version號,每次切換的version都是唯一的,如果第一個選舉出的哨兵切換失敗了,那麼其他哨兵,會等待failover-timeout時間,然後接替繼續執行切換,此時會重新獲取一個新的configuration epoch,作爲新的version號。

總結:
執行切換的哨兵會從 新的master那裏得到一個version號,假如主備切換失敗,意味着:要選舉新的slave,要獲取新的版本號。注意:版本號唯一。

7. configuration傳播

哨兵完成切換之後,會在自己本地更新生成最新的master配置,然後同步給其他的哨兵,就是通過之前所說的pub/sub消息機制實現

之前講解的version號也很重要,因爲各種消息都是通過一個channel去發佈和監聽的,所以一個哨兵完成一次新的切換,新的master和跟着新的version號的其他哨兵都是根據版本號的大小來更新自己的master配置的。

總結:
哨兵執行主備切換之後,新的master 的ip,端口號,runid都發生了變化。 哨兵會發送一條消息pub/sub 消息系統,通知其他哨兵 更新最新的master配置

總結:

image-20200519213939805

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