一、概述
Sentinel(哨兵、哨崗)是Redis的高可用性解決方案。由一個或多個Sentinel實例組成的Sentinel系統
Redis Sentinel 是一個分佈式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從服務器作爲新的主服務器。
Redis的哨兵(sentinel) 系統用於管理多個 Redis 服務器,該系統執行以下三個任務:
監控(Monitoring): 哨兵(sentinel) 會不斷地檢查你的Master和Slave是否運作正常。
提醒(Notification):當被監控的某個 Redis出現問題時, 哨兵(sentinel) 可以通過 API 向管理員或者其他應用程序發送通知。
自動故障遷移(Automatic failover):當一個Master不能正常工作時,哨兵(sentinel) 會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級爲新的Master, 並讓失效Master的其他Slave改爲複製新的Master; 當客戶端試圖連接失效的Master時,集羣也會向客戶端返回新Master的地址,使得集羣可以使用Master代替失效Master。
二、爲什麼需要用到哨兵?
哨兵(Sentinel)主要是爲了解決在主從複製架構中出現宕機的情況,主要分爲兩種情況:1.主服務器宕機 2.從服務器宕機
從Redis宕機
這個相對而言比較簡單,在Redis中從庫重新啓動後會自動加入到主從架構中,自動完成同步數據。在Redis2.8版本後,主從斷線後恢復的情況下實現增量複製。
主Redis宕機
這個相對而言就會複雜一些,需要以下2步才能完成
i.第一步,在從數據庫中執行SLAVEOF NO ONE命令,斷開主從關係並且提升爲主庫繼續服務
ii.第二步,將主庫重新啓動後,執行SLAVEOF命令,將其設置爲其他庫的從庫,這時數據就能更新回來
由於這個手動完成恢復的過程其實是比較麻煩的並且容易出錯,所以Redis提供的哨兵(sentinel)的功能來解決.
三、Sentinel狀態持久化
snetinel的狀態會被持久化地寫入sentinel的配置文件中。每次當收到一個新的配置時,或者新創建一個配置時,配置會被持久化到硬盤中,並帶上配置的版本戳。這意味着,可以安全的停止和重啓sentinel進程。
四、主觀下線和客觀下線
默認情況下,每個 Sentinel
節點會以 每秒一次 的頻率對 Redis
節點和 其它 的 Sentinel
節點發送 PING
命令,並通過節點的 回覆 來判斷節點是否在線。
- 主觀下線
主觀下線 適用於所有 主節點 和 從節點。如果在 down-after-milliseconds
(Sentinel配置文件中的down-after-milliseconds判斷實例進入主觀下線的所需的時間長度)毫秒內,Sentinel
沒有收到 目標節點 的有效回覆,則會判定 該節點 爲 主觀下線。
- 客觀下線
客觀下線 只適用於 主節點。如果 主節點 出現故障,Sentinel
節點會通過 sentinel is-master-down-by-addr
命令,向其它 Sentinel
節點詢問對該節點的 狀態判斷。如果超過 <quorum>
個數的節點判定 主節點 不可達,則該 Sentinel
節點會判斷 主節點 爲 客觀下線。
五、semtinel 工作原理
每個 Sentinel
節點都需要 定期執行 以下任務:
- 每個
Sentinel
以 每秒鐘 一次的頻率,向它所知的 主服務器、從服務器 以及其他Sentinel
實例 發送一個PING
命令。
1.如果一個 實例(instance
)距離 最後一次 有效回覆 PING
命令的時間超過 down-after-milliseconds
所指定的值,那麼這個實例會被 Sentinel
標記爲 主觀下線。
2.如果一個 主服務器 被標記爲 主觀下線,那麼正在 監視 這個 主服務器 的所有 Sentinel
節點,要以 每秒一次 的頻率確認 主服務器 的確進入了 主觀下線 狀態。
3.如果一個 主服務器 被標記爲 主觀下線,並且有 足夠數量 的 Sentinel
(至少要達到 配置文件 指定的數量)在指定的 時間範圍 內同意這一判斷,那麼這個 主服務器 被標記爲 客觀下線。
4.在一般情況下, 每個 Sentinel
會以每 10
秒一次的頻率,向它已知的所有 主服務器 和 從服務器 發送 INFO
命令。當一個 主服務器 被 Sentinel
標記爲 客觀下線 時,Sentinel
向 下線主服務器 的所有 從服務器 發送 INFO
命令的頻率,會從 10
秒一次改爲 每秒一次。
6.監視這個下線服務器的Sentinel
和其他 Sentinel
協商 主節點 的狀態,如果 主節點 處於 SDOWN
狀態,則投票自動選出新的 主節點。將剩餘的 從節點 指向 新的主節點 進行 數據複製。
7.當沒有足夠數量的 Sentinel
同意 主服務器 下線時, 主服務器 的 客觀下線狀態 就會被移除。當 主服務器 重新向 Sentinel
的 PING
命令返回 有效回覆 時,主服務器 的 主觀下線狀態 就會被移除。
注意:一個有效的
PING
回覆可以是:+PONG
、-LOADING
或者-MASTERDOWN
。如果 服務器 返回除以上三種回覆之外的其他回覆,又或者在 指定時間 內沒有回覆PING
命令, 那麼Sentinel
認爲服務器返回的回覆 無效(non-valid
)。
參考博客:https://juejin.im/post/5b7d226a6fb9a01a1e01ff64
https://blog.csdn.net/macro_g/article/details/82593996