? ? ? ? 一膳犹、 Redis Sentinel 簡介
????????Redis Sentinel(哨兵)是Redis官方推薦高可用方案趾牧,它的作用是對Redis節(jié)點(diǎn)進(jìn)行監(jiān)控故黑、故障判斷、故障轉(zhuǎn)移遣臼、故障通知性置。
? ? ? ? 二、 Redis Sentinel 架構(gòu)
? ? ? ? 1?工作原理
? ? ? ? 對于Redis的主從架構(gòu)揍堰,Sentinel會運(yùn)行幾個sentinel進(jìn)程鹏浅,這些進(jìn)程不操作數(shù)據(jù),專門用來進(jìn)行Redis的故障判斷屏歹、故障轉(zhuǎn)移隐砸,同時(shí)多個sentinel進(jìn)程運(yùn)行,如果其中一個進(jìn)程出現(xiàn)問題西采,還有其它進(jìn)程可以用來繼續(xù)監(jiān)控Redis狀況凰萨,并保障Redis的高可用继控。
? ? ? ? 對于Redis客戶端來說械馆,客戶端不會再記錄Redis的ip胖眷、port等信息,而是從Sentinel獲取Redis信息霹崎,然后進(jìn)行連接Redis節(jié)點(diǎn)珊搀,進(jìn)行數(shù)據(jù)操作。
? ? ? ? 2 故障轉(zhuǎn)移過程
? ? ? ? 【步驟一】 主觀下線:?Sentinel會以每秒一次的頻率向所有與它創(chuàng)建了命令連接的實(shí)例發(fā)送PING命令尾菇,并通過實(shí)例返回的PING命令回復(fù)來判斷實(shí)例是否在線境析,如果在約定的時(shí)間內(nèi)沒有響應(yīng),則該Sentinel節(jié)點(diǎn)主觀認(rèn)為這個Redis實(shí)例已下線派诬,然后進(jìn)行客觀下線階段劳淆;
? ? ? ? 【步驟二】 客觀下線:當(dāng)Sentinel將一個主服務(wù)器判斷為主觀下線之后,為了確認(rèn)這個主服務(wù)器是否真的下線默赂,它會向同樣監(jiān)視這一主服務(wù)器的其它Sentinel進(jìn)行詢問沛鸵,看它們是否也認(rèn)為主服務(wù)器已經(jīng)進(jìn)入了下線狀態(tài)。當(dāng)從其它Sentinal那里接收到足夠數(shù)量(quorum配置)的已下線判斷后缆八,Sentinel就會將服務(wù)器判定為客觀下線曲掰,開始對主服務(wù)器執(zhí)行故障轉(zhuǎn)移操作,然后進(jìn)入故障轉(zhuǎn)移階段奈辰;
? ? ? ? 【步驟三】 領(lǐng)導(dǎo)選舉:每個做了主觀下線的Sentinel節(jié)點(diǎn)向其它節(jié)點(diǎn)發(fā)送命令栏妖,要求將自己設(shè)置為領(lǐng)導(dǎo)者;收到命令的節(jié)點(diǎn)如果沒有同意過其它節(jié)點(diǎn)發(fā)送的命令奖恰,則會同意這次請求吊趾,反之則拒絕;如果Sentinel節(jié)點(diǎn)發(fā)現(xiàn)自己的得票數(shù)已經(jīng)超過總結(jié)點(diǎn)數(shù)的一半房官、并且超過quorum(提前配置好的閥值)趾徽,則會成為領(lǐng)導(dǎo)者;如果在上述過程中多個Sentinel節(jié)點(diǎn)成為領(lǐng)導(dǎo)者翰守,則會進(jìn)行重新選舉孵奶;
? ? ? ? 【步驟四】 故障轉(zhuǎn)移:從Redis的所有Slave中選舉出符合條件的一個節(jié)點(diǎn),作為新的Master節(jié)點(diǎn)蜡峰,然后向剩余Slave節(jié)點(diǎn)發(fā)送命令了袁,通知它們成為新Master節(jié)點(diǎn)的Slave,然后所有Slave都會從新Master同步數(shù)據(jù)湿颅;待出問題的節(jié)點(diǎn)(原Master節(jié)點(diǎn))復(fù)活后载绿,其也會成為新Master節(jié)點(diǎn)的Slave,并從Master節(jié)點(diǎn)同步新數(shù)據(jù)油航。
? ? ? ? 三崭庸、Redis Sentinel 中的定時(shí)任務(wù)
? ? ? ? 1??獲取主服務(wù)器信息
????????Sentinel默認(rèn)會以每十秒一次的頻率,通過命令連接向被監(jiān)視的主服務(wù)器發(fā)送INFO命令,并通過分析INFO命令的回復(fù)來獲取主服務(wù)器的當(dāng)前信息怕享。
? ? ? ? 2? Sentinel交換消息
? ? ? ? Sentinel所有節(jié)點(diǎn)會以每兩秒一次的頻率执赡,通過Redis的Master節(jié)點(diǎn)的Channel來交換信息,這個過程也叫作發(fā)布訂閱函筋;
? ? ? ? Redis的Master節(jié)點(diǎn)上有一個發(fā)布訂閱的Channel頻道:_sentinel_:hello沙合,用于所有Sentinal之間進(jìn)行信息交換;Sentinal發(fā)布的消息中包含了當(dāng)前Sentinel自身節(jié)點(diǎn)的信息跌帐,對其它Sentinel節(jié)點(diǎn)的判斷首懈、以及對Redis的Master節(jié)點(diǎn)和Slave節(jié)點(diǎn)的判斷,其它Sentinel節(jié)點(diǎn)都會收到這條消息谨敛;當(dāng)有新的Sentinel節(jié)點(diǎn)加入時(shí)究履,其它Sentinel也是通過這種方式感知到。
? ? ? ? 3??故障判斷
????????Sentinel會以每秒一次的頻率脸狸,向所有與它創(chuàng)建了命令連接的實(shí)例發(fā)送PING命令挎袜,并通過實(shí)例返回的PING命令回復(fù)來判斷實(shí)例是否在線。