redis sentinel

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不採用配置的方式獲取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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章