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 作用
- 監(jiān)控: 檢查 redis 節(jié)點(diǎn)健康狀況。
- 故障轉(zhuǎn)移:當(dāng) redis 集群節(jié)點(diǎn)出現(xiàn)故障時,及時自動進(jìn)行故障轉(zhuǎn)移。
- 通知:檢測到 redis 實(shí)例出現(xiàn)故障,通過 api 進(jìn)行通知用戶。
- 提供配置:用戶可以通過命令查詢當(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)移。
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ù)一半以上比較合理。
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)故障
- 當(dāng)對方(master)命令回復(fù)異?;蛘唛L期收不到對方回復(fù),那么 sentinel 發(fā)現(xiàn)了故障,暫時將該節(jié)點(diǎn)標(biāo)記為主動下線。
- sentinel 向其它 sentinel 節(jié)點(diǎn)詢問,是否同樣檢測到該結(jié)點(diǎn)出現(xiàn)故障。
-
其它節(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》。
5. 參考
- Redis Sentinel Documentation
- [redis 源碼走讀] 主從數(shù)據(jù)復(fù)制(上)
- [redis 源碼走讀] 主從數(shù)據(jù)復(fù)制(下)
- 《redis 實(shí)現(xiàn)與設(shè)計(jì)》
- 分布式算法之選舉算法Raft
- 10分鐘弄懂Raft算法
- Redis開發(fā)與運(yùn)維之第九章哨兵(四)--配置優(yōu)化
- 用 gdb 調(diào)試 redis
如果文章不錯,給個點(diǎn)贊唄 ~ 謝謝。??