redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當(dāng)用Redis做Master-slave的高可用方案時(shí),假如master宕機(jī)了,Redis本身(包括它的很多客戶端)都沒有實(shí)現(xiàn)自動(dòng)進(jìn)行主備切換,而Redis-sentinel本身也是一個(gè)獨(dú)立運(yùn)行的進(jìn)程,它能監(jiān)控多個(gè)master-slave集群,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自懂切換。
創(chuàng)新互聯(lián)公司專注于點(diǎn)軍企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。點(diǎn)軍網(wǎng)站建設(shè)公司,為點(diǎn)軍等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
它的主要功能有以下幾點(diǎn)
不時(shí)地監(jiān)控redis是否按照預(yù)期良好地運(yùn)行;
如果發(fā)現(xiàn)某個(gè)redis節(jié)點(diǎn)運(yùn)行出現(xiàn)狀況,能夠通知另外一個(gè)進(jìn)程(例如它的客戶端);
能夠進(jìn)行自動(dòng)切換。當(dāng)一個(gè)master節(jié)點(diǎn)不可用時(shí),能夠選舉出master的多個(gè)slave(如果有超過一個(gè)slave的話)中的一個(gè)來作為新的master,其它的slave節(jié)點(diǎn)會(huì)將它所追隨的master的地址改為被提升為master的slave的新地址。
即使當(dāng)前沒有failover正在進(jìn)行,sentinel依然會(huì)使用當(dāng)前配置去設(shè)置監(jiān)控的master。特別是:
根據(jù)最新配置確認(rèn)為slaves的節(jié)點(diǎn)卻聲稱自己是master(參考上文例子中被網(wǎng)絡(luò)隔離后的的redis3),這時(shí)它們會(huì)被重新配置為當(dāng)前master的slave。
如果slaves連接了一個(gè)錯(cuò)誤的master,將會(huì)被改正過來,連接到正確的master。
當(dāng)一個(gè)sentinel準(zhǔn)備好了要進(jìn)行failover,并且收到了其他sentinel的授權(quán),那么就需要選舉出一個(gè)合適的slave來做為新的master。
slave的選舉主要會(huì)評(píng)估slave的以下幾個(gè)方面:
與master斷開連接的次數(shù)
Slave的優(yōu)先級(jí)
數(shù)據(jù)復(fù)制的下標(biāo)(用來評(píng)估slave當(dāng)前擁有多少master的數(shù)據(jù))
進(jìn)程ID
如果一個(gè)slave與master失去聯(lián)系超過10次,并且每次都超過了配置的最大失聯(lián)時(shí)間(down-after-milliseconds option
),并且,如果sentinel在進(jìn)行failover時(shí)發(fā)現(xiàn)slave失聯(lián),那么這個(gè)slave就會(huì)被sentinel認(rèn)為不適合用來做新master的。
更嚴(yán)格的定義是,如果一個(gè)slave持續(xù)斷開連接的時(shí)間超過
(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
就會(huì)被認(rèn)為失去選舉資格。
符合上述條件的slave才會(huì)被列入master候選人列表,并根據(jù)以下順序來進(jìn)行排序:
sentinel首先會(huì)根據(jù)slaves的優(yōu)先級(jí)來進(jìn)行排序,優(yōu)先級(jí)越小排名越靠前(?)。
如果優(yōu)先級(jí)相同,則查看復(fù)制的下標(biāo),哪個(gè)從master接收的復(fù)制數(shù)據(jù)多,哪個(gè)就靠前。
如果優(yōu)先級(jí)和下標(biāo)都相同,就選擇進(jìn)程ID較小的那個(gè)。
一個(gè)redis無論是master還是slave,都必須在配置中指定一個(gè)slave優(yōu)先級(jí)。要注意到master也是有可能通過failover變成slave的。
如果一個(gè)redis的slave優(yōu)先級(jí)配置為0,那么它將永遠(yuǎn)不會(huì)被選為master。但是它依然會(huì)從master哪里復(fù)制數(shù)據(jù)。
當(dāng)一個(gè)master配置為需要密碼才能連接時(shí),客戶端和slave在連接時(shí)都需要提供密碼。
master通過requirepass
設(shè)置自身的密碼,不提供密碼無法連接到這個(gè)master。
slave通過masterauth
來設(shè)置訪問master時(shí)的密碼。
但是當(dāng)使用了sentinel時(shí),由于一個(gè)master可能會(huì)變成一個(gè)slave,一個(gè)slave也可能會(huì)變成master,所以需要同時(shí)設(shè)置上述兩個(gè)配置項(xiàng)。
Sentinel默認(rèn)運(yùn)行在26379端口上,sentinel支持redis協(xié)議,所以可以使用redis-cli客戶端或者其他可用的客戶端來與sentinel通信。
有兩種方式能夠與sentinel通信:
一種是直接使用客戶端向它發(fā)消息
另外一種是使用發(fā)布/訂閱模式來訂閱sentinel事件,比如說failover,或者某個(gè)redis實(shí)例運(yùn)行出錯(cuò),等等。
sentinel支持的合法命令如下:
PING
sentinel回復(fù)PONG
.
SENTINEL masters
顯示被監(jiān)控的所有master以及它們的狀態(tài).
SENTINEL master
顯示指定master的信息和狀態(tài);
SENTINEL slaves
顯示指定master的所有slave以及它們的狀態(tài);
SENTINEL get-master-addr-by-name
返回指定master的ip和端口,如果正在進(jìn)行failover或者failover已經(jīng)完成,將會(huì)顯示被提升為master的slave的ip和端口。
SENTINEL reset
重置名字匹配該正則表達(dá)式的所有的master的狀態(tài)信息,清楚其之前的狀態(tài)信息,以及slaves信息。
SENTINEL failover
強(qiáng)制sentinel執(zhí)行failover,并且不需要得到其他sentinel的同意。但是failover后會(huì)將最新的配置發(fā)送給其他sentinel。
從redis2.8.4開始,sentinel提供了一組API用來添加,刪除,修改master的配置。
需要注意的是,如果你通過API修改了一個(gè)sentinel的配置,sentinel不會(huì)把修改的配置告訴其他sentinel。你需要自己手動(dòng)地對(duì)多個(gè)sentinel發(fā)送修改配置的命令。
以下是一些修改sentinel配置的命令:
SENTINEL MONITOR
這個(gè)命令告訴sentinel去監(jiān)聽一個(gè)新的master
SENTINEL REMOVE
命令sentinel放棄對(duì)某個(gè)master的監(jiān)聽
SENTINEL SET
這個(gè)命令很像Redis的CONFIG SET
命令,用來改變指定master的配置。支持多個(gè)
SENTINEL SET objects-cache-master down-after-milliseconds 1000
只要是配置文件中存在的配置項(xiàng),都可以用SENTINEL SET
命令來設(shè)置。這個(gè)還可以用來設(shè)置master的屬性,比如說quorum(票數(shù)),而不需要先刪除master,再重新添加master。例如:
SENTINEL SET objects-cache-master quorum 5
由于有sentinel自動(dòng)發(fā)現(xiàn)機(jī)制,所以添加一個(gè)sentinel到你的集群中非常容易,你所需要做的只是監(jiān)控到某個(gè)Master上,然后新添加的sentinel就能獲得其他sentinel的信息以及masterd所有的slave。
如果你需要添加多個(gè)sentinel,建議你一個(gè)接著一個(gè)添加,這樣可以預(yù)防網(wǎng)絡(luò)隔離帶來的問題。你可以每個(gè)30秒添加一個(gè)sentinel。最后你可以用SENTINEL MASTER mastername
來檢查一下是否所有的sentinel都已經(jīng)監(jiān)控到了master。
刪除一個(gè)sentinel顯得有點(diǎn)復(fù)雜:因?yàn)閟entinel永遠(yuǎn)不會(huì)刪除一個(gè)已經(jīng)存在過的sentinel,即使它已經(jīng)與組織失去聯(lián)系很久了。
要想刪除一個(gè)sentinel,應(yīng)該遵循如下步驟:
停止所要?jiǎng)h除的sentinel
發(fā)送一個(gè)SENTINEL RESET *
命令給所有其它的sentinel實(shí)例,如果你想要重置指定master上面的sentinel,只需要把*號(hào)改為特定的名字,注意,需要一個(gè)接一個(gè)發(fā),每次發(fā)送的間隔不低于30秒。
檢查一下所有的sentinels是否都有一致的當(dāng)前sentinel數(shù)。使用SENTINEL MASTER mastername
來查詢。
sentinel永遠(yuǎn)會(huì)記錄好一個(gè)Master的slaves,即使slave已經(jīng)與組織失聯(lián)好久了。這是很有用的,因?yàn)閟entinel集群必須有能力把一個(gè)恢復(fù)可用的slave進(jìn)行重新配置。
并且,failover后,失效的master將會(huì)被標(biāo)記為新master的一個(gè)slave,這樣的話,當(dāng)它變得可用時(shí),就會(huì)從新master上復(fù)制數(shù)據(jù)。
然后,有時(shí)候你想要永久地刪除掉一個(gè)slave(有可能它曾經(jīng)是個(gè)master),你只需要發(fā)送一個(gè)SENTINEL RESET master
命令給所有的sentinels,它們將會(huì)更新列表里能夠正確地復(fù)制master數(shù)據(jù)的slave。
客戶端可以向一個(gè)sentinel發(fā)送訂閱某個(gè)頻道的事件的命令,當(dāng)有特定的事件發(fā)生時(shí),sentinel會(huì)通知所有訂閱的客戶端。需要注意的是客戶端只能訂閱,不能發(fā)布。
訂閱頻道的名字與事件的名字一致。例如,頻道名為sdown 將會(huì)發(fā)布所有與SDOWN相關(guān)的消息給訂閱者。
如果想要訂閱所有消息,只需簡單地使用PSUBSCRIBE *
以下是所有你可以收到的消息的消息格式,如果你訂閱了所有消息的話。第一個(gè)單詞是頻道的名字,其它是數(shù)據(jù)的格式。
注意:以下的instance details的格式是:
如果這個(gè)redis實(shí)例是一個(gè)master,那么@之后的消息就不會(huì)顯示。
+reset-master-- 當(dāng)master被重置時(shí). +slave -- 當(dāng)檢測(cè)到一個(gè)slave并添加進(jìn)slave列表時(shí). +failover-state-reconf-slaves -- Failover狀態(tài)變?yōu)閞econf-slaves狀態(tài)時(shí) +failover-detected -- 當(dāng)failover發(fā)生時(shí) +slave-reconf-sent -- sentinel發(fā)送SLAVEOF命令把它重新配置時(shí) +slave-reconf-inprog -- slave被重新配置為另外一個(gè)master的slave,但數(shù)據(jù)復(fù)制還未發(fā)生時(shí)。 +slave-reconf-done -- slave被重新配置為另外一個(gè)master的slave并且數(shù)據(jù)復(fù)制已經(jīng)與master同步時(shí)。 -dup-sentinel -- 刪除指定master上的冗余sentinel時(shí) (當(dāng)一個(gè)sentinel重新啟動(dòng)時(shí),可能會(huì)發(fā)生這個(gè)事件). +sentinel -- 當(dāng)master增加了一個(gè)sentinel時(shí)。 +sdown -- 進(jìn)入SDOWN狀態(tài)時(shí); -sdown -- 離開SDOWN狀態(tài)時(shí)。 +odown -- 進(jìn)入ODOWN狀態(tài)時(shí)。 -odown -- 離開ODOWN狀態(tài)時(shí)。 +new-epoch -- 當(dāng)前配置版本被更新時(shí)。 +try-failover -- 達(dá)到failover條件,正等待其他sentinel的選舉。 +elected-leader -- 被選舉為去執(zhí)行failover的時(shí)候。 +failover-state-select-slave -- 開始要選擇一個(gè)slave當(dāng)選新master時(shí)。 no-good-slave -- 沒有合適的slave來擔(dān)當(dāng)新master selected-slave -- 找到了一個(gè)適合的slave來擔(dān)當(dāng)新master failover-state-send-slaveof-noone -- 當(dāng)把選擇為新master的slave的身份進(jìn)行切換的時(shí)候。 failover-end-for-timeout -- failover由于超時(shí)而失敗時(shí)。 failover-end -- failover成功完成時(shí)。 switch-master -- 當(dāng)master的地址發(fā)生變化時(shí)。通常這是客戶端最感興趣的消息了。 +tilt -- 進(jìn)入Tilt模式。 -tilt -- 退出Tilt模式。
redis sentinel非常依賴系統(tǒng)時(shí)間,例如它會(huì)使用系統(tǒng)時(shí)間來判斷一個(gè)PING回復(fù)用了多久的時(shí)間。
然而,假如系統(tǒng)時(shí)間被修改了,或者是系統(tǒng)十分繁忙,或者是進(jìn)程堵塞了,sentinel可能會(huì)出現(xiàn)運(yùn)行不正常的情況。
當(dāng)系統(tǒng)的穩(wěn)定性下降時(shí),TILT模式是sentinel可以進(jìn)入的一種的保護(hù)模式。當(dāng)進(jìn)入TILT模式時(shí),sentinel會(huì)繼續(xù)監(jiān)控工作,但是它不會(huì)有任何其他動(dòng)作,它也不會(huì)去回應(yīng)is-master-down-by-addr
這樣的命令了,因?yàn)樗赥ILT模式下,檢測(cè)失效節(jié)點(diǎn)的能力已經(jīng)變得讓人不可信任了。
如果系統(tǒng)恢復(fù)正常,持續(xù)30秒鐘,sentinel就會(huì)退出TITL模式。
注意:該功能還未實(shí)現(xiàn)。
當(dāng)一個(gè)腳本的運(yùn)行時(shí)間超過配置的運(yùn)行時(shí)間時(shí),sentinel會(huì)返回一個(gè)-BUSY 錯(cuò)誤信號(hào)。如果這件事發(fā)生在觸發(fā)一個(gè)failover之前,sentinel將會(huì)發(fā)送一個(gè)SCRIPT KILL命令,如果script是只讀的話,就能成功執(zhí)行。