Redis Sentinel 源碼分析 - Sentinel 的主時(shí)間事件函數(shù)

作者:Wen Hui

轉(zhuǎn)載:中間件小哥

Sentinel 使用和Redis服務(wù)器相同的事件處理機(jī)制:分為文件事件和時(shí)間事件吉捶。文件事件處理機(jī)制使用I/O 多路復(fù)用來處理服務(wù)器端的網(wǎng)絡(luò)I/O 請求翅阵,例如客戶端連接,讀寫等操作赚抡。時(shí)間處理機(jī)制則在主循環(huán)中周期性調(diào)用時(shí)間函數(shù)來處理定時(shí)操作,例如服務(wù)器端的維護(hù)纠屋,定時(shí)更新涂臣,刪除等操作。Redis服務(wù)器主時(shí)間函數(shù)是在server.c中定義的serverCron函數(shù),在默認(rèn)情況下售担,serverCron會(huì)每100ms被調(diào)用一次赁遗。在這個(gè)函數(shù)中,我們看到如下代碼:

image

其中當(dāng)服務(wù)器以sentinel模式運(yùn)行的時(shí)候族铆,serverCron會(huì)調(diào)用sentinelTimer函數(shù)岩四,來運(yùn)行Sentinel中的主邏輯,sentinelTimer函數(shù)在sentinel.c中的定義如下:

image

Sentinel Timer函數(shù)會(huì)做如下幾個(gè)操作:

1. 檢查Sentinel當(dāng)前是否在Tilt 模式(Tilt模式將會(huì)在稍后章節(jié)介紹)哥攘。

2. 檢查Sentinel與其監(jiān)控主備實(shí)例剖煌,以及其他Sentinel實(shí)例的連接,更新當(dāng)前狀態(tài)逝淹,并在主實(shí)例下線的時(shí)候自動(dòng)做主備倒換操作耕姊。

3. 檢查回調(diào)腳本狀態(tài),并做相應(yīng)操作栅葡。

4. 更新服務(wù)器頻率(調(diào)用serverCron函數(shù)的頻率)茉兰,加上一個(gè)隨機(jī)因子,作用是防止監(jiān)控相同主節(jié)點(diǎn)的Sentinel在選舉Leader的時(shí)候時(shí)間沖突欣簇,導(dǎo)致選舉無法產(chǎn)生絕對(duì)多的票數(shù)规脸。

其中SentinelHandleDictOfRedisInstances函數(shù)的定義如下:

image

SentinelHandleDictOfRedisInstances函數(shù)主要做的工作是:

1.調(diào)用sentinelHandleDictOfRedisInstance函數(shù)處理Sentinel與其它特定實(shí)例連接坯约,狀態(tài)更 新,以及主備倒換工作燃辖。

2. 如果當(dāng)前處理實(shí)例為主實(shí)例鬼店,遞歸調(diào)用SentinelHandleDictOfRedisInstances函數(shù)處理其下屬的從實(shí)例以及其他監(jiān)控這個(gè)主實(shí)例的Sentinel。

3. 在主備倒換成功的情況下黔龟,更新主實(shí)例為升級(jí)為主實(shí)例的從實(shí)例妇智。

其中在sentinelHandleRedisInstance的定義如下:

image

這個(gè)函數(shù)會(huì)做以下兩部分操作:

1. 檢查Sentinel和其他實(shí)例(主備實(shí)例以及其他Sentinel)的連接,如果連接沒有設(shè)置或已經(jīng)斷開連接氏身,Sentinel會(huì)重試相對(duì)應(yīng)的連接巍棱,并定時(shí)發(fā)送響應(yīng)命令。 需要注意的是:Sentinel和每個(gè)主備實(shí)例都有兩個(gè)連接蛋欣,命令連接和發(fā)布訂閱連接航徙。但是與其他監(jiān)聽相同主備實(shí)例的Sentinel只保留命令連接,這部分細(xì)節(jié)會(huì)在網(wǎng)絡(luò)章節(jié)單獨(dú)介紹陷虎。

2. 第二部分操作主要做的是監(jiān)測主備及其他Sentinel實(shí)例到踏,并監(jiān)測其是否在主觀下線狀態(tài),對(duì)于主實(shí)例來說尚猿,還要檢測是否在客觀下線狀態(tài)窝稿,并進(jìn)行相應(yīng)的主備倒換操作。

需要注意的是第二部分操作如果Sentinel在Tilt模式下是忽略的凿掂,下面我們來看一下這個(gè)函數(shù)第二部分的的具體實(shí)現(xiàn)細(xì)節(jié)伴榔。

sentinelCheckSubjectivelyDown 函數(shù)會(huì)監(jiān)測特定的Redis實(shí)例(主備實(shí)例以及其他Sentinel)是否處于主觀下線狀態(tài),這部分函數(shù)代碼如下:

image

主觀下線狀態(tài)意味著特定的Redis實(shí)例滿足以下條件之一:

1. 在實(shí)例配置的down_after_milliseconds時(shí)間內(nèi)沒有收到Ping的回復(fù)庄萎。

2. Sentinel認(rèn)為實(shí)例是主實(shí)例踪少,但收到實(shí)例為從實(shí)例的回復(fù),并且上次實(shí)例角色回復(fù)時(shí)間大于在實(shí)例配置的down_after_millisecon時(shí)間加上2倍INFO命令間隔糠涛。

如果任何一個(gè)條件滿足援奢,Sentinel會(huì)打開實(shí)例的S_DOWN標(biāo)志并認(rèn)為實(shí)例進(jìn)入主觀下線狀態(tài)。

主觀下線狀態(tài)意味著Sentinel主觀認(rèn)為實(shí)例下線忍捡,但此時(shí)Sentinel并沒有詢問其他監(jiān)控此實(shí)例的其他Sentinel此實(shí)例的在線狀態(tài)集漾。

sentinelCheckObjectivelyDown 函數(shù)會(huì)檢查實(shí)例是否為客觀下線狀態(tài),這個(gè)操作僅僅對(duì)主實(shí)例進(jìn)行锉罐。sentinelCheckObjectivelyDown函數(shù)定義如下:

image

這個(gè)函數(shù)主要進(jìn)行的操作是循環(huán)查看監(jiān)控此主實(shí)例的其他Sentinel SRI_MASTER_DOWN 標(biāo)志是否打開帆竹,如果打開則意味著其他特定的Sentinel認(rèn)為主實(shí)例處于下線狀態(tài)绕娘,并統(tǒng)計(jì)認(rèn)為主實(shí)例處于下線狀態(tài)的票數(shù)脓规,如果票數(shù)大于等于主實(shí)例配置的quorum值,則Sentinel會(huì)把主實(shí)例的SRI_O_DOWN標(biāo)志打開险领,并認(rèn)為主實(shí)例處于客觀下線狀態(tài)侨舆。

sentinelStartFailoverIfNeeded函數(shù)首先會(huì)檢查實(shí)例是否處于客觀下線狀態(tài)(SRI_O_DOWN標(biāo)志是否打開)秒紧,并且在2倍主實(shí)例配置的主備倒換超時(shí)時(shí)間內(nèi)沒有進(jìn)行主備倒換工作,Sentinel會(huì)打開SRI_FAILOVER_IN_PROGRESS標(biāo)志并設(shè)置倒換狀態(tài)為SENTINEL_FAILOVER_STATE_WAIT_START挨下。并開始進(jìn)行主備倒換工作熔恢。主備倒換的細(xì)節(jié)將在主備倒換的章節(jié)里介紹。

image

參考資料:

https://github.com/antirez/redis

https://redis.io/topics/sentinel

Redis設(shè)計(jì)與實(shí)現(xiàn)第二版黃健宏著

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臭笆,一起剝皮案震驚了整個(gè)濱河市叙淌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愁铺,老刑警劉巖鹰霍,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茵乱,居然都是意外死亡茂洒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門瓶竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來督勺,“玉大人,你說我怎么就攤上這事斤贰≈前В” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵腋舌,是天一觀的道長盏触。 經(jīng)常有香客問我,道長块饺,這世上最難降的妖魔是什么赞辩? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮授艰,結(jié)果婚禮上辨嗽,老公的妹妹穿的比我還像新娘。我一直安慰自己淮腾,他們只是感情好糟需,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谷朝,像睡著了一般洲押。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圆凰,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天杈帐,我揣著相機(jī)與錄音,去河邊找鬼。 笑死挑童,一個(gè)胖子當(dāng)著我的面吹牛累铅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播站叼,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼娃兽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尽楔?” 一聲冷哼從身側(cè)響起投储,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阔馋,沒想到半個(gè)月后轻要,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垦缅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年冲泥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁涎。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凡恍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怔球,到底是詐尸還是另有隱情嚼酝,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布竟坛,位于F島的核電站闽巩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏担汤。R本人自食惡果不足惜涎跨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崭歧。 院中可真熱鬧隅很,春花似錦、人聲如沸率碾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽所宰。三九已至绒尊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仔粥,已是汗流浹背婴谱。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勘究。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像斟冕,于是被迫代替她去往敵國和親口糕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345