redis的Sentinel 系統

來源:互聯網
上載者:User
Sentinel¶

本文檔翻譯自: http://redis.io/topics/sentinel 。

Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance), 該系統執行以下三個任務: 監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。 提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。 自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當用戶端試圖串連失效的主伺服器時, 叢集也會向用戶端返回新主伺服器的地址, 使得叢集可以使用新主伺服器代替失效伺服器。

Redis Sentinel 是一個分布式系統, 你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主伺服器是否下線的資訊, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從伺服器作為新的主伺服器。

雖然 Redis Sentinel 釋出為一個單獨的可執行檔 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 伺服器, 你可以在啟動一個普通 Redis 伺服器時通過給定 --sentinel 選項來啟動 Redis Sentinel 。

Redis Sentinel 目前仍在開發中, 這個文檔的內容可能隨著 Sentinel 實現的修改而變更。

Redis Sentinel 相容 Redis 2.4.16 或以上版本, 推薦使用 Redis 2.8.0 或以上的版本。 擷取 Sentinel

目前 Sentinel 系統是 Redis 的 unstable 分支的一部分, 你必須到 Redis 項目的 Github 頁面 複製一份 unstable 分值, 然後通過編譯來獲得 Sentinel 系統。

Sentinel 程式可以在編譯後的 src 文檔中發現, 它是一個命名為 redis-sentinel 的程式。

你也可以通過下一節介紹的方法, 讓 redis-server 程式運行在 Sentinel 模式之下。

另外, 一個新版本的 Sentinel 已經包含在了 Redis 2.8.0 版本的釋出檔案中。 啟動 Sentinel

對於 redis-sentinel 程式, 你可以用以下命令來啟動 Sentinel 系統:

redis-sentinel /path/to/sentinel.conf

對於 redis-server 程式, 你可以用以下命令來啟動一個運行在 Sentinel 模式下的 Redis 伺服器:

redis-server /path/to/sentinel.conf --sentinel

兩種方法都可以啟動一個 Sentinel 執行個體。

啟動 Sentinel 執行個體必須指定相應的設定檔, 系統會使用設定檔來儲存 Sentinel 的目前狀態, 並在 Sentinel 重啟時通過載入設定檔來進行狀態還原。

如果啟動 Sentinel 時沒有指定相應的設定檔, 或者指定的設定檔不可寫(not writable), 那麼 Sentinel 會拒絕啟動。 配置 Sentinel

Redis 源碼中包含了一個名為 sentinel.conf 的檔案, 這個檔案是一個帶有詳細注釋的 Sentinel 設定檔樣本。

運行一個 Sentinel 所需的最少配置如下所示:

sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 60000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1sentinel monitor resque 192.168.1.3 6380 4sentinel down-after-milliseconds resque 10000sentinel failover-timeout resque 180000sentinel parallel-syncs resque 5

第一行配置指示 Sentinel 去監視一個名為 mymaster 的主伺服器, 這個主伺服器的 IP 位址為 127.0.0.1 , 連接埠號碼為 6379 , 而將這個主伺服器判斷為失效至少需要 2 個 Sentinel 同意 (只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行)。

不過要注意, 無論你設定要多少個 Sentinel 同意才能判斷一個伺服器失效, 一個 Sentinel 都需要獲得系統中多數(majority) Sentinel 的支援, 才能發起一次自動故障遷移, 並預留一個給定的配置紀元 (configuration Epoch ,一個配置紀元就是一個新主伺服器配置的版本號碼)。

換句話說, 在只有少數(minority) Sentinel 進程正常運作的情況下, Sentinel 是不能執行自動故障遷移的。

其他選項的基本格式如下:

sentinel <選項的名字> <主伺服器的名字> <選項的值>

各個選項的功能如下:

down-after-milliseconds 選項指定了 Sentinel 認為伺服器已經斷線所需的毫秒數。

如果伺服器在給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回複, 或者返回一個錯誤, 那麼 Sentinel 將這個伺服器標記為主觀下線(subjectively down,簡稱 SDOWN )。

不過只有一個 Sentinel 將伺服器標記為主觀下線並不一定會引起伺服器的自動故障遷移: 只有在足夠數量的 Sentinel 都將一個伺服器標記為主觀下線之後, 伺服器才會被標記為客觀下線(objectively down, 簡稱 ODOWN ), 這時自動故障遷移才會執行。

將伺服器標記為客觀下線所需的 Sentinel 數量由對主伺服器的配置決定。

parallel-syncs 選項指定了在執行容錯移轉時, 最多可以有多少個從伺服器同時對新的主伺服器進行同步, 這個數字越小, 完成容錯移轉所需的時間就越長。

如果從伺服器被設定為允許使用到期資料集(參見對 redis.conf 檔案中對 slave-serve-stale-data 選項的說明), 那麼你可能不希望所有從伺服器都在同一時間向新的主伺服器發送同步請求, 因為儘管複製過程的絕大部分步驟都不會阻塞從伺服器, 但從伺服器在載入主伺服器發來的 RDB 檔案時, 仍然會造成從伺服器在一段時間內不能處理命令請求: 如果全部從伺服器一起對新的主伺服器進行同步, 那麼就可能會造成所有從伺服器在短時間內全部停用情況出現。

你可以通過將這個值設為 1 來保證每次只有一個從伺服器處於不能處理命令請求的狀態。

本文檔剩餘的內容將對 Sentinel 系統的其他選項進行介紹, 樣本設定檔 sentinel.conf 也對相關的選項進行了完整的注釋。 主觀下線和客觀下線

前面說過, Redis 的 Sentinel 中關於下線(down)有兩個不同的概念: 主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 執行個體對伺服器做出的下線判斷。 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 執行個體在對同一個伺服器做出 SDOWN 判斷, 並且通過 SENTINELis-master-down-by-addr 命令互相交流之後, 得出的伺服器下線判斷。 (一個 Sentinel 可以通過向另一個 Sentinel 發送SENTINEL is-master-down-by-addr 命令來詢問對方是否認為給定的伺服器已下線。)

如果一個伺服器沒有在 master-down-after-milliseconds 選項所指定的時間內, 對向它發送 PING 命令的 Sentinel 返回一個有效回複(valid reply), 那麼 Sentinel 就會將這個伺服器標記為主觀下線。

伺服器對 PING 命令的有效回複可以是以下三種回複的其中一種: 返回 +PONG 。 返回 -LOADING 錯誤。 返回 -MASTERDOWN 錯誤。

如果伺服器返回除以上三種回複之外的其他回複, 又或者在指定時間內沒有回複 PING 命令, 那麼 Sentinel 認為伺服器返回的回複無效(non-valid)。

注意, 一個伺服器必須在 master-down-after-milliseconds 毫秒內, 一直返回無效回複才會被 Sentinel 標記為主觀下線。

舉個例子, 如果 master-down-after-milliseconds 選項的值為 30000 毫秒(30 秒), 那麼只要伺服器能在每 29 秒之內返回至少一次有效回複, 這個伺服器就仍然會被認為是處於正常狀態的。

從主觀下線狀態切換到客觀下線狀態並沒有使用嚴格的法定人數演算法(strong quorum algorithm), 而是使用了流言協議: 如果 Sentinel 在給定的時間範圍內, 從其他 Sentinel 那裡接收到了足夠數量的主伺服器下線報告, 那麼 Sentinel 就會將主伺服器的狀態從主觀下線改變為客觀下線。 如果之後其他 Sentinel 不再報告主伺服器已下線, 那麼客觀下線狀態就會被移除。

客觀下線條件只適用於主伺服器: 對於任何其他類型的 Redis 執行個體, Sentinel 在將它們判斷為下線前不需要進行協商, 所以從伺服器或者其他 Sentinel 永遠不會達到客觀下線條件。

只要一個 Sentinel 發現某個主伺服器進入了客觀下線狀態, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 並對失效的主伺服器執行自動故障遷移操作。 每個 Sentinel 都需要定期執行的任務 每個 Sentinel 以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 執行個體發送一個 PING 命令。 如果一個執行個體(instance)距離最後一次有效回複 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個執行個體會被 Sentinel 標記為主觀下線。 一個有效回複可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。 如果一個主伺服器被標記為主觀下線, 那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。 如果一個主伺服器被標記為主觀下線, 並且有足夠數量的 Sentinel (至少要達到設定檔指定的數量)在指定的時間範圍內同意這一判斷, 那麼這個主伺服器被標記為客觀下線。 在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主伺服器和從伺服器發送 INFO 命令。 當一個主伺服器被 Sentinel 標記為客觀下線時, Sentinel 向下線主伺服器的所有從伺服器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。 當沒有足夠數量的 Sentinel 同意主伺服器已經下線, 主伺服器的客觀下線狀態就會被移除。 當主伺服器重新向 Sentinel 的PING 命令返回有效回複時, 主伺服器的主管下線狀態就會被移除。 自動探索 Sentinel 和從伺服器

一個 Sentinel 可以與其他多個 Sentinel 進行串連, 各個 Sentinel 之間可以互相檢查對方的可用性, 並進行資訊交換。

你無須為啟動並執行每個 Sentinel 分別設定其他 Sentinel 的地址, 因為 Sentinel 可以通過發布與訂閱功能來自動探索正在監視相同主伺服器的其他 Sentinel , 這一功能是通過向頻道 __sentinel__:hello 發送資訊來實現的。

與此類似, 你也不必手動列出主伺服器屬下的所有從伺服器, 因為 Sentinel 可以通過詢問主伺服器來獲得所有從伺服器的資訊。 每個 Sentinel 會以每兩秒一次的頻率, 通過發布與訂閱功能, 向被它監視的所有主伺服器和從伺服器的 __sentinel__:hello 頻道發送一條資訊, 資訊中包含了 Sentinel 的 IP 位址、連接埠號碼和運行 ID (runid)。 每個 Sentinel 都訂閱了被它監視的所有主伺服器和從伺服器的 __sentinel__:hello 頻道, 尋找之前未出現過的 sentinel (looking for unknown sentinels)。 當一個 Sentinel 發現一個新的 Sentinel 時, 它會將新的 Sentinel 添加到一個列表中, 這個列表儲存了 Sentinel 已知的, 監視同一個主伺服器的所有其他 Sentinel 。 Sentinel 發送的資訊中還包括完整的主伺服器當前配置(configuration)。 如果一個 Sentinel 包含的主伺服器配置比另一個 Sentinel 發送的配置要舊, 那麼這個 Sentinel 會立即升級到新配置上。 在將一個新 Sentinel 添加到監視主伺服器的列表上面之前, Sentinel 會先檢查列表中是否已經包含了和要添加的 Sentinel 擁有相同運行 ID 或者相同地址(包括 IP 位址和連接埠號碼)的 Sentinel , 如果是的話, Sentinel 會先移除列表中已有的那些擁有相同運行 ID 或者相同地址的 Sentinel , 然後再添加新 Sentinel 。 Sentinel API

在預設情況下, Sentinel 使用 TCP 通訊埠 26379 (普通 Redis 伺服器使用的是 6379 )。

Sentinel 接受 Redis 協議格式的命令請求, 所以你可以使用 redis-cli 或者任何其他 Redis 用戶端來與 Sentinel 進行通訊。

有兩種方式可以和 Sentinel 進行通訊: 第一種方法是通過直接發送命令來查詢被監視 Redis 伺服器的目前狀態, 以及 Sentinel 所知道的關於其他 Sentinel 的資訊, 諸如此類。 另一種方法是使用發布與訂閱功能, 通過接收 Sentinel 發送的通知: 當執行容錯移轉操作, 或者某個被監視的伺服器被判斷為主觀下線或者客觀下線時, Sentinel 就會發送相應的資訊。 Sentinel 命令

以下列出的是 Sentinel 接受的命令: PING :返回 PONG 。 SENTINEL masters :列出所有被監視的主伺服器,以及這些主伺服器的目前狀態。 SENTINEL slaves <master name> :列出給定主伺服器的所有從伺服器,以及這些從伺服器的目前狀態。 SENTINEL get-master-addr-by-name <master name> : 返回給定名字的主伺服器的 IP 位址和連接埠號碼。 如果這個主伺服器正在執行容錯移轉操作, 或者針對這個主伺服器的容錯移轉操作已經完成, 那麼這個命令返回新的主伺服器的 IP 位址和連接埠號碼。 SENTINEL reset <pattern> : 重設所有名字和給定模式 pattern 相匹配的主伺服器。 pattern 參數是一個 Glob 風格的模式。 重設操作清除主伺服器目前的所有狀態, 包括正在執行中的容錯移轉, 並移除目前已經發現和關聯的, 主伺服器的所有從伺服器和 Sentinel 。 SENTINEL failover <master name> : 當主伺服器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移 (不過發起容錯移轉的 Sentinel 會向其他 Sentinel 發送一個新的配置,其他 Sentinel 會根據這個配置進行相應的更新)。 發布與訂閱資訊

用戶端可以將 Sentinel 看作是一個只提供了訂閱功能的 Redis 伺服器: 你不可以使用 PUBLISH 命令向這個伺服器發送資訊, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通過訂閱給定的頻道來擷取相應的事件提醒。

一個頻道能夠接收和這個頻道的名字相同的事件。 比如說, 名為 +sdown 的頻道就可以接收所有執行個體進入主觀下線(SDOWN)狀態的事件。

通過執行 PSUBSCRIBE * 命令可以接收所有事件資訊。

以下列出的是用戶端可以通過訂閱來獲得的頻道和資訊的格式: 第一個英文單詞是頻道/事件的名字, 其餘的是資料的格式。

注意, 當格式中包含 instance details 字樣時, 表示頻道所返回的資訊中包含了以下用於識別目標執行個體的內容:

<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>

@ 字元之後的內容用於指定主伺服器, 這些內容是可選的, 它們僅在 @ 字元之前的內容指定的執行個體不是主伺服器時使用。 +reset-master <instance details> :主伺服器已被重設。 +slave <instance details> :一個新的從伺服器已經被 Sentinel 識別並關聯。 +failover-state-reconf-slaves <instance details> :容錯移轉狀態切換到了 reconf-slaves 狀態。 +failover-detected <instance details> :另一個 Sentinel 開始了一次容錯移轉操作,或者一個從伺服器轉換成了主伺服器。 +slave-reconf-sent <instance details> :領頭(leader)的 Sentinel 向執行個體發送了 SLAVEOF 命令,為執行個體設定新的主伺服器。 +slave-reconf-inprog <instance details> :執行個體正在將自己設定為指定主伺服器的從伺服器,但相應的同步過程仍未完成。 +slave-reconf-done <instance details> :從伺服器已經成功完成對新主伺服器的同步。 -dup-sentinel <instance details> :對給定主伺服器進行監視的一個或多個 Sentinel 已經因為重複出現而被移除 —— 當 Sentinel 執行個體重啟的時候,就會出現這種情況。 +sentinel <instance details> :一個監視給定主伺服器的新 Sentinel 已經被識別並添加。 +sdown <instance details> :給定的執行個體現在處於主觀下線狀態。 -sdown <instance details> :給定的執行個體已經不再處於主觀下線狀態。 +odown <instance details> :給定的執行個體現在處於客觀下線狀態。 -odown <instance details> :給定的執行個體已經不再處於客觀下線狀態。 +new-epoch <instance details> :當前的紀元(epoch)已經被更新。 +try-failover <instance details> :一個新的故障遷移操作正在執行中,等待被大多數 Sentinel 選中(waiting to be elected by the majority)。 +elected-leader <instance details> :贏得指定紀元的選舉,可以進行故障遷移操作了。 +failover-state-select-slave <instance details> :容錯移轉操作現在處於 select-slave 狀態 —— Sentinel 正在尋找可以升級為主伺服器的從伺服器。 no-good-slave <instance details> :Sentinel 操作未能找到適合進行升級的從伺服器。Sentinel 會在一段時間之後再次嘗試尋找合適的從伺服器來進行升級,又或者直接放棄執行容錯移轉操作。 selected-slave <instance details> :Sentinel 順利找到適合進行升級的從伺服器。 failover-state-send-slaveof-noone <instance details> :Sentinel 正在將指定的從伺服器升級為主伺服器,等待升級功能完成。 failover-end-for-timeout <instance details> :容錯移轉因為逾時而中止,不過最終所有從伺服器都會開始複製新的主伺服器(slaves will eventually be configured to replicate with the new master anyway)。 failover-end <instance details> :容錯移轉操作順利完成。所有從伺服器都開始複製新的主伺服器了。 +switch-master <master name> <oldip> <oldport> <newip> <newport> :配置變更,主伺服器的 IP 和地址已經改變。 這是絕大多數外部使用者都關心的資訊。 +tilt :進入 tilt 模式。 -tilt :退出 tilt 模式。 容錯移轉

一次容錯移轉操作由以下步驟組成: 發現主伺服器已經進入客觀下線狀態。 對我們的當前紀元進行自增(詳情請參考 Raft leader election ), 並嘗試在這個紀元中當選。 如果當選失敗, 那麼在設定的故障遷移逾時時間的兩倍之後, 重新嘗試當選。 如果當選成功, 那麼執行以下步驟。 選出一個從伺服器,並將它升級為主伺服器。 向被選中的從伺服器發送 SLAVEOF NO ONE 命令,讓它轉變為主伺服器。 通過發布與訂閱功能, 將更新後的配置傳播給所有其他 Sentinel , 其他 Sentinel 對它們自己的配置進行更新。 向已下線主伺服器的從伺服器發送 SLAVEOF 命令, 讓它們去複製新的主服務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.