redis sentinel
sentinel如何獲取master, slave,其他sentinel信息
// sentinel數據結構
struct SentinelStatus {
Dict* masters;
}
// master數據結構
struct SentinelRedisInstance {
Dict* sentinels;
Dict* slaves;
}
- 獲取master信息:
- sentinel監控的master信息事先寫入了sentinel的配置文件
- sentinel啓動時載入配置文件,初始化master字典
- sentinel對master建立命令連接及訂閱連接
- 獲取slave信息:
- sentinel定時向master及已發現的slave發送INFO命令,獲取master及slave信息,更新master的slave字典
- sentinel對新發現的slave建立命令及訂閱連接
- 獲取其他sentinel信息:
- sentinel向所有被監視服務器(master和slave)的
__sentinel:hello__
頻道發送消息。
- 該消息包含sentinel信息,sentinel監視的master信息
- sentinel訂閱
__sentinel:hello__
頻道,從中得到與自己監視相同master的sentinel信息,更新master的sentinel字典 - sentinel發現新的sentinel後,立刻與新sentinel建立命令連接
- sentinel向所有被監視服務器(master和slave)的
小結:爲什麼sentinel不採用配置的方式獲取slave及其他sentinel信息
- sentinel只讀取必要的信息,提高啓動速度
- 通過發佈/訂閱的方式,可以不需要在sentinel啓動前就獲取集羣中所有sentinel信息。當添加新的sentinel或slave時,集羣可以動態發現。
sentinel如何判斷master是否下線
- sentinel定時向所有與它連接的實例(master, slave, sentinel)發送PING命令,根據命令返回值判斷實例是否在線
- 主觀下線
- 在一定時間內,sentinel沒有從實例獲得有效回覆,sentinel認爲實例主觀下線
- sentinel認爲master主觀下線後,會向其他sentinel羣發命令,詢問他們是否認爲master下線
- 有超過quorum個sentinel認爲master下線後,master狀態將變成客觀下線
- 客觀下線
- master狀態變成客觀下線後,sentinel會對master實施故障轉移
sentinel如何實施故障轉移
爲了防止多個sentinel同時監聽到master客觀下線,並同時對master實施故障轉移,sentinel們需要先選舉出領頭的sentinel, 由領頭sentinel負責實施。
如何選擇領頭的sentinel(Raft選舉算法)
- Raft選舉算法介紹
- 每個sentinel都有機會成爲領頭sentinel
- 每個sentinel向其他sentinel發起投票邀請,要求其他sentinel將自己選舉爲局部領頭sentinel
- sentinel接收到第一個投票邀請後,將發起投票邀請的sentinel設置爲自己的局部領頭sentinel,並回復對方。拒絕後面到達的投票邀請
- sentinel收到選民的回覆後,統計自己的票數,如果過半數,自己就成爲領頭sentinel
- 不過半數的話,可能會出現多個sentinel認爲自己是leader
- 如果選舉失敗,將進入下一輪選舉,直至選出leader sentinel
如何實施故障轉移
- 選舉出領頭sentinel後,領頭sentinel篩選下線master的從服務器,從中選出一個作爲新的master。
- sentinel向新master發送slaveof no one命令。在新master身份轉換成功後,向其他從服務器發送slave of newMaster命令,向下線master的數據結構裏記錄slaveof newMaster命令
- 新master篩選規則:
- 根據sentinel與slave的通信時延,slave與舊master的失聯時間,過濾不合格slave
- 根據優先級>複製偏移量>slave id的順序選出新master