1. 程式人生 > 實用技巧 >redis高可用--sentinel哨兵

redis高可用--sentinel哨兵

1.sentinel介紹

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-sentinel本身也是一個獨立執行的程序,它能監控多個master-slave叢集,發現master宕機後能進行自動切換。

# 必須在redis主從已經做好的前提下

2.sentinel的構造

Sentinel 是一個監視器,它可以根據被監視例項的身份和狀態來判斷應該執行何種動作。

3.sentinel的功能

1.監控(Monitoring):
Sentinel會不斷地檢查你的主伺服器和從伺服器是否運作正常。

2.提醒(Notification):
當被監控的某個Redis伺服器出現問題時,Sentinel可以通過API向管理員或者其他應用程式傳送通知。

3.自動故障遷移(Automatic failover):
當一個主伺服器不能正常工作時,Sentinel會開始一次自動故障遷移操作,它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;當客戶端試圖連線失效的主伺服器時,叢集也會向客戶端返回新主伺服器的地址,使得叢集可以使用新主伺服器代替失效伺服器。

4.sentinel的具體工作

1.Sentinel通過使用者給定的配置檔案來發現主伺服器
2.Sentinel會與被監視的主伺服器建立兩個網路連線:
    命令連線用於向主伺服器傳送命令。
    訂閱連線用於訂閱指定的頻道,從而發現監視同一主伺服器的其他Sentinel。
3.Sentinel通過向主伺服器傳送INFO命令來自動獲得所有從伺服器的地址。
4.發現其他sentinel
	Sentinel 會通過命令連線向被監視的主從伺服器傳送 “HELLO” 資訊,該訊息包含 Sentinel 的 IP、埠號、ID 等內容,以此來向其他 Sentinel 宣告自己的存在。與此同時Sentinel 會通過訂閱連線接收其他 Sentinel 的“HELLO” 資訊,以此來發現監視同一個主伺服器的其他 Sentinel 。
5.多個Sentinel之間只會互相建立命令連線,用於進行通訊。因為已經有主從伺服器作為傳送和接收HELLO資訊的中介,所以Sentinel之間不會建立訂閱連線。
6.檢測例項的狀態:
	Sentinel使用PING命令來檢測例項的狀態:如果例項在指定的時間內沒有返回回覆,或者返回錯誤的回覆,那麼該例項會被 Sentinel 判斷為下線。
	Redis的Sentinel中關於下線(down)有兩個不同的概念:
	1)主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 例項對伺服器做出的下線判斷。
	2)客觀下線(Objectively Down,簡稱 ODOWN)指的是多個Sentinel例項在對同一個伺服器做出SDOWN判斷,並且通過SENTINEL is-master-down-by-addr命令互相交流之後,得出的伺服器下線判斷。(一個 Sentinel可以通過向另一個Sentinel傳送SENTINEL is-master-down-by-addr命令來詢問對方是否認為給定的伺服器已下線。)

5.故障轉移流程

一次故障轉移操作由以下步驟組成:
1.發現主伺服器已經進入客觀下線狀態。
2.基於Raft leader election協議,進行投票選舉
3.如果當選失敗,那麼在設定的故障遷移超時時間的兩倍之後,重新嘗試當選。如果當選成功,那麼執行以下步驟。
	1)選出一個從伺服器,並將它升級為主伺服器。
	2)向被選中的從伺服器傳送 SLAVEOF NO ONE 命令,讓它轉變為主伺服器。
	3)通過釋出與訂閱功能,將更新後的配置傳播給所有其他Sentinel,其他Sentinel對它們自己的配置進行更新。
	4)向已下線主伺服器的從伺服器傳送SLAVEOF命令,讓它們去複製新的主伺服器。
	5)當所有從伺服器都已經開始複製新的主伺服器時, leader Sentinel 終止這次故障遷移操作。

6.sentinel選擇主庫的規則

1.在失效主伺服器屬下的從伺服器當中,那些被標記為主觀下線、已斷線、或者最後一次回覆PING命令的時間大於五秒鐘的從伺服器都會被淘汰。
2.在失效主伺服器屬下的從伺服器當中,那些與失效主伺服器連線斷開的時長超過down-after選項指定的時長十倍的從伺服器都會被淘汰。
3.在經歷了以上兩輪淘汰之後剩下來的從伺服器中,我們選出複製偏移量(replication offset)最大的那個從伺服器作為新的主伺服器;如果複製偏移量不可用,或者從伺服器的複製偏移量相同,那麼帶有最小執行ID的那個從伺服器成為新的主伺服器。

7.sentinel特性

1.Sentinel自動故障遷移使用Raft演算法來選舉領頭(leader)Sentinel ,從而確保在一個給定的週期(epoch)裡,只有一個領頭產生。
2.這表示在同一個週期中,不會有兩個 Sentinel 同時被選中為領頭,並且各個 Sentinel 在同一個節點中只會對一個領頭進行投票。
3.更高的配置節點總是優於較低的節點,因此每個 Sentinel 都會主動使用更新的節點來代替自己的配置。

# 簡單來說,我們可以將Sentinel配置看作是一個帶有版本號的狀態。一個狀態會以最後寫入者勝出(last-write-wins)的方式(也即是,最新的配置總是勝出)傳播至所有其他Sentinel。