生活随笔
收集整理的這篇文章主要介紹了
redis sentinel(哨兵)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
- Sentinel原理
- Sentinel 監(jiān)視流程
- sentinel檢查下線
- 故障轉(zhuǎn)移:
- 選舉領(lǐng)頭sentinel:
- 故障轉(zhuǎn)移
Sentinel是redis高可用的方案,通過設(shè)立一個或多個Sentinel監(jiān)視服務(wù)器,可以在主服務(wù)器下線的時候及時選舉切換到從服務(wù)器,保證可用性。
Sentinel本身也是服務(wù)器,只是運行在特殊模式下,監(jiān)聽其他服務(wù)器而已。
Sentinel原理
sentinel 是通過定時檢查主服務(wù)器和從服務(wù)器的在線狀態(tài),如果主服務(wù)器不在線,則選舉一個從服務(wù)器做主。
Sentinel 監(jiān)視流程
初始化服務(wù)器:Sentinel也是一個redis服務(wù)器,所以也需要初始化一個redis服務(wù)器,但是其中略有不同:sentinel無需在啟動時載入持久化文件將普通redis服務(wù)器代碼替換為Sentinel專用代碼:比如替換運行端口,使用sentinel特有的redisCommandTable字典初始化Sentinel狀態(tài):將Sentinel有關(guān)的狀態(tài)載入sentinelState的結(jié)構(gòu)體內(nèi)。sentinelState結(jié)構(gòu)體有幾個比較重要的屬性:
current_epch:當(dāng)前紀(jì)元,一個計數(shù)器,用于記錄故障恢復(fù)的次數(shù)和故障轉(zhuǎn)移masters字典:記錄所有配置中受Sentinel監(jiān)視的主服務(wù)器節(jié)點,鍵為服務(wù)器名,值為sentinelRedisInstance結(jié)構(gòu)體,這個結(jié)構(gòu)體可以是從從服務(wù)器、主服務(wù)器、或者另一個Sentinel初始化sentinelState內(nèi)的master字典:該字典將通過Sentinel配置文件初始化,一個主服務(wù)器名稱對應(yīng)一個sentinelRedisInstance實例.sentinelRedisInstance結(jié)構(gòu)體內(nèi)幾個重要屬性:
flags:整數(shù)標(biāo)識值,記錄實例的類型和狀態(tài)name:主服務(wù)器有配置文件指定,從服務(wù)器由ip:port形成config_epoch:配置紀(jì)元,計數(shù)器,用于記錄故障恢復(fù)次數(shù)和故障轉(zhuǎn)移down_after_period:判斷主觀下線的無響應(yīng)時間,單位ms,由設(shè)置down-after-milliseconds指定quorum:判斷客觀下線需要的投票數(shù)量slaves:從服務(wù)器字典,ip:port作為鍵,sentinelRedisInstance作為值創(chuàng)建連接主服務(wù)器的網(wǎng)絡(luò)連接:這時才會連接主服務(wù)器,會產(chǎn)生兩個連接:一個命令連接,用于向主服務(wù)器發(fā)送命令和接受回復(fù);一個訂閱連接,訂閱主服務(wù)器的_sentinel_:hello頻道。主服務(wù)器會將自身的從服務(wù)器同步給sentinel,這樣sentinel就能掌握所有從服務(wù)器信息。獲取主服務(wù)器信息:sentinel默認(rèn)每10秒對主服務(wù)器發(fā)送INFO命令,主服務(wù)器返回自身和自己從服務(wù)器的信息創(chuàng)建到從服務(wù)器的連接:和主服務(wù)器一樣,sentinel也會對從服務(wù)器建立命令連接和訂閱連接。sentinel在連接從服務(wù)器之后,也會默認(rèn)10秒一次,向從服務(wù)器發(fā)送INFO命令,從服務(wù)器將它的信息返回給sentinel向主服務(wù)器和從服務(wù)器發(fā)送信息和接受信息:通過命令連接,sentinel會向主服務(wù)器和從服務(wù)器的_sentinel_:hello發(fā)送信息,包含主服務(wù)器和sentinel自身的ip、端口、配置紀(jì)元等信息,同時sentinel也會通過訂閱連接訂閱_sentinel_:hello。通過這種方式,監(jiān)聽同一個服務(wù)器的多個sentinel將會彼此發(fā)現(xiàn),并將其他的sentinel信息也保存到master字典sentinelRedisInstance值的sentinels字典內(nèi),sentinels和master一樣,也是一個name-sentinelRedisInstance的字典,只是內(nèi)部存放的是所有sentinel的實例創(chuàng)建連接其他sentinel的命令連接:sentinel之間通信,選主投票會使用這個連接
sentinel檢查下線
主觀下線:
sentinel默認(rèn)每秒一次,向它監(jiān)視的實例(主服務(wù)器,從服務(wù)器,sentinel)發(fā)送ping命令,如果實例沒有在down_after_period時間內(nèi)返回響應(yīng),或者返回了PONG、LOADING、MASTERDOWN這三個響應(yīng)之外的響應(yīng),則認(rèn)定該實例主觀下線。實例對應(yīng)flags打開SRI_S_DOWN標(biāo)識.需要注意的是:幾個sentinel的down_after_period時間設(shè)置的也許不同,這時,幾個sentinel監(jiān)視的服務(wù)器主觀下線的狀態(tài)可能也會不同。down_after_period屬性只對一個sentinel下監(jiān)聽的所有主服務(wù)器,從服務(wù)器和其他sentinel有效。
客觀下線:
一個sentinel認(rèn)為服務(wù)器下線了,是主觀下線,需要多個服務(wù)器投票,超過quorum個,才會認(rèn)為這個服務(wù)器真的下線了,這是客觀下線。
當(dāng)sentinel發(fā)現(xiàn)主服務(wù)器主觀下線后,將向其他sentinel發(fā)送SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>命令。如果回應(yīng)也認(rèn)同下線,并且回應(yīng)數(shù)量超過quorum,則認(rèn)為主服務(wù)器客觀下線,flags打開標(biāo)識SRI_O_DOWN。需要注意的是,多個sentinel之間,判斷客觀下線的quorum可能不同,加上它們判斷主觀下線的時間也不同。最后sentinel判斷下線,可能并不那么簡單。
故障轉(zhuǎn)移:
為了將下線的主服務(wù)器換下,將從服務(wù)器換上,故障轉(zhuǎn)移需要完成:選舉領(lǐng)頭sentinel、選舉新的主服務(wù)器,修改從服務(wù)器復(fù)制的目標(biāo)到新的主服務(wù)器,將舊的主服務(wù)器變?yōu)閺姆?wù)器幾步操作。
選舉領(lǐng)頭sentinel:
領(lǐng)頭sentinel將會主導(dǎo)后續(xù)流程。sentinel選舉的規(guī)則即為Raft領(lǐng)頭選舉算法:
1. 每個認(rèn)定主服務(wù)器客觀下線的sentinel都有機會稱為領(lǐng)頭,它們都將發(fā)送向其他sentinel發(fā)送SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>命令。
其中如果runid不為*,而是源sentinel的runid的話,說明源sentinel要求接收方將自己設(shè)為領(lǐng)頭sentinel。接收sentinel將會返回一條命令回復(fù),其中l(wèi)eader_runid和leader_epoch記錄了接收sentinel認(rèn)為的領(lǐng)頭sentinel的runid和紀(jì)元
2. 領(lǐng)頭sentinel選舉是先到先得的,最先發(fā)起命令的被接受,其后的將拒絕
3. 如果一個sentinel被半數(shù)以上的sentinel設(shè)為了領(lǐng)頭sentinel(通過命令回復(fù)的leader_runid統(tǒng)計),則這個sentinel稱為這一輪的領(lǐng)頭sentinel。
4. 如果一輪選舉后未有超過半數(shù)認(rèn)可的sentinel,則epoch計數(shù)加1,進行下一輪選舉,直至選出
故障轉(zhuǎn)移
領(lǐng)頭sentinel從 從服務(wù)器中挑選新的主服務(wù)器,對其發(fā)送命令SLAVEOF no one使其不再復(fù)制,挑選新的服務(wù)器原則是:
去掉斷開或掉線的從服務(wù)器去掉5秒內(nèi)沒有回復(fù)領(lǐng)頭sentinelINFO命令的從服務(wù)器去掉與已下線的主服務(wù)器斷開超過down-after-milliseconds*10毫秒的從服務(wù)器,保證從服務(wù)器的數(shù)據(jù)較新按從服務(wù)器優(yōu)先級、從服務(wù)器的復(fù)制偏移量、從服務(wù)器的ID,選出優(yōu)先級最高,復(fù)制偏移量最大(相同優(yōu)先級下),id最小(復(fù)制偏移量相同下)的從服務(wù)器為新的主服務(wù)器通知其他從服務(wù)器復(fù)制新的主服務(wù)器:向其他從服務(wù)器發(fā)送SLAVEOF命令,指向新的主服務(wù)器ip port舊主服務(wù)器變?yōu)閺姆?wù)器:當(dāng)舊主服務(wù)器再次上線時,對其發(fā)送SLAVEOF命令,指向新的主服務(wù)器
總結(jié)
以上是生活随笔為你收集整理的redis sentinel(哨兵)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。