Sentinel是一個(gè)管理多個(gè)Redis實(shí)例的工具,它可以實(shí)現(xiàn)對(duì) Redis的監(jiān)控、通知、自動(dòng)故障轉(zhuǎn)移。
Sentinel 架構(gòu)示意圖:
image.png
主從復(fù)制的問題
主從復(fù)制可以使得從節(jié)點(diǎn)作為主節(jié)點(diǎn)的備份節(jié)點(diǎn),隨時(shí)替代主節(jié)點(diǎn)進(jìn)行服務(wù)。同時(shí)作為主節(jié)點(diǎn)的讀負(fù)載均衡。
主從復(fù)制同時(shí)存在以下幾個(gè)問題:
- 一旦主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)晉升成主節(jié)點(diǎn),同時(shí)需要修改應(yīng)用方的 主節(jié)點(diǎn)地址,還需要命令所有從節(jié)點(diǎn)去復(fù)制新的主節(jié)點(diǎn),整個(gè)過程需要人工干預(yù)。
- 主節(jié)點(diǎn)的寫能力受到單機(jī)的限制。
- 主節(jié)點(diǎn)的存儲(chǔ)能力受到單機(jī)的限制。
- 原生復(fù)制的弊端在早期的版本中也會(huì)比較突出,比如:Redis 復(fù)制中斷后,從節(jié)點(diǎn)發(fā)起 psync。此時(shí)如果同步不成功,則會(huì)進(jìn)行全量同步,主庫(kù)執(zhí)行全量備份的同時(shí),可能會(huì)造成毫秒或秒級(jí)的卡頓。
Sentinel的作用
Sentinel是獨(dú)立于主從節(jié)點(diǎn)的另一臺(tái)服務(wù)器,主要用于:
- 監(jiān)控
不斷ping主從節(jié)點(diǎn),監(jiān)控主從節(jié)點(diǎn)的是否正常運(yùn)行 - 通知
當(dāng)主從節(jié)點(diǎn)出現(xiàn)問題時(shí),Sentinel會(huì)主動(dòng)回調(diào)配置好的腳本,腳本可以通知管理員解決問題 - 自動(dòng)故障轉(zhuǎn)移
當(dāng)主節(jié)點(diǎn)不能正常提供服務(wù)時(shí),Sentinel會(huì)選舉一個(gè)從節(jié)點(diǎn)作為主節(jié)點(diǎn),完成故障轉(zhuǎn)移。 - 配置提供者
客戶端應(yīng)用直接連接Sentinel,從中獲取主節(jié)點(diǎn)信息。
Sentinel通信命令
- 與Sentinel:
命令 | 作用 |
---|---|
PING | Sentinel 向 Redis 節(jié)點(diǎn)發(fā)送 PING 命令,檢查節(jié)點(diǎn)的狀態(tài) |
INFO | Sentinel 向 Redis 節(jié)點(diǎn)發(fā)送 INFO 命令,獲取它的從節(jié)點(diǎn)信息 |
PUBLISH | Sentinel 向其監(jiān)控的 Redis 節(jié)點(diǎn) __sentinel__:hello 這個(gè) channel發(fā)布自己的信息及主節(jié)點(diǎn)相關(guān)的配置 |
SUBSCRIBE | Sentinel 通過訂閱Redis主節(jié)點(diǎn)和從節(jié)點(diǎn)的__sentinel__:hello 這個(gè) channnel,獲取正在監(jiān)控相同服務(wù)的其他 Sentinel節(jié)點(diǎn) |
- 與主從節(jié)點(diǎn):
命令 | 作用 |
---|---|
PING | Sentinel 向其他 Sentinel 節(jié)點(diǎn)發(fā)送 PING 命令,檢查節(jié)點(diǎn)的狀態(tài) |
SENTINEL:is-master-down-by-addr | 和其他 Sentinel 協(xié)商 主節(jié)點(diǎn) 的狀態(tài),如果 主節(jié)點(diǎn) 處于 SDOWN 狀態(tài),則投票自動(dòng)選出新的主節(jié)點(diǎn) |
Sentinel 工作原理
每個(gè) Sentinel 節(jié)點(diǎn)都需要定期執(zhí)行以下任務(wù):
- 每個(gè)Sentinel以每秒鐘一次的頻率,向它所知的主服務(wù)器、從服務(wù)器以及其他Sentinel實(shí)例發(fā)送一個(gè) PING 命令。
- 如果一個(gè)實(shí)例(instance)距離最后一次有效回復(fù)PING命令的時(shí)間超過down-after-milliseconds所指定的值,那么這個(gè)實(shí)例會(huì)被Sentinel標(biāo)記為主觀下線。
- 如果一個(gè) 主服務(wù)器被標(biāo)記為主觀下線,那么正在監(jiān)視這個(gè)主服務(wù)器的所有Sentinel 節(jié)點(diǎn),要以每秒一次的頻率確認(rèn)主服務(wù)器的確進(jìn)入了主觀下線狀態(tài)。
- 在一般情況下, 每個(gè) Sentinel 會(huì)以每 10 秒一次的頻率,向它已知的所有 主服務(wù)器 和 從服務(wù)器 發(fā)送 INFO 命令。當(dāng)一個(gè) 主服務(wù)器 被 Sentinel 標(biāo)記為 客觀下線 時(shí),Sentinel 向 下線主服務(wù)器 的所有 從服務(wù)器 發(fā)送 INFO 命令的頻率,會(huì)從 10 秒一次改為 每秒一次。
- Sentinel 和其他 Sentinel 協(xié)商 主節(jié)點(diǎn) 的狀態(tài),如果 主節(jié)點(diǎn) 處于 SDOWN 狀態(tài),則投票自動(dòng)選出新的 主節(jié)點(diǎn)。將剩余的 從節(jié)點(diǎn) 指向 新的主節(jié)點(diǎn) 進(jìn)行 數(shù)據(jù)復(fù)制。
- 當(dāng)沒有足夠數(shù)量的 Sentinel 同意 主服務(wù)器 下線時(shí), 主服務(wù)器 的 客觀下線狀態(tài) 就會(huì)被移除。當(dāng) 主服務(wù)器 重新向 Sentinel 的 PING 命令返回 有效回復(fù) 時(shí),主服務(wù)器 的 主觀下線狀態(tài) 就會(huì)被移除。