真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

RedisSentinel機(jī)制與用法(二)

概述

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的新地址。

無failover時(shí)的配置糾正

即使當(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。

Slave選舉與優(yōu)先級(jí)

當(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)行排序:

  1. sentinel首先會(huì)根據(jù)slaves的優(yōu)先級(jí)來進(jìn)行排序,優(yōu)先級(jí)越小排名越靠前(?)。

  2. 如果優(yōu)先級(jí)相同,則查看復(fù)制的下標(biāo),哪個(gè)從master接收的復(fù)制數(shù)據(jù)多,哪個(gè)就靠前。

  3. 如果優(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ù)。

Sentinel和Redis身份驗(yàn)證

當(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 API

Sentinel默認(rèn)運(yùn)行在26379端口上,sentinel支持redis協(xié)議,所以可以使用redis-cli客戶端或者其他可用的客戶端來與sentinel通信。

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

  • 一種是直接使用客戶端向它發(fā)消息

  • 另外一種是使用發(fā)布/訂閱模式來訂閱sentinel事件,比如說failover,或者某個(gè)redis實(shí)例運(yùn)行出錯(cuò),等等。

Sentinel命令

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。

動(dòng)態(tài)修改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

由于有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)該遵循如下步驟:

  1. 停止所要?jiǎng)h除的sentinel

  2. 發(fā)送一個(gè)SENTINEL RESET * 命令給所有其它的sentinel實(shí)例,如果你想要重置指定master上面的sentinel,只需要把*號(hào)改為特定的名字,注意,需要一個(gè)接一個(gè)發(fā),每次發(fā)送的間隔不低于30秒。

  3. 檢查一下所有的sentinels是否都有一致的當(dāng)前sentinel數(shù)。使用SENTINEL MASTER mastername 來查詢。

刪除舊master或者不可達(dá)slave

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。

發(fā)布/訂閱

客戶端可以向一個(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模式。

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模式。

-BUSY狀態(tài)

注意:該功能還未實(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í)行。


新聞標(biāo)題:RedisSentinel機(jī)制與用法(二)
網(wǎng)頁地址:http://weahome.cn/article/pojiho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部