Sentinel (哨兵)是Redis的高可用性解決方案:由一個或多個sentinel實體組成的sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,并在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器,然后由新的主服務器代替已下線的主服務器繼續處理命令請求,


- Sentinel只是一個運行在特殊模式下的Redis服務器,它使用了和普通模式不同的命令表,所以sentinel模式能夠使用的命令和普通Redis服務器能夠使用的命令不同,

- Sentinel會讀入用戶指定的組態檔,為每個要被監視的主服務器創建相應的實體結構,并創建連向主服務器的命令連接和訂閱連接,其中命令連接用于向主服務器發送命令請求,而訂閱連接用于接收指定頻道的訊息
- Sentinel通過向主服務器發送INFO命令來獲得主服務器屬下所有從服務器的地址資訊,并為這些從服務器創建相應的實體結構,以及連向這些從服務器的命令連接和訂閱連接
- 在一般情況下,Sentinel以每十秒一次的頻率向被監視的主服務器和從服務器發送INFO命令,當主服務器處于下線狀態,或者Sentinel正在對主服務器進行故障轉移操作時,Sentinel向從服務器發送INFO命令的頻率會改為每秒一次
- 對于監視同一個主服務器和從服務器的多個Sentinel來說,它們會以每兩秒一次的頻率,通過向被監視服務器的_sentinel_:hello頻道發送訊息來向其他Sentinel宣告自己的存在
- 每個Sentinel也會從_sentinel_:hello頻道中接收其他Sentinel發來的訊息,并根據這些資訊為其他Sentinel創建相應的實體結構,以及命令連接
- Sentinel只會與主服務器和從服務器創建命令連接和訂閱連接,Sentinel與Sentinel之間則只創建命令連接
- Sentinel以每秒一次的頻率向實體(包括主服務器、從服務器、其他Sentinel)發送PING命令,并根據實體對PING命令的回復來判斷實體是否在線,當一個實體在指定的時長中連接向Sentinel發送無效回復時,Sentinel會將這個實體判斷為主觀下線
- 當Sentinel將一個主服務器判斷為主觀下線時,它會向同樣監視這個主服務器的其他Sentinel進行詢問,看它們是否同意這個主服務器已經進入主觀下線狀態
- 當一個Sentinel收集到足夠多的主觀下線投票后,它會將主服務器判斷為客觀下線,并發起針對主服務器的故障轉移操作
- 每個發現主服務器客觀下線的Sentinel都會通過向其他Sentinel發送SENTINEL is-master-down-by-addr命令要求其他Sentinel將自己設定為區域領頭Sentinel,設定區域領頭Sentinel的規則是先到先得,如果某個Sentinel被半數以上的Sentinel設定成了區域領頭Sentinel,那么這個Sentinel成為領頭Sentinel,如果在給定時限內,沒有選出,將在一段時間后再次進行選舉,
如果選舉新的主服務器?
領頭的Sentinel會將已下線主服務器的所有從服務器保存到一個串列里面,然后按以下規則進行過濾:
1) 洗掉串列中所有處于下線或者斷線狀態的從服務器
2) 洗掉串列中所有最近五秒內沒有回復過領頭Sentinel的INFO命令的從服務器
3) 洗掉所有與已下線主服務器連接斷開超過down-after-milliseconds * 10毫秒的從服務器
之后,領頭Sentinel將根據從服務器的優先級,對串列中剩余的從服務器進行排序,并選出其中優先級最高的從服務器,
如果存在多個具有相同最高優先級的從服務器,那么領頭Sentinel將選擇從服務器中復制偏移量最大的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296146.html
標籤:其他
上一篇:第七章 復制
下一篇:第九章 集群
