Redis Sentinel 機制與用法(二)

來源:互聯網
上載者:User

https://segmentfault.com/a/1190000002685515

續前篇《Redis Sentinel機制與用法(一)》 概述

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

它的主要功能有以下幾點

不時地監控redis是否按照預期良好地運行;

如果發現某個redis節點運行出現狀況,能夠通知另外一個進程(例如它的用戶端);

能夠進行自動切換。當一個master節點不可用時,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節點會將它所追隨的master的地址改為被提升為master的slave的新地址。
<br/> 無failover時的配置糾正

即使當前沒有failover進行中,sentinel依然會使用當前配置去設定監控的master。特別是:

根據最新配置確認為slaves的節點卻聲稱自己是master(參考上文例子中被網路隔離後的的redis3),這時它們會被重新設定為當前master的slave。

如果slaves串連了一個錯誤的master,將會被改正過來,串連到正確的master。 Slave選舉與優先順序

當一個sentinel準備好了要進行failover,並且收到了其他sentinel的授權,那麼就需要選舉出一個合適的slave來做為新的master。

slave的選舉主要會評估slave的以下幾個方面:

與master中斷連線的次數

Slave的優先順序

資料複製的下標(用來評估slave當前擁有多少master的資料)

進程ID

如果一個slave與master失去聯絡超過10次,並且每次都超過了配置的最大失聯時間(down-after-milliseconds option),並且,如果sentinel在進行failover時發現slave失聯,那麼這個slave就會被sentinel認為不適合用來做新master的。

更嚴格的定義是,如果一個slave持續中斷連線的時間超過

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

就會被認為失去選舉資格。
符合上述條件的slave才會被列入master候選人列表,並根據以下順序來進行排序:

sentinel首先會根據slaves的優先順序來進行排序,優先順序越小排名越靠前(。)。

如果優先順序相同,則查看複製的下標,哪個從master接收的複製資料多,哪個就靠前。

如果優先順序和下標都相同,就選擇進程ID較小的那個。

一個redis無論是master還是slave,都必須在配置中指定一個slave優先順序。要注意到master也是有可能通過failover變成slave的。

如果一個redis的slave優先順序配置為0,那麼它將永遠不會被選為master。但是它依然會從master哪裡複製資料。 Sentinel和Redis身分識別驗證

當一個master配置為要求輸入密碼才能串連時,用戶端和slave在串連時都需要提供密碼。

master通過requirepass設定自身的密碼,不提供密碼無法串連到這個master。
slave通過masterauth來設定訪問master時的密碼。

但是當使用了sentinel時,由於一個master可能會變成一個slave,一個slave也可能會變成master,所以需要同時設定上述兩個配置項。 Sentinel API

Sentinel預設運行在26379連接埠上,sentinel支援redis協議,所以可以使用redis-cli用戶端或者其他可用的用戶端來與sentinel通訊。

有兩種方式能夠與sentinel通訊:

一種是直接使用用戶端向它發訊息

另外一種是使用發布/訂閱模式來訂閱sentinel事件,比如說failover,或者某個redis執行個體運行出錯,等等。 Sentinel命令

sentinel支援的合法命令如下:

PING sentinel回複PONG.

SENTINEL masters 顯示被監控的所有master以及它們的狀態.

SENTINEL master <master name> 顯示指定master的資訊和狀態;

SENTINEL slaves <master name> 顯示指定master的所有slave以及它們的狀態;

SENTINEL get-master-addr-by-name <master name> 返回指定master的ip和連接埠,如果進行中failover或者failover已經完成,將會顯示被提升為master的slave的ip和連接埠。

SENTINEL reset <pattern> 重設名字匹配該Regex的所有的master的狀態資訊,清楚其之前的狀態資訊,以及slaves資訊。

SENTINEL failover <master name> 強制sentinel執行failover,並且不需要得到其他sentinel的同意。但是failover後會將最新的配置發送給其他sentinel。 動態修改Sentinel配置

從redis2.8.4開始,sentinel提供了一組API用來添加,刪除,修改master的配置。

需要注意的是,如果你通過API修改了一個sentinel的配置,sentinel不會把修改的配置告訴其他sentinel。你需要自己手動地對多個sentinel發送修改配置的命令。

以下是一些修改sentinel配置的命令:

SENTINEL MONITOR <name> <ip> <port> <quorum> 這個命令告訴sentinel去監聽一個新的master

SENTINEL REMOVE <name> 命令sentinel放棄對某個master的監聽

SENTINEL SET <name> <option> <value> 這個命令很像Redis的CONFIG SET命令,用來改變指定master的配置。支援多個<option><value>。例如以下執行個體:

SENTINEL SET objects-cache-master down-after-milliseconds 1000

只要是設定檔中存在的配置項,都可以用SENTINEL SET命令來設定。這個還可以用來設定master的屬性,比如說quorum(票數),而不需要先刪除master,再重新添加master。例如:

SENTINEL SET objects-cache-master quorum 5
增加或刪除Sentinel

由於有sentinel自動探索機制,所以添加一個sentinel到你的叢集中非常容易,你所需要做的只是監控到某個Master上,然後新添加的sentinel就能獲得其他sentinel的資訊以及masterd所有的slave。

如果你需要添加多個sentinel,建議你一個接著一個添加,這樣可以預防網路隔離帶來的問題。你可以每個30秒添加一個sentinel。最後你可以用SENTINEL MASTER mastername來檢查一下是否所有的sentinel都已經監控到了master。

刪除一個sentinel顯得有點複雜:因為sentinel永遠不會刪除一個已經存在過的sentinel,即使它已經與組織失去聯絡很久了。
要想刪除一個sentinel,應該遵循如下步驟:

停止所要刪除的sentinel

發送一個SENTINEL RESET * 命令給所有其它的sentinel執行個體,如果你想要重設指定master上面的sentinel,只需要把*號改為特定的名字,注意,需要一個接一個發,每次發送的間隔不低於30秒。

檢查一下所有的sentinels是否都有一致的當前sentinel數。使用SENTINEL MASTER mastername 來查詢。 刪除舊master或者不可達slave

sentinel永遠會記錄好一個Master的slaves,即使slave已經與組織失聯好久了。這是很有用的,因為sentinel叢集必須有能力把一個恢複可用的slave進行重新設定。

並且,failover後,失效的master將會被標記為新master的一個slave,這樣的話,當它變得可用時,就會從新master上複製資料。

然後,有時候你想要永久地刪除掉一個slave(有可能它曾經是個master),你只需要發送一個SENTINEL RESET master命令給所有的sentinels,它們將會更新列表裡能夠正確地複製master資料的slave。 發布/訂閱

用戶端可以向一個sentinel發送訂閱某個頻道的事件的命令,當有特定的事件發生時,sentinel會通知所有訂閱的用戶端。需要注意的是用戶端只能訂閱,不能發布。

訂閱頻道的名字與事件的名字一致。例如,頻道名為sdown 將會發布所有與SDOWN相關的訊息給訂閱者。

如果想要訂閱所有訊息,只需簡單地使用PSUBSCRIBE *

以下是所有你可以收到的訊息的訊息格式,如果你訂閱了所有訊息的話。第一個單詞是頻道的名字,其它是資料的格式。

注意:以下的instance details的格式是:

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

如果這個redis執行個體是一個master,那麼@之後的訊息就不會顯示。

    +reset-master <instance details> -- 當master被重設時.    +slave <instance details> -- 當檢測到一個slave並添加進slave列表時.    +failover-state-reconf-slaves <instance details> -- Failover狀態變為reconf-slaves狀態時    +failover-detected <instance details> -- 當failover發生時    +slave-reconf-sent <instance details> -- sentinel發送SLAVEOF命令把它重新設定時    +slave-reconf-inprog <instance details> -- slave被重新設定為另外一個master的slave,但資料複製還未發生時。    +slave-reconf-done <instance details> -- slave被重新設定為另外一個master的slave並且資料複製已經與master同步時。    -dup-sentinel <instance details> -- 刪除指定master上的冗餘sentinel時 (當一個sentinel重新啟動時,可能會發生這個事件).    +sentinel <instance details> -- 當master增加了一個sentinel時。    +sdown <instance details> -- 進入SDOWN狀態時;    -sdown <instance details> -- 離開SDOWN狀態時。    +odown <instance details> -- 進入ODOWN狀態時。    -odown <instance details> -- 離開ODOWN狀態時。    +new-epoch <instance details> -- 當前配置版本被更新時。    +try-failover <instance details> -- 達到failover條件,正等待其他sentinel的選舉。    +elected-leader <instance details> -- 被選舉為去執行failover的時候。    +failover-state-select-slave <instance details> -- 開始要選擇一個slave當選新master時。    no-good-slave <instance details> -- 沒有合適的slave來擔當新master    selected-slave <instance details> -- 找到了一個適合的slave來擔當新master    failover-state-send-slaveof-noone <instance details> -- 當把選擇為新master的slave的身份進行切換的時候。    failover-end-for-timeout <instance details> -- failover由於逾時而失敗時。    failover-end <instance details> -- failover成功完成時。    switch-master <master name> <oldip> <oldport> <newip> <newport> -- 當master的地址發生變化時。通常這是用戶端最感興趣的訊息了。    +tilt -- 進入Tilt模式。    -tilt -- 退出Tilt模式。
TILT 模式

redis sentinel非常依賴系統時間,例如它會使用系統時間來判斷一個PING回複用了多久的時間。
然而,假如系統時間被修改了,或者是系統十分繁忙,或者是進程堵塞了,sentinel可能會出現運行不正常的情況。
當系統的穩定性下降時,TILT模式是sentinel可以進入的一種的保護模式。當進入TILT模式時,sentinel會繼續監控工作,但是它不會有任何其他動作,它也不會去回應is-master-down-by-addr這樣的命令了,因為它在TILT模式下,檢測失效節點的能力已經變得讓人不可信任了。
如果系統復原正常,持續30秒鐘,sentinel就會退出TITL模式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.