[redis 源碼走讀] sentinel 哨兵 - 原理

redis 有主從數(shù)據(jù)復(fù)制功能。多個實(shí)例通過讀寫分離,使得單進(jìn)程的 redis 可以充分利用多核性能。

當(dāng)某些 redis 實(shí)例出現(xiàn)故障怎么辦,服務(wù)還能正常工作嗎?這時候故障管理者 sentinel 應(yīng)運(yùn)而生。它負(fù)責(zé) redis 集群管理工作:檢查故障,發(fā)現(xiàn)故障,轉(zhuǎn)移故障,從而保證集群高可用。

?? 文章來源 《[redis 源碼走讀] sentinel 哨兵 - 原理》


1. sentinel 作用

  1. 監(jiān)控: 檢查 redis 節(jié)點(diǎn)健康狀況。
  2. 故障轉(zhuǎn)移:當(dāng) redis 集群節(jié)點(diǎn)出現(xiàn)故障時,及時自動進(jìn)行故障轉(zhuǎn)移。
  3. 通知:檢測到 redis 實(shí)例出現(xiàn)故障,通過 api 進(jìn)行通知用戶。
  4. 提供配置:用戶可以通過命令查詢當(dāng)前 redis 集群相關(guān)信息。

2. 集群

2.1. 角色關(guān)系

redis 高可用集群,有三種角色:master,slave,sentinel。

  • slave 與 master 通信,為了數(shù)據(jù)復(fù)制。
  • sentinel 與 master / slave 通信,為了對 master / slave 進(jìn)行管理:檢查故障,發(fā)現(xiàn)故障,轉(zhuǎn)移故障。
  • sentinel 節(jié)點(diǎn)之間通信,為了選舉 leader,通過 leader 進(jìn)行集群故障轉(zhuǎn)移。
高可用節(jié)點(diǎn)通信關(guān)系

2.2. 節(jié)點(diǎn)鏈接

sentinel 只要配置 redis 主服務(wù)(master)信息即可與三個角色建立聯(lián)系。

# sentinel.conf
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2

<quorum> 是法定人數(shù)。作用:多個 sentinel 進(jìn)行相互選舉,有超過一定法定人數(shù)選舉某人為領(lǐng)導(dǎo),那么他就成為 sentinel 的領(lǐng)導(dǎo),領(lǐng)導(dǎo)負(fù)責(zé)故障轉(zhuǎn)移。這個法定人數(shù),可以配置,一般是 sentinel 個數(shù)一半以上 (\frac{n}{2} + 1) 比較合理。

節(jié)點(diǎn)關(guān)聯(lián)
sentinel <--> master,sentinel <--> slave,sentinel A <--> sentinel B
  • sentinel 向 master 獲取 slave 信息,與 slave 建立連接。

    master 與 slave 是主從關(guān)系,master 擁有所有 slave 的鏈接信息。sentinel 只要配置 master 的 ip 和 port,鏈接 master,并通過 info 命令就能獲得 slave 的 ip 和 port 信息。這樣 sentinel 就可以與 slave 建立鏈接。

  • 多個 sentinel 相互鏈接。

    通過以上步驟,sentinel 可以鏈接 master / slave。而多個 sentinel 通過發(fā)布/訂閱 master / slave 的 __sentinel__:hello 頻道進(jìn)行發(fā)布和接收信息。多個 sentinel 不需要配置對方的信息,就能獲得通過這個流程獲得其它 sentinel 的信息并進(jìn)行相互鏈接。

詳細(xì)流程,可以參考 《[redis 源碼走讀] sentinel 哨兵 - 節(jié)點(diǎn)鏈接流程


3. 故障

sentinel 監(jiān)控流程:檢測故障 -> 發(fā)現(xiàn)故障 -> 處理故障。

redis 集群三個角色 sentinel / master / slave 都可能出現(xiàn)故障,當(dāng) redis master 出現(xiàn)故障,sentinel leader 對集群進(jìn)行故障轉(zhuǎn)移。


3.1. 檢測故障

角色節(jié)點(diǎn)之間建立了聯(lián)系,那么 sentinel 與其它節(jié)點(diǎn)通過定期發(fā)送相應(yīng)命令(PING / INFO / PUBLISH)進(jìn)行相互通信。


3.2. 發(fā)現(xiàn)故障

  1. 當(dāng)對方(master)命令回復(fù)異?;蛘唛L期收不到對方回復(fù),那么 sentinel 發(fā)現(xiàn)了故障,暫時將該節(jié)點(diǎn)標(biāo)記為主動下線。
  2. sentinel 向其它 sentinel 節(jié)點(diǎn)詢問,是否同樣檢測到該結(jié)點(diǎn)出現(xiàn)故障。
  3. 其它節(jié)點(diǎn)回復(fù)確認(rèn)故障,當(dāng)前 sentinel 將該節(jié)點(diǎn)標(biāo)記為客觀下線。


    發(fā)現(xiàn)故障

3.3. 故障轉(zhuǎn)移

  • sentinel 選舉 leader。
  • sentinel leader 根據(jù)規(guī)則篩選合適的 slave 作為 master。
  • 通知其它 slave 鏈接新的 master。
  • 舊 master 如果重新上線,被 sentinel 設(shè)置成為新 master 的 slave。

4. 源碼走讀

通過 gdb 調(diào)試,去落實(shí) sentinel 的源碼工作流程。

在 main 函數(shù)入口下斷點(diǎn),在 sentinel.c 源碼文件里,幾乎每個函數(shù)都下斷點(diǎn),啟動調(diào)試,這個方法好像有點(diǎn)笨,但是這樣每個細(xì)節(jié)流程都不會錯過(_!)。

調(diào)試請參考 《用 gdb 調(diào)試 redis》。

啟動調(diào)試

5. 參考


如果文章不錯,給個點(diǎn)贊唄 ~ 謝謝。??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容