怎樣入門Redis哨兵Sentinel模式

本篇文章為大家展示了怎樣入門redis哨兵Sentinel模式,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)主營(yíng)廣安網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都APP應(yīng)用開發(fā),廣安h5微信小程序搭建,廣安網(wǎng)站營(yíng)銷推廣歡迎廣安等地區(qū)企業(yè)咨詢

Redis sentinel是Redis高可用實(shí)現(xiàn)方案:故障發(fā)現(xiàn)、故障自動(dòng)轉(zhuǎn)移、配置中心、客戶端通知。從Redis的2.6版本開始提供的,但是當(dāng)時(shí)這個(gè)版本的模式是不穩(wěn)定的,直到Redis的2.8版本以后,這個(gè)哨兵模式才穩(wěn)定下來,在生產(chǎn)環(huán)境中,如果想要使用Redis的哨兵模式,也會(huì)盡量使用Redis的2.8版本之后的版本。

哨兵雖然有一個(gè)單獨(dú)的可執(zhí)行文件Redis-sentinel ,但實(shí)際上它只是一個(gè)運(yùn)行在特殊模式下的 Redis服務(wù)器,你可以在啟動(dòng)一個(gè)普通Redis服務(wù)器時(shí)通過給定--sentinel選項(xiàng)來啟動(dòng)哨兵,哨兵的一些設(shè)計(jì)思路和zookeeper非常類似。

怎樣入門Redis哨兵Sentinel模式

sentinel的定時(shí)任務(wù)

sentinel機(jī)制中有三種重要的定時(shí)任務(wù)。

  1. 每10秒每個(gè)sentinel對(duì)master和slave執(zhí)行info

作用:

  • 發(fā)現(xiàn)slave節(jié)點(diǎn)。

  • 確認(rèn)主從關(guān)系。

  1. 每2秒每個(gè)sentinel通過master節(jié)點(diǎn)的channel交換信息(pub/sub)

作用:

  • 互相通信掌握節(jié)點(diǎn)的信息和自身信息,可以感知新加入的sentinel

> 通過master節(jié)點(diǎn)的__sentinel__:hello頻道進(jìn)行交互,所有sentinel訂閱這個(gè)頻道并每2秒向該頻道發(fā)布信息

  1. 每1秒每個(gè)sentinel對(duì)其他sentinel和master,slave進(jìn)行ping

作用:

  • 心跳檢測(cè)

主觀下線和客觀下線

主觀下線

主觀下線:?jiǎn)蝹€(gè)sentinel節(jié)點(diǎn)對(duì)Redis節(jié)點(diǎn)通信失敗的“偏見”。

這是一種主觀下線。因?yàn)樵趶?fù)雜的網(wǎng)絡(luò)環(huán)境下,這個(gè)sentinel與這個(gè)master不通,但是如果master與其他的sentinel都是通的呢?所以是一種“偏見”。

這是依靠的第三種定時(shí):每秒去ping一下周圍的sentinel和Redis。對(duì)于slave Redis,可以使用這個(gè)主觀下線,因?yàn)樗恍枰M(jìn)行故障轉(zhuǎn)移;但是對(duì)于master Redis,必須使用客觀下線。

客觀下線

客觀下線:所有sentinel節(jié)點(diǎn)對(duì)master Redis節(jié)點(diǎn)失敗“達(dá)成共識(shí)”(超過quorum個(gè)則統(tǒng)一,quorum可配置)。

這是依靠的第二種定時(shí):每?jī)擅?,sentinel之間進(jìn)行“商量”(一個(gè) sentinel 可以通過向另一個(gè) sentinel 發(fā)送 SENTINEL is-master-down-by-addr 命令來詢問對(duì)方是否認(rèn)為給定的服務(wù)器已下線。)

對(duì)于master redis的下線,必須要達(dá)成共識(shí)才可以,因?yàn)樯婕肮收限D(zhuǎn)移,僅僅依靠一個(gè)sentinel判斷是不夠的

領(lǐng)導(dǎo)者選舉

當(dāng)sentinel集群需要故障轉(zhuǎn)移的時(shí)候會(huì)在集群中選出Leader執(zhí)行故障轉(zhuǎn)移操作。sentinel采用了Raft協(xié)議實(shí)現(xiàn)了sentinel間選舉Leader的算法,不過也不完全跟論文描述的步驟一致。sentinel集群運(yùn)行過程中故障轉(zhuǎn)移完成,所有sentinel又會(huì)恢復(fù)平等。Leader僅僅是故障轉(zhuǎn)移操作出現(xiàn)的角色。

選舉流程

  1. 某個(gè)sentinel認(rèn)定master客觀下線的節(jié)點(diǎn)后,該sentinel會(huì)先看看自己有沒有投過票,如果自己已經(jīng)投過票給其他sentinel了,在2倍故障轉(zhuǎn)移的超時(shí)時(shí)間自己就不會(huì)成為L(zhǎng)eader。相當(dāng)于它是一個(gè)Follower。

  2. 如果該sentinel還沒投過票,那么它就成為Candidate。

  3. 和Raft協(xié)議描述的一樣,成為Candidate,sentinel需要完成幾件事情
    3.1 更新故障轉(zhuǎn)移狀態(tài)為start
    3.2 當(dāng)前epoch加1,相當(dāng)于進(jìn)入一個(gè)新term,在sentinel中epoch就是Raft協(xié)議中的term。
    3.3 更新自己的超時(shí)時(shí)間為當(dāng)前時(shí)間隨機(jī)加上一段時(shí)間,隨機(jī)時(shí)間為1s內(nèi)的隨機(jī)毫秒數(shù)。 3.4 向其他節(jié)點(diǎn)發(fā)送is-master-down-by-addr命令請(qǐng)求投票。命令會(huì)帶上自己的epoch。 3.5 給自己投一票,在sentinel中,投票的方式是把自己master結(jié)構(gòu)體里的leader和leader_epoch改成投給的sentinel和它的epoch。

  4. 其他sentinel會(huì)收到Candidate的is-master-down-by-addr命令。如果sentinel當(dāng)前epoch和Candidate傳給他的epoch一樣,說明他已經(jīng)把自己master結(jié)構(gòu)體里的leader和leader_epoch改成其他Candidate,相當(dāng)于把票投給了其他Candidate。投過票給別的sentinel后,在當(dāng)前epoch內(nèi)自己就只能成為Follower。

  5. Candidate會(huì)不斷的統(tǒng)計(jì)自己的票數(shù),直到他發(fā)現(xiàn)認(rèn)同他成為L(zhǎng)eader的票數(shù)超過一半而且超過它配置的quorum(quorum可以參考《redis sentinel設(shè)計(jì)與實(shí)現(xiàn)》)。sentinel比Raft協(xié)議增加了quorum,這樣一個(gè)sentinel能否當(dāng)選Leader還取決于它配置的quorum。

  6. 如果在一個(gè)選舉時(shí)間內(nèi),Candidate沒有獲得超過一半且超過它配置的quorum的票數(shù),自己的這次選舉就失敗了。

  7. 如果在一個(gè)epoch內(nèi),沒有一個(gè)Candidate獲得更多的票數(shù)。那么等待超過2倍故障轉(zhuǎn)移的超時(shí)時(shí)間后,Candidate增加epoch重新投票。

  8. 如果某個(gè)Candidate獲得超過一半且超過它配置的quorum的票數(shù),那么它就成為了Leader。

  9. 與Raft協(xié)議不同,Leader并不會(huì)把自己成為L(zhǎng)eader的消息發(fā)給其他sentinel。其他sentinel等待Leader從slave選出master后,檢測(cè)到新的master正常工作后,就會(huì)去掉客觀下線的標(biāo)識(shí),從而不需要進(jìn)入故障轉(zhuǎn)移流程。

故障轉(zhuǎn)移過程

  1. 當(dāng)多個(gè)sentinel發(fā)現(xiàn)并確認(rèn)了master有問題

  2. 接著會(huì)選舉出一個(gè)sentinel作為領(lǐng)導(dǎo)

  3. 再選舉出一個(gè)slave作為master

  4. 通知其余的slave,新的master是誰

  5. 通知客戶端一個(gè)主從的變化

  6. 最后,sentinel會(huì)等待舊的master復(fù)活,然后將新master成為slave

那么,如何選擇“合適”的slave節(jié)點(diǎn)呢?

  1. 選擇slave-priority(slave節(jié)點(diǎn)優(yōu)先級(jí),人為配置)最高的slave節(jié)點(diǎn),如果存在則返回,不存在則繼續(xù)。

  2. 其次會(huì)選擇復(fù)制偏移量最大的slave節(jié)點(diǎn)(復(fù)制得最完整),如果存在則返回,不存在則繼續(xù)

  3. 最后會(huì)選擇run_id最小的slave節(jié)點(diǎn)(啟動(dòng)最早的節(jié)點(diǎn))

客戶端實(shí)現(xiàn)高可用的基本原理

故障轉(zhuǎn)移后客戶端無法感知將無法保證正常的使用。所以,實(shí)現(xiàn)客戶端高可用的步驟如下:

  1. 客戶端獲取sentinel節(jié)點(diǎn)集合

怎樣入門Redis哨兵Sentinel模式

  1. 客戶端通過sentinel get-master-addr-by-name master-name這個(gè)api來獲取對(duì)應(yīng)主節(jié)點(diǎn)信息

怎樣入門Redis哨兵Sentinel模式

  1. 客戶端驗(yàn)證當(dāng)前獲取的“主節(jié)點(diǎn)”是真正的主節(jié)點(diǎn),這樣的目的是為了防止故障轉(zhuǎn)移期間主節(jié)點(diǎn)的變化

怎樣入門Redis哨兵Sentinel模式

  1. 客戶端保持和sentinel節(jié)點(diǎn)集合的聯(lián)系,即訂閱sentinel節(jié)點(diǎn)相關(guān)頻道,時(shí)刻獲取關(guān)于主節(jié)點(diǎn)的相關(guān)信息

怎樣入門Redis哨兵Sentinel模式

從上面的模型可以看出,Redis sentinel客戶端只有在初始化和切換主節(jié)點(diǎn)時(shí)需要和sentinel進(jìn)行通信來獲取主節(jié)點(diǎn)信息,所以在設(shè)計(jì)客戶端時(shí)需要將sentinel節(jié)點(diǎn)集合考慮成配置(相關(guān)節(jié)點(diǎn)信息和變化)發(fā)現(xiàn)服務(wù)。

需要說明的問題

  • 盡可能在不同物理機(jī)上和同一個(gè)網(wǎng)絡(luò)部署Redis sentinel的所有節(jié)點(diǎn)

  • Redis sentinel中的sentinel節(jié)點(diǎn)個(gè)數(shù)應(yīng)該大于等于3且最好是奇數(shù)。(節(jié)點(diǎn)數(shù)多可以保證高可用)

  • Redis sentinel中的數(shù)據(jù)節(jié)點(diǎn)和普通數(shù)據(jù)節(jié)點(diǎn)沒有區(qū)別。每個(gè)sentinel節(jié)點(diǎn)在本質(zhì)上還是一個(gè)Redis實(shí)例,只不過和Redis數(shù)據(jù)節(jié)點(diǎn)不同的是,其主要作用是監(jiān)控Redis數(shù)據(jù)節(jié)點(diǎn)

  • 客戶端初始化時(shí)連接的是sentinel節(jié)點(diǎn)集合,不再是具體的Redis節(jié)點(diǎn),但sentinel只是配置中心不是代理。

上述內(nèi)容就是怎樣入門Redis哨兵Sentinel模式,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章名稱:怎樣入門Redis哨兵Sentinel模式
網(wǎng)站鏈接:http://muchs.cn/article14/pdghde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站維護(hù)、建站公司、網(wǎng)站制作、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)