Sentinel是一個(gè)管理多個(gè)Redis實(shí)例的工具,它可以實(shí)現(xiàn)對(duì) Redis的監(jiān)控、通知、自動(dòng)故障轉(zhuǎn)移朴艰。
Sentinel 架構(gòu)示意圖:
主從復(fù)制的問(wèn)題
主從復(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è)問(wèn)題:
- 一旦主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)晉升成主節(jié)點(diǎn)沫屡,同時(shí)需要修改應(yīng)用方的 主節(jié)點(diǎn)地址饵隙,還需要命令所有從節(jié)點(diǎn)去復(fù)制新的主節(jié)點(diǎn),整個(gè)過(guò)程需要人工干預(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)問(wèn)題時(shí)紊婉,Sentinel會(huì)主動(dòng)回調(diào)配置好的腳本药版,腳本可以通知管理員解決問(wèn)題 - 自動(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 通過(guò)訂閱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í)間超過(guò)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)沒(méi)有足夠數(shù)量的 Sentinel 同意 主服務(wù)器 下線時(shí)庶橱, 主服務(wù)器 的 客觀下線狀態(tài) 就會(huì)被移除。當(dāng) 主服務(wù)器 重新向 Sentinel 的 PING 命令返回 有效回復(fù) 時(shí)贪惹,主服務(wù)器 的 主觀下線狀態(tài) 就會(huì)被移除苏章。