天天看點

淺談Redis Sentinel

什麼是Sentinel

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

淺談Redis Sentinel

定時任務

在redis sentinel中,一共有3個定時任務,通過這些任務,來發現新增節點和節點的狀态。

  1. 每10秒每個sentinel節點對master節點和slave節點執行info操作。
    淺談Redis Sentinel
  2. 每2秒每個sentinel節點通過master節點的channel(sentinel:hello)交換資訊。
    淺談Redis Sentinel
  3. 每1秒每個sentintel節點對master節點和slave節點以及其餘的sentinel節點執行ping操作。
    淺談Redis Sentinel

主觀下線和客觀下線

  • 主觀下線:目前sentintel節點認為某個redis節點不可用。
  • 客觀下線:所有sentinel節點認為某個redis節點不可用。

故障轉移過程

當多個sentinel認為master節點不可用,會進行故障轉移操作,如下圖所示。

淺談Redis Sentinel

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. 啟動1個master節點,2個slave節點。master節點端口号6379,slave節點端口号為6380和6381,如下圖所示。
    淺談Redis Sentinel
  2. 啟動3個sentienl節點,端口号為26379、26380和26381,如下圖所示。
    淺談Redis Sentinel
  3. 先看下主從關系,執行指令

    redis-cli info replication

    ,可以看到端口号為6379的master節點有2個slave節點,端口号為6380和6381。
    淺談Redis Sentinel
  4. 将master程序殺死,因為master的端口是6379,是以我們來看6380的資訊,等一段時間後執行指令

    redis-cli -p 6380 info replication

    ,可以看到6380的slave更新到master了,有一個slave節點,端口号是6381。
    淺談Redis Sentinel
  5. 将6379的redis節點啟動(原來的master),執行指令

    redis-cli -p 6380 info replication

    檢視主從資訊,可以看到原來的master成為了新master的slave。
    淺談Redis Sentinel

繼續閱讀