sentinel 模式以100ms(理想狀況下)的速度調用sentinelTimer併發
一、 執行sentinelCheckTiltCondition判斷是否進入tilt模式異步
檢查當前之間與sentinel.previous_time的時間差值,若是爲負值或者大於閥值進入tilt模式,進入tilt模式會發送消息到+tilt頻道函數
二、 執行sentinelHandleDictOfRedisInstances函數spa
對master執行sentinelHandleRedisInstance日誌
i. 嘗試重連若是斷開鏈接的話orm
ii. 發送週期性命令排序
10000ms發送一個info命令ip
a) 異步回覆處理策略it
i. 判斷runnid,更新該master的runnid若是如今ri->runnid = NULL, 若是非NULL, 會比較兩次runnid是否一致,若是不一致認爲master重啓過了,將發送消息到+reboot頻道通知該master重啓了io
ii.
down_after_period小於1000ms,則在down_after_period時間內發送一個ping命令,不然以1000ms爲週期發送
a) 異步回覆處理
i. 根據回覆修改last_avail_time、last_ping_time 和last_pong_time
當回覆PONG、LOADING、MASTERDOWN時,last_avail_time設置爲當前時間,last_ping_time設置爲0
Last_pong_time 設置爲當前時間
大於2000ms發送一個hello
a) 異步回覆處理
i. 修改上次pub時間last_pub_time
iii. 檢驗tilt模式
噹噹前時間減去sentinel.tilt_start_time 大於30個ping週期,一共30s時,取消tilt模式,併發送消息到頻道-tilt中
iv. 檢查master是否主觀下線
檢驗命令線路:當前時間- 命令鏈接建立時間,而且未收到ok(狀態爲PONG,LOADING,MASTERDOWN)的ping回覆,而且當前時間-last_ping_time 大於 down_after_period/2 ,而且當前時間-last_pong_time 大於 down_after_perod/2。斷開鏈接
檢驗pubsub線路:當前時間-pubsub鏈路創建時間大於最小重連週期15s,而且當前時間-上一次收到消息是3倍的publish週期,則kill掉鏈接
若是last_ping_time 不等於0(不等於0表示收到的ping回覆不是PONG,LOADDING,MASTERDOWN的任意一種),而且當前時間-last_ping_time的差值大於down_after_peroid而且role_reported爲slave,當前時間減去role_reported_time 大於down_after_peroid+2倍的info命令週期,設爲主觀下線,併發送消息到+sdown頻道,不然取消主觀下線,發送消息到-sdown頻道(即master從新活起來了)
v. 檢查master是否客觀下線
首先它得是主觀下線狀態,若是不是主觀下線狀態取消客觀下線,併發消息到-odown頻道。
若是sentinel認爲該master是主觀下線,那麼計算該master下面的sentinel認爲該master是主觀下線的個數,若是個數大於該master的quorum,則認爲是客觀下線,併發送消息到+odown頻道
vi. 是否須要故障轉移
前提必須是已是客觀下線狀態
若是當前時間與上一次嘗試故障轉移的時間的差值小於該master的failover_timeout的2倍,寫日誌,return
若是不是以上的兩種狀況,開始故障轉移
a) 設置該master的failover_state 爲SENTINEL_FAILOVER_STATE_WAIT_START
b) 設置該master的flag爲SRI_FAILOVER_IN_PROGRESS
c) 發送sentinel is-master-down-by-addr 命令自薦爲局部領頭sentinel
i. 先到者先得或者請求者紀元大於被請求者的局部領導紀元,請求者將設爲被請求者的局部領頭sentinel。
ii. 請求者收被請求者的應答後更新本身的爲響應信息中指定的局部領頭(多是本身也多是被請求者原來的局部領頭sentinel,二者達成一致)
iii. 統計局部領頭sentinel的得票數,超過通常爲領頭sentinel
領頭sentinel進入SENTINEL_FAILOVER_STATE_SELECT_SLAVE狀態
i. 找出有效的slave
slave不能是SRI_S_DOWN|SRI_O_DOWN|SRI_DISCONNECTED的任意一個
slave->slave_priority 不能爲0
slave->last_avail_time不能大於5個sentinel ping 週期即5s
slave->info_refresh時間必須是在3個sentinel info時間週期內,即30s
slave->master_link_down_time 不能大於(如今的時間-減去主觀down的時間+10個down_after_prioid
ii. 對有效的slave進行快速排序,對比slave的priority
iii. 第一個爲推薦的slave
iv. 若是沒有找到推薦的slave,清除failover標記,從新嘗試
進入SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE
i. 發送slaveof no one 命令給推薦的slave,使得其進入完成slave到master的轉換
進入SENTINEL_FAILOVER_STATE_WAIT_PROMOTION狀態
i. 等待slave完成轉換,檢查當前時間與剛進入該狀態的時間差值,當這個差值超過failover_time時,重置failover狀態,從新嘗試
ii. 經過向slave發送info命令,發現該slave的role變爲master,說明完成slave到master的轉換,進入SENTINEL_FAILOVER_STATE_RECONF_SLAVES狀態
進入SENTINEL_FAILOVER_STATE_RECONF_SLAVES狀態
i. 給slave發送slave of promoted_slave’s ip prmmoted_slave’s port完成其餘slave的master爲新的master
ii. 檢查全部的slave狀態是否完成指向新的master,全部以完成,這些狀態信息來自於法案送info消息給slave,進入SENTINEL_FAILOVER_STATE_UPDATE_CONFIG狀態。
進入SENTINEL_FAILOVER_STATE_UPDATE_CONFIG狀態
重置信息