緩存架構(gòu)之13:redis哨兵的多個(gè)核心底層原理的深入解析(包含slave選舉算法)

1、sdown和odown轉(zhuǎn)換機(jī)制

sdown和odown兩種失敗狀態(tài)

sdown是主觀宕機(jī),就一個(gè)哨兵如果自己覺得一個(gè)master宕機(jī)了,那么就是主觀宕機(jī)

odown是客觀宕機(jī),如果quorum數(shù)量的哨兵都覺得一個(gè)master宕機(jī)了,那么就是客觀宕機(jī)

sdown達(dá)成的條件很簡(jiǎn)單,如果一個(gè)哨兵ping一個(gè)master,超過了is-master-down-after-milliseconds指定的毫秒數(shù)之后,就主觀認(rèn)為master宕機(jī)

sdown到odown轉(zhuǎn)換的條件很簡(jiǎn)單,如果一個(gè)哨兵在指定時(shí)間內(nèi),收到了quorum指定數(shù)量的其他哨兵也認(rèn)為那個(gè)master是sdown了,那么就認(rèn)為是odown了,客觀認(rèn)為master宕機(jī)

2、哨兵集群的自動(dòng)發(fā)現(xiàn)機(jī)制

哨兵互相之間的發(fā)現(xiàn),是通過redis的pub/sub系統(tǒng)實(shí)現(xiàn)的,每個(gè)哨兵都會(huì)往__sentinel__:hello這個(gè)channel里發(fā)送一個(gè)消息,這時(shí)候所有其他哨兵都可以消費(fèi)到這個(gè)消息,并感知到其他的哨兵的存在

每隔兩秒鐘,每個(gè)哨兵都會(huì)往自己監(jiān)控的某個(gè)master+slaves對(duì)應(yīng)的__sentinel__:hello channel里發(fā)送一個(gè)消息,內(nèi)容是自己的host、ip和runid還有對(duì)這個(gè)master的監(jiān)控配置

每個(gè)哨兵也會(huì)去監(jiān)聽自己監(jiān)控的每個(gè)master+slaves對(duì)應(yīng)的__sentinel__:hello channel,然后去感知到同樣在監(jiān)聽這個(gè)master+slaves的其他哨兵的存在

每個(gè)哨兵還會(huì)跟其他哨兵交換對(duì)master的監(jiān)控配置,互相進(jìn)行監(jiān)控配置的同步

3、slave配置的自動(dòng)糾正

哨兵會(huì)負(fù)責(zé)自動(dòng)糾正slave的一些配置,比如slave如果要成為潛在的master候選人,哨兵會(huì)確保slave在復(fù)制現(xiàn)有master的數(shù)據(jù); 如果slave連接到了一個(gè)錯(cuò)誤的master上,比如故障轉(zhuǎn)移之后,那么哨兵會(huì)確保它們連接到正確的master上

4、slave->master選舉算法

如果一個(gè)master被認(rèn)為odown了,而且majority哨兵都允許了主備切換,那么某個(gè)哨兵就會(huì)執(zhí)行主備切換操作,此時(shí)首先要選舉一個(gè)slave來

會(huì)考慮slave的一些信息

(1)跟master斷開連接的時(shí)長(zhǎng)

(2)slave優(yōu)先級(jí)

(3)復(fù)制offset

(4)run id

如果一個(gè)slave跟master斷開連接已經(jīng)超過了down-after-milliseconds的10倍,外加master宕機(jī)的時(shí)長(zhǎng),那么slave就被認(rèn)為不適合選舉為master

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

接下來會(huì)對(duì)slave進(jìn)行排序

(1)按照slave優(yōu)先級(jí)進(jìn)行排序,slave priority越低,優(yōu)先級(jí)就越高

(2)如果slave priority相同,那么看replica offset,哪個(gè)slave復(fù)制了越多的數(shù)據(jù),offset越靠后,優(yōu)先級(jí)就越高

(3)如果上面兩個(gè)條件都相同,那么選擇一個(gè)run id比較小的那個(gè)slave

5、quorum和majority

每次一個(gè)哨兵要做主備切換,首先需要quorum數(shù)量的哨兵認(rèn)為odown,然后選舉出一個(gè)哨兵來做切換,這個(gè)哨兵還得得到majority哨兵的授權(quán),才能正式執(zhí)行切換

如果quorum < majority,比如5個(gè)哨兵,majority就是3,quorum設(shè)置為2,那么就3個(gè)哨兵授權(quán)就可以執(zhí)行切換

但是如果quorum >= majority,那么必須quorum數(shù)量的哨兵都授權(quán),比如5個(gè)哨兵,quorum是5,那么必須5個(gè)哨兵都同意授權(quán),才能執(zhí)行切換

6、configuration epoch

哨兵會(huì)對(duì)一套redis master+slave進(jìn)行監(jiān)控,有相應(yīng)的監(jiān)控的配置

執(zhí)行切換的那個(gè)哨兵,會(huì)從要切換到的新master(salve->master)那里得到一個(gè)configuration epoch,這就是一個(gè)version號(hào),每次切換的version號(hào)都必須是唯一的

如果第一個(gè)選舉出的哨兵切換失敗了,那么其他哨兵,會(huì)等待failover-timeout時(shí)間,然后接替繼續(xù)執(zhí)行切換,此時(shí)會(huì)重新獲取一個(gè)新的configuration epoch,作為新的version號(hào)

7、configuraiton傳播

哨兵完成切換之后,會(huì)在自己本地更新生成最新的master配置,然后同步給其他的哨兵,就是通過之前說的pub/sub消息機(jī)制

這里之前的version號(hào)就很重要了,因?yàn)楦鞣N消息都是通過一個(gè)channel去發(fā)布和監(jiān)聽的,所以一個(gè)哨兵完成一次新的切換之后,新的master配置是跟著新的version號(hào)的

其他的哨兵都是根據(jù)版本號(hào)的大小來更新自己的master配置的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、哨兵的介紹 sentinal,中文名是哨兵 哨兵是redis集群架構(gòu)中非常重要的一個(gè)組件,主要功能如下 (1)...
    踏雪無痕722閱讀 460評(píng)論 0 2
  • 當(dāng)前最新的穩(wěn)定版叫做Sentinel 2,即“哨兵二代目”,必須使用Redis 2.8。2.6版本中的為Senti...
    誰又失憶閱讀 1,458評(píng)論 0 2
  • 看!一位扎著馬尾辮的小女孩,正拿著一本厚厚的書,津津有味地閱讀著,看起來很愛看書呢!那不是我的同學(xué)--吳思語嘛? ...
    senny1978閱讀 171評(píng)論 0 1
  • 才想著這段時(shí)間,工作生活都挺順心,就出了個(gè)不大不小的事兒。總結(jié)下來看看,能讓自己心情變差的,除了工作好像也沒有其他...
    6830e983870f閱讀 173評(píng)論 0 0
  • 房子拿到手是去年的九月份,不是時(shí)下最熱門的電梯房,是老式的樓層為六樓的商品房,并且是一樓,一開始我是拒絕的,但是當(dāng)...
    ArmyTracy_a6c7閱讀 227評(píng)論 0 1

友情鏈接更多精彩內(nèi)容