詳解redis sentinel(哨兵模式)的原理和機制

三個定時任務

sentinel在內部有3個定時任務redis

1.每10秒每一個sentinel會對master和slave執行info命令網絡

這個任務達到兩個目的:spa

1.發現slave節點ip

2.確認主從關係it

2.每2秒每一個sentinel經過master節點的channel交換信息(pub/sub)io

master節點上有一個發佈訂閱的頻道(__sentinel__:hello)。ast

sentinel節點經過__sentinel__:hello頻道進行信息交換(對節點的"見解"和自身的信息),達成共識。監控

3.每1秒每一個sentinel對其餘sentinel和redis節點執行ping操做(相互監控)配置

這個實際上是一個心跳檢測,是失敗斷定的依據。定時任務

主觀下線和客觀下線

在redis-sentinel的conf文件裏有這麼兩個配置:

1.sentinel monitor <masterName> <ip> <port> <quorum>

四個參數含義:

masterName這個是對某個master+slave組合的一個區分標識(一套sentinel是能夠監聽多套master+slave這樣的組合的)。

ip 和 port 就是master節點的 ip 和 端口號。

quorum這個參數是進行客觀下線的一個依據,意思是至少有 quorum 個sentinel主觀的認爲這個master有故障,纔會對這個master進行下線以及故障轉移。由於有的時候,某個sentinel節點可能由於自身網絡緣由,致使沒法鏈接master,而此時master並無出現故障,因此這就須要多個sentinel都一致認爲該master有問題,才能夠進行下一步操做,這就保證了公平性和高可用。

2.sentinel down-after-milliseconds <masterName> <timeout> 

這個配置其實就是進行主觀下線的一個依據,masterName這個參數不用說了,timeout是一個毫秒值,表示:若是這臺sentinel超過timeout這個時間都沒法連通master包括slave(slave不須要客觀下線,由於不須要故障轉移)的話,就會主觀認爲該master已經下線(實際下線須要客觀下線的判斷經過纔會下線)

那麼,多個sentinel之間是如何達到共識的呢?

這就是依賴於前面說的第二個定時任務,某個sentinel先將master節點進行一個主觀下線,而後會將這個斷定經過sentinel is-master-down-by-addr這個命令問對應的節點是否也一樣認爲該addr的master節點要作客觀下線。最後當達成這一共識的sentinel個數達到前面說的quorum設置的這個值時,就會對該master節點下線進行故障轉移。quorum的值通常設置爲sentinel個數的二分之一加1,例如3個sentinel就設置2

領導者選舉

爲何要選領導者?由於只能有一個sentinel節點去完成故障轉移

sentinel is-master-down-by-addr這個命令有兩個做用,一是確認下線斷定,二是進行領導者選舉。

選舉過程:

1.每一個作主觀下線的sentinel節點向其餘sentinel節點發送上面那條命令,要求將它設置爲領導者。

2.收到命令的sentinel節點若是尚未贊成過其餘的sentinel發送的命令(還未投過票),那麼就會贊成,不然拒絕。

3.若是該sentinel節點發現本身的票數已通過半且達到了quorum的值,就會成爲領導者

4.若是這個過程出現多個sentinel成爲領導者,則會等待一段時間從新選舉。

故障轉移

所謂故障轉移就是當master宕機,選一個合適的slave來晉升爲master的操做,redis-sentinel會自動完成這個,不須要咱們手動來實現。

那麼,如何選擇一個合適的slave呢?順序以下:

1.選擇slave-priority(slave節點優先級配置)最高的slave節點,(默認都是同樣的)例如:若是咱們有兩臺slave在兩臺機器上,一臺配置較高,咱們但願當master掛掉優先選配置高的,就能夠配置該值爲slave中最高的。若是存在最高則返回,不存在繼續

2.選擇複製偏移量最大的節點(複製得最完整,與master節點的數據一致性更高),若是存在則返回,不存在繼續

3.若是以上兩個條件都不知足,選runId最小的(啓動最先的)。

補充一點:還能夠向任意sentinel發生sentinel failover <masterName> 進行手動故障轉移,這樣就不須要通過上述主客觀和選舉的過程。

相關文章
相關標籤/搜索