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