什麼是Sentinel
Redis Sentinel是一個用來監控redis叢集中節點的狀态,不用來存儲資料。當叢集中的某個節點有故障時,可以自動的進行故障轉移的操作。通常為了保證sentinel的高可用,sentinel也會部署多個。sentinel的結構圖如下所示:

定時任務
在redis sentinel中,一共有3個定時任務,通過這些任務,來發現新增節點和節點的狀态。
- 每10秒每個sentinel節點對master節點和slave節點執行info操作。
淺談Redis Sentinel - 每2秒每個sentinel節點通過master節點的channel(sentinel:hello)交換資訊。
淺談Redis Sentinel - 每1秒每個sentintel節點對master節點和slave節點以及其餘的sentinel節點執行ping操作。
淺談Redis Sentinel
主觀下線和客觀下線
- 主觀下線:目前sentintel節點認為某個redis節點不可用。
- 客觀下線:所有sentinel節點認為某個redis節點不可用。
故障轉移過程
當多個sentinel認為master節點不可用,會進行故障轉移操作,如下圖所示。
1. 上司者選舉
作用:選舉出一個sentenel節點作為上司者去進行故障轉移操作。
過程:
1). 每個做主觀下線的sentinel節點向其他sentinel節點發送上面那條指令,要求将它設定為上司者。
2). 收到指令的sentinel節點如果還沒有同意過其他的sentinel發送的指令(還未投過票),那麼就會同意,否則拒絕。
3). 如果該sentinel節點發現自己的票數已經過半且達到了quorum的值,就會成為上司者。
4). 如果這個過程出現多個sentinel成為上司者,則會等待一段時間重新選舉。
2. 選出新的master節點
redis sentinel會選一個合适的slave來更新為master,那麼,如何選擇一個合适的slave呢?順序如下:
1). 選擇slave-priority最高的slave節點(預設是相同)。
2). 選擇複制偏移量最大的節點。
3). 如果以上兩個條件都不滿足,選runId最小的(啟動最早的)。
3. 更改slave節點的master節點
當選舉出新的master節點後,會将其餘的節點變更為新的master節點的slave節點,如果原有的master節點重新上線,成為新的master節點的slave節點。
4. 通知用戶端
當所有節點配置結束後,sentinel會通知用戶端節點變更資訊。
5. 用戶端連接配接新的master節點
用戶端收到節點資訊後,會連接配接新的master節點。
故障轉移操作
- 啟動1個master節點,2個slave節點。master節點端口号6379,slave節點端口号為6380和6381,如下圖所示。
淺談Redis Sentinel - 啟動3個sentienl節點,端口号為26379、26380和26381,如下圖所示。
淺談Redis Sentinel - 先看下主從關系,執行指令
,可以看到端口号為6379的master節點有2個slave節點,端口号為6380和6381。redis-cli info replication
淺談Redis Sentinel - 将master程序殺死,因為master的端口是6379,是以我們來看6380的資訊,等一段時間後執行指令
,可以看到6380的slave更新到master了,有一個slave節點,端口号是6381。redis-cli -p 6380 info replication
淺談Redis Sentinel - 将6379的redis節點啟動(原來的master),執行指令
檢視主從資訊,可以看到原來的master成為了新master的slave。redis-cli -p 6380 info replication
淺談Redis Sentinel