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的一些信息
- 跟master斷開連接的時長
- slave優先級
- 複製offset
- 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如何排序?
- 按照slave優先級進項排序,slave priority越低,優先級越高
- 如果slave priority相同,那麼看replicate offset,哪個slave複製了更多的數據,offset越靠後,優先級就越高。
- 如果上面兩個條件都相同,那麼就選擇一個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配置。
總結: