新聞中心
redis中哨兵的原理是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)主營(yíng)鐘樓網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開(kāi)發(fā),鐘樓h5重慶小程序開(kāi)發(fā)搭建,鐘樓網(wǎng)站營(yíng)銷推廣歡迎鐘樓等地區(qū)企業(yè)咨詢
哨兵
在一個(gè)典型的一主多從的Redis系統(tǒng)中,當(dāng)主數(shù)據(jù)庫(kù)遇到異常中斷服務(wù)后,需要手動(dòng)選擇一個(gè)從數(shù)據(jù)庫(kù)升級(jí)為主數(shù)據(jù)庫(kù),整個(gè)過(guò)程需要人工介入,難以自動(dòng)化。
Redis2.8提供了哨兵2.0(2.6提供了1.0,但是問(wèn)題較多),哨兵顧名思義就是監(jiān)控Redis系統(tǒng)的運(yùn)行狀況。它的功能包括一下兩個(gè):
監(jiān)控主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是否正常運(yùn)行;
主數(shù)據(jù)庫(kù)出現(xiàn)故障時(shí)自動(dòng)將從數(shù)據(jù)庫(kù)升級(jí)為主數(shù)據(jù)庫(kù);
哨兵是一個(gè)獨(dú)立的進(jìn)行,在一個(gè)一主多從的Redis系統(tǒng)中,可以使用多個(gè)哨兵監(jiān)控整個(gè)Redis系統(tǒng),哨兵之間也會(huì)互相監(jiān)控。
配置
基于前面的一主兩從架構(gòu),為他們加入哨兵。
可以在三個(gè)redis節(jié)點(diǎn)的redis目錄下找到sentinel.conf文件,這個(gè)文件就是哨兵的配置文件,修改配置如下:
sentinel monitor mymaster 192.168.2.101 6379 3
其中:
mymaster是要監(jiān)控的主數(shù)據(jù)庫(kù)名字,可以自定義;
接下來(lái)是主數(shù)據(jù)庫(kù)的ip和端口;
最后一個(gè)3是指哨兵最低通過(guò)票數(shù);
如果你需要后臺(tái)啟動(dòng),則修改daemonize參數(shù):
daemonize yes
配置后如果有防火墻,不要忘記打開(kāi)哨兵的端口,默認(rèn)是26379。
最后,開(kāi)啟哨兵:
redis-sentinel /yourpath/sentinel.conf
做個(gè)測(cè)試,關(guān)閉主數(shù)據(jù)庫(kù)(192.168.2.101)后,等待30秒(默認(rèn)30秒):
哨兵將從數(shù)據(jù)庫(kù)中的一個(gè)節(jié)點(diǎn)升級(jí)成主數(shù)據(jù)庫(kù)(192.168.2.102);
將另一個(gè)從數(shù)據(jù)庫(kù)(192.168.2.103)的主數(shù)據(jù)庫(kù)(192.168.2.101)切換到新的主數(shù)據(jù)庫(kù)(192.168.2.102);
隨后啟動(dòng)剛才關(guān)閉的主數(shù)據(jù)庫(kù)(192.168.2.101),哨兵自動(dòng)將其轉(zhuǎn)為從數(shù)據(jù)庫(kù);
原理
1. 監(jiān)控過(guò)程
哨兵啟動(dòng)后,會(huì)與要監(jiān)控的主數(shù)據(jù)庫(kù)建立兩條連接:
一條用來(lái)用來(lái)訂閱__sentinel__:hello頻道以獲取其他哨兵節(jié)點(diǎn)的信息;
另一條用來(lái)定期向主數(shù)據(jù)庫(kù)發(fā)送INFO等命令來(lái)獲取主數(shù)據(jù)庫(kù)本身的信息;
在和主數(shù)據(jù)庫(kù)建立連接后,哨兵會(huì)定時(shí)執(zhí)行下面3個(gè)操作:
每10秒哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)發(fā)送INFO命令;
每2秒哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)的__sentinel__:hello頻道發(fā)送自己的信息;
每1秒哨兵會(huì)向主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)和其他哨兵發(fā)送PING命令;
第一個(gè)操作是發(fā)送INFO命令,目的是獲取主數(shù)據(jù)庫(kù)的信息,以及主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù)的信息,從而實(shí)現(xiàn)新節(jié)點(diǎn)的自動(dòng)發(fā)現(xiàn),并對(duì)從數(shù)據(jù)庫(kù)也建立兩條連接。
第二個(gè)操作是訂閱__sentinel__:hello頻道,并發(fā)送哨兵本身的信息,與同樣監(jiān)控該數(shù)據(jù)庫(kù)的其他哨兵分享自己的信息,同時(shí)也能識(shí)別哨兵是否是新哨兵。哨兵與哨兵之間也會(huì)建立一個(gè)鏈接,用來(lái)發(fā)送PING命令;
第三個(gè)操作是發(fā)送PING命令,在發(fā)現(xiàn)了從數(shù)據(jù)庫(kù)和其他哨兵后,要做的就是定時(shí)監(jiān)控Redis服務(wù)是否停止,時(shí)間間隔與配置文件中的down-after-milliseconds有關(guān),當(dāng)這個(gè)值小于1秒時(shí),哨兵會(huì)每隔該值的時(shí)間發(fā)送PING命令,當(dāng)這個(gè)值大于1秒時(shí),哨兵會(huì)每隔1秒發(fā)送一次PING命令。
配置方式是在sentinel.conf文件中加入:
sentinel down-after-milliseconds mymaster 600 # 600毫秒發(fā)送一個(gè)PING
當(dāng)超過(guò)down-after-milliseconds時(shí),如果PING的數(shù)據(jù)庫(kù)未回復(fù),則哨兵認(rèn)為其主觀下線。主觀下線可以理解為當(dāng)前的哨兵認(rèn)為該節(jié)點(diǎn)下線了。
如果該節(jié)點(diǎn)是主數(shù)據(jù)庫(kù),則哨兵們會(huì)進(jìn)一步判斷是否需要對(duì)其進(jìn)行故障修復(fù):
哨兵會(huì)發(fā)送SENTINEL is-master-down-by-addr命令詢問(wèn)其他哨兵,判斷他們是否也認(rèn)為該主數(shù)據(jù)庫(kù)下線,如果達(dá)到quorum參數(shù),也就是我們?cè)谂渲蒙诒鴷r(shí)的命令:
sentinel monitor mymaster 192.168.2.101 6379 3
的最后一個(gè)參數(shù)3,哨兵們會(huì)認(rèn)為這個(gè)主數(shù)據(jù)庫(kù)客觀下線,并選舉一個(gè)領(lǐng)頭哨兵對(duì)主從系統(tǒng)發(fā)起故障恢復(fù)。
2. 領(lǐng)頭哨兵選舉
要進(jìn)行故障恢復(fù),則需要選舉出一個(gè)領(lǐng)頭哨兵,領(lǐng)頭哨兵的選擇算法是Raft算法,具體過(guò)程如下:
發(fā)現(xiàn)主數(shù)據(jù)庫(kù)客觀下線的哨兵節(jié)點(diǎn)(A節(jié)點(diǎn))想每個(gè)哨兵節(jié)點(diǎn)發(fā)送命令,要求對(duì)方選擇自己成為領(lǐng)頭哨兵;
如果目標(biāo)哨兵節(jié)點(diǎn)沒(méi)有選擇過(guò)其他人,則會(huì)同意將A設(shè)置成領(lǐng)頭哨兵;
如果A發(fā)現(xiàn)超過(guò)半數(shù)且超過(guò)quorum參數(shù)個(gè)哨兵節(jié)點(diǎn)同意選擇自己,則A成功成為領(lǐng)頭哨兵;
當(dāng)有多個(gè)哨兵同時(shí)參選,則會(huì)出現(xiàn)沒(méi)有任何節(jié)點(diǎn)當(dāng)選的可能,此時(shí)每個(gè)參選節(jié)點(diǎn)將等待一個(gè)隨即時(shí)間重新發(fā)起競(jìng)選,直到選舉成功。
3. 故障恢復(fù)
選擇出領(lǐng)頭哨兵后,會(huì)把從數(shù)據(jù)庫(kù)中的一個(gè)挑選出來(lái)升級(jí)為主數(shù)據(jù)庫(kù):
所有先線的從數(shù)據(jù)庫(kù)中,選擇優(yōu)先級(jí)最高的,優(yōu)先級(jí)可以通過(guò)slave-priority來(lái)設(shè)置;
如果有多個(gè)一樣優(yōu)先級(jí)的從數(shù)據(jù)庫(kù),則復(fù)制的命令偏移量越大,越優(yōu)先(與down掉的主數(shù)據(jù)庫(kù)最接近);
如果還有多個(gè)備選,則選擇運(yùn)行ID較小的(運(yùn)行ID不會(huì)重復(fù));
選擇好節(jié)點(diǎn)后,領(lǐng)頭哨兵將想這個(gè)節(jié)點(diǎn)發(fā)送slaveof no one,升級(jí)他為主數(shù)據(jù)庫(kù)。
然后想其他從數(shù)據(jù)庫(kù)發(fā)送slaveof命令切換主數(shù)據(jù)庫(kù)。
最后更新內(nèi)部的記錄,將已經(jīng)停止服務(wù)的舊的主數(shù)據(jù)庫(kù)更新為新的主數(shù)據(jù)庫(kù)的從數(shù)據(jù)庫(kù),當(dāng)其回復(fù)后自動(dòng)以從數(shù)據(jù)庫(kù)的身份加入到主從架構(gòu)中。
哨兵部署
哨兵的推薦部署方案:
為每個(gè)節(jié)點(diǎn)(無(wú)論是主數(shù)據(jù)庫(kù)還是從數(shù)據(jù)庫(kù))都部署一個(gè)哨兵;
使每個(gè)哨兵與其對(duì)應(yīng)的節(jié)點(diǎn)的網(wǎng)絡(luò)環(huán)境相同或相近;
設(shè)置quorum的值為N/2+1,這樣使得只有當(dāng)大部分哨兵統(tǒng)一后才會(huì)選擇領(lǐng)頭哨兵進(jìn)行故障恢復(fù)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
文章題目:Redis中哨兵的原理是什么
標(biāo)題URL:http://fisionsoft.com.cn/article/ghjdjj.html