Redis Sentinel 架構原理詳解(二)

前言

前面在Redis Sentinel 架構原理詳解(一)中,我們學習了redis哨兵中的主從切換原理,也知道了sentinel集羣在redis高可用架構中的作用。這裏再和大家一起學習下sentinel 集羣是如何實現節點監控的。

sentinel集羣的監控功能詳解

sentinel 集羣通過三個定時監控任務完成對各個節點發現和監控。

1. 每隔10秒,每個 sentinel 節點會向主節點和從節點發送 info 命令獲取 redis 主從架構的最新情況。例如,發送info replication命令可以得到以下信息:

node01:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.239.102,port=6379,state=online,offset=18621889,lag=1
slave1:ip=192.168.239.103,port=6379,state=online,offset=18621889,lag=1

這樣,sentinel集羣就可以得知master和slave的基本信息,通過向主節點執行info命令,獲取從節點的信息,所以sentinel節點不需要顯式配置監控從節點,當有新的從節點加入時都可以立刻感知出來,當master節點故障或者故障轉移後,可以通過info命令實時更新redis主從信息。

2. 每隔2秒,每個sentinel節點會向redis 數據節點的__sentinel__:hello這個channel(頻道)發送一條消息,消息的內容是:

<sentinel ip> <sentinel port> <sentinel runId> <Sentinel 配置版本>
<master name> <master ip> <master port> <master 配置版本>

每個sentinel節點會訂閱該channel,來了解其他sentinel節點以及它們對主節點的判斷,所以這個定時任務可以完成以下兩個工作:

  • 發現新的 sentinel節點:通過訂閱主節點的__sentinel__:hello瞭解其他的sentinel 節點信息,如果是新加入的sentinel 節點,將該sentinel 節點信息保存起來,並與該sentinel節點創建連接
  • sentinel節點之間交換主節點的狀態,用於確認master下線和故障處理的leader選舉。

3. 每隔1秒,每個 sentinel 節點會向主節點、從節點、其餘 sentinel 節點發送一條ping命令做一次心跳檢測,來確認這些節點是否可達。通過定時發送ping命令,sentinel 節點對主節點、從節點、其餘 sentinel 節點都建立起連接,實現了對每個節點的監控,這個定時任務是節點下線判定的重要依據。

sdown(主觀下線)和odown(客觀下線)

  1. 主觀下線
    每個 sentinel節點每隔1秒對主節點、從節點、其他sentinel節點發送ping 命令做心跳檢測,當這些節點超過
    down-after-milliseconds沒有進行有效回覆,sentinel節點就會認爲該節點下線,這個行爲叫做主觀下線。主觀下線是某個 sentinel 節點的判斷,並不是 sentinel 集羣的判斷,所以存在誤判的可能。

  2. 客觀下線
    當 sentinel 主觀下線的節點是主節點時,該 sentinel 節點會通過sentinel ismaster-down-by-addr命令向其他 sentinel 節點詢問對主節點的判斷,當超過<quorum>個數(quorum可配置)的 sentinel 節點認爲主節點確實有問題,這時該 sentinel 節點會做出客觀下線的決定,這樣客觀下線的含義是比較明顯了,也就是大部分是 sentinel 節點都對主節點的下線做了同意的判定,那麼這個判定就是客觀的。

介紹一下sentinel is-master-down-by-addr命令:

sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid>

ip、port:詢問此 ip:port的redis進程是否下線
current_epoch:當前配置版本
runid:如果爲當前sentinel節點的runid,則此命令用於申請自己成爲故障處理的leader,如果是*,則此命令用於向其他sentinel 節點確認master 是否下線。

此命令返回結果包括3個信息:

  • down_state:目標 sentinel 節點對於主節點的下線判斷,1是下線,0是在線。
  • leader_runid:當leader_runid等於*時,代表返回結果是說明主節點是否不可達,當 leader_runid 等於具體的runid,代表目標節點同意該 runid sentinel 節點成爲 leader。
  • leader_epoch:leader 版本。

總結

上面介紹了redis集羣中sentinel的三種定時監控任務,還了解了主觀下線,客觀下線的概念,以及sentinel is-master-down-by-addr命令的作用,後續我們再一起學習下進行故障轉移前sentinel如何選舉leader,以及redis集羣中新的master如何選擇。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章