sdown是主觀宕機,就一個哨兵若是本身以爲一個master宕機了,那麼就是主觀宕機了。web
sdown 達成的條件很簡單,若是一個哨兵ping一個master,超過 is-master-down-after-milliseconds指定毫秒數以後,若是尚未響應,就主觀認爲master宕機了。redis
odown 是客觀宕機,若是quorum數量的哨兵都以爲一個master宕機了,就認爲master宕機了。算法
若是一個哨兵在指定時間內,收到了quorum指定數量的其餘哨兵也認爲這個master是sdown了,那麼就認爲是odown了,客觀認爲是master宕機。編輯器
哨兵互相之間的發現,是經過redis的pub/sub系統實現的,每一個哨兵都會往 sentinel:hello這個channel裏面發送一個消息,這時候其餘哨兵均可以消費到這條消息,並感知到其餘哨兵的存在。flex
每隔兩秒鐘,每一個哨兵都會往本身健康的某個master+slaves對應的_sentinel_(能夠理解爲Topic,MQ廣播機制):hello channel裏發送一個消息,內容是本身的host,ip和runid還有對這個master的配置spa
每一個哨兵都會去監聽本身監控的每一個master+slaves對應的_sentinel_:hello channel,而後去感知一樣在監聽這個master+slaves的其餘哨兵的存在。cdn
每一個哨兵還會跟其餘哨兵交換對master的監控配置,互相進行監控配置的同步。blog
哨兵會負責自動糾正salve的一些配置,若是 slave 若是要成爲 master,哨兵會確保slave在複製新的master的數據。排序
若是一個slave鏈接到一個錯誤的master上,好比故障轉移以後,那麼哨兵會確保他們鏈接到正確的master上。ip
若是一個master被認爲odown了,並且majority哨兵會容許主備切換,那麼某個哨兵會執行主備切換操做,此時須要先選舉一個slave出來。選舉的過程當中會考慮slave的一些信息
一個slave跟master斷開鏈接的時間已經超過了down-after-milliseconds的10倍,外加master宕機的時長,那麼salve被認爲不適合被選舉爲master。
(down-after-milliseconds * 10) + millisecond_since_master_is_in_SDOWN_state
quorum: 影響redis客觀宕機,必需要有quorum數量的哨兵認爲master宕機了,才認爲是odown,而後選舉一個哨兵來作主備切換。
majority:影響 選舉 作主備切換的哨兵,選舉出來作哨兵切換的哨兵,必須獲得majority個哨兵的受權,才能正式執行主備切換。
若是quorum < majority, 好比majority就是3,quorum設置爲2,那麼3個哨兵受權就能夠進行主備切換。
若是quorum >= majority, 那麼必須quorum數量的哨兵都受權,好比5個哨兵,quorum是5,那麼必須5個哨兵都同一受權,才能進行主備切換。
哨兵會對一套 redis master+slave進行監控,會有相應的監控的配置
執行切換的按個哨兵,會從要切換到新master (slave->master) 那裏獲得一個configuration epoch,這就是version號,每次切換的version都是惟一的,若是第一個選舉出的哨兵切換失敗了,那麼其餘哨兵,會等待failover-timeout時間,而後接替繼續執行切換,此時會從新獲取一個新的configuration epoch,做爲新的version號。
總結: 執行切換的哨兵會從 新的master那裏獲得一個version號,假如主備切換失敗,意味着:要選舉新的slave,要獲取新的版本號。注意:版本號惟一。
哨兵完成切換以後,會在本身本地更新生成最新的master配置,而後同步給其餘的哨兵,就是經過以前所說的pub/sub消息機制實現。
以前講解的version號也很重要,由於各類消息都是經過一個channel去發佈和監聽的,因此一個哨兵完成一次新的切換,新的master和跟着新的version號的其餘哨兵都是根據版本號的大小來更新本身的master配置的。
總結: 哨兵執行主備切換以後,新的master 的ip,端口號,runid都發生了變化。 哨兵會發送一條消息到 pub/sub 消息系統,通知其餘哨兵 更新最新的master配置。
總結:
本文使用 mdnice 排版