天天看點

深入解析Redis哨兵底層原理1 sdown和odown轉換機制2 自動發現機制3 slave配置的自動糾正4 slave => master選舉算法5 quorum和majority6 configuration epoch7 configuraiton傳播

1 sdown和odown轉換機制

兩種失敗狀态

1.1 概念

  • sdown主觀當機

    一個哨兵自己覺得一個master當機

  • odown客觀當機

    quorum數量的哨兵都覺得一個master當機

1.2 達成條件

  • sdown

    一個哨兵ping一個master,超過

    is-master-down-after-milliseconds

  • odown

    一個哨兵在指定時間内,收到了quorum指定數量的其他哨兵也認為那個master是sdown了,那麼就認為是odown

2 自動發現機制

通過Redis的pub/sub實作哨兵互相之間的發現,每個哨兵都會往__sentinel__:hello這個channel發一個消息,此時所有其他哨兵都可消費到該消息,于是感覺到其他哨兵的存在.

每隔2s,哨兵都會往自己監控的某個master+slaves對應的__sentinel__:hellochannel裡發一個消息,内容為自己的host、ip和runid還有對該master的監控配置

每個哨兵也會去監聽自己監控的每個master+slaves對應的__sentinel__:hello channel,然後去感覺到同樣在監聽這個master+slaves的其他哨兵的存在

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

3 slave配置的自動糾正

哨兵會負責自動糾正slave的一些配置,比如

  • slave要成為潛在的master候選人,哨兵會確定slave複制現有master的資料
  • slave連接配接到了一個錯誤的master上,比如故障轉移之後,那麼哨兵會確定它們連接配接至正确的master

4 slave => master選舉算法

若一個master被認為odown了,而且majority數量的哨兵都允許了主備切換,那麼某個哨兵就會執行主備切換操作,此時首先要選舉一個slave,會考慮slave的一些資訊

  • 跟master斷開連接配接的時長
  • slave優先級
  • 複制offset
  • run id

若一個slave跟master斷開連接配接的時間已經超過

down-after-milliseconds

的10倍,外加master的當機時長,那麼slave就會被認為不适合選舉為master

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
      

接下來會對slave進行排序

1.按照slave優先級進行排序,slave priority越低,優先級就越高

2.如果slave priority相同,那麼看replica offset,哪個slave複制了越多的資料,offset越靠後,優先級就越高

3.如果上面兩個條件都相同,那麼選擇一個run id比較小的那個slave

5 quorum和majority

每次一個哨兵要做主備切換,首先需要quorum數量的哨兵認為odown,然後選舉出一個哨兵來做切換

該哨兵還得得到majority個哨兵的授權,才能正式執行切換

  • 若quorum < majority

    比如5個哨兵,majority就是3,quorum設定為2,那麼就3個哨兵授權就可以執行切換

  • 若quorum >= majority

那麼必須quorum數量的哨兵都授權,比如5個哨兵,quorum是5,那麼必須5個哨兵都同意授權,才能執行切換

6 configuration epoch

哨兵會監控一套Redis master+slave,并有相應的監控配置

執行切換的哨兵,會從要切換到的新master(salve => master)那裡得到一個configuration epoch,這就是一個version号,每次切換的version号都必須是唯一的

如果第一個選舉出的哨兵切換失敗,那麼其他哨兵,會等待failover-timeout時間,然後接替繼續執行切換,此時會重新擷取一個新的configuration epoch,作為新的version号

7 configuraiton傳播

哨兵完成切換之後,會在自己本地更新生成最新的master配置,然後同步給其他哨兵

這裡是通過pub/sub機制傳遞的

到了這裡,之前提到的version号就很重要了,因為各種消息都是通過一個channel去釋出和監聽的,是以一個哨兵完成一次新的切換之後,新的master配置是跟着新的version号的

其他的哨兵也都是根據版本号的大小來更新自己的master配置的

繼續閱讀