sdown和odown兩種失敗狀態(tài)
sdown是主觀宕機(jī)卵贱,就一個(gè)哨兵如果自己覺得有一個(gè)master宕機(jī)了抛虫,那么就是主觀宕機(jī)。
odown是客觀宕機(jī)狐榔,如果quorum數(shù)量的哨兵都覺得master宕機(jī)了坛增,那么就是客觀宕機(jī)
sdown達(dá)成條件很簡單,如果一個(gè)哨兵ping一個(gè)master薄腻,超過is-master-down-milliseconds指定的毫秒數(shù)之后收捣,就主觀認(rèn)為master宕機(jī)
sdown到odown轉(zhuǎn)換的條件很簡單,如果一個(gè)哨兵在指定時(shí)間中庵楷,收到quorum指定數(shù)量的其他哨兵也認(rèn)為master是sdown了罢艾,那就認(rèn)為客觀宕機(jī)。
哨兵集群的自動(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è)消息,這個(gè)時(shí)候所有其他哨兵都可以消費(fèi)到這個(gè)消息弄贿,并感知到其他哨兵的存在春锋。
每個(gè)哨兵也會(huì)去監(jiān)聽自己監(jiān)控的每個(gè)master+slave對(duì)應(yīng)的sentinel:hello channel,然后感知到同樣再監(jiān)聽這個(gè)master+slaves的其他哨兵的存在
每個(gè)哨兵還會(huì)跟其他哨兵交換對(duì)master的監(jiān)控配置差凹,互相進(jìn)行監(jiān)控配置同步期奔。
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上肺孤。
slave->master選舉算法
如果一個(gè)master被認(rèn)為odown了,而且majority哨兵都允許了貯備切換,那么某個(gè)哨兵就會(huì)執(zhí)行主備切換操作渠旁,此時(shí)首先選舉一個(gè)slave來
會(huì)考慮slave一些信息
- 跟master斷開連接時(shí)間
- slave優(yōu)先級(jí)
- 復(fù)制offset
- run id
如果一個(gè)slave跟master斷開連接已經(jīng)超過down-after-milliseconds的10倍攀例,外加master宕機(jī)時(shí)長船逮,那么slave就認(rèn)定不合適選舉為master
接下來會(huì)對(duì)slave排序
(1)按照slave優(yōu)先級(jí)進(jìn)行排序顾腊,slave priority越低,優(yōu)先級(jí)越高
(2)如果slave priority相同挖胃,那么看replica offset杂靶,哪個(gè)salve復(fù)制了越多數(shù)據(jù),offset越靠后酱鸭,優(yōu)先級(jí)越高
(3)如果上面兩個(gè)條件都相同吗垮,那么選擇一個(gè)run id比較小的那個(gè)slave
quorum和majority
每次一個(gè)哨兵要做主備切換,首先需要quorum數(shù)量的哨兵認(rèn)為odown凹髓,然后選舉一個(gè)哨兵來做切換烁登,這個(gè)哨兵還得得到majority哨兵的授權(quán),才能正式執(zhí)行切換蔚舀。
configuration epoch
哨兵會(huì)對(duì)一套redis master+slave進(jìn)行監(jiān)控饵沧,有相應(yīng)監(jiān)控的配置
執(zhí)行切換的那個(gè)哨兵,會(huì)從要切換到的新master(slave->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)。
configuration傳播
哨兵完成切換以后肤粱,會(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配置的悯森。