sentinel,中文名是哨兵。哨兵是 redis 集群機構中非常重要的一個組件,主要有以下功能:
哨兵用于實現(xiàn) redis 集群的高可用,本身也是分布式的,作為一個哨兵集群去運行,互相協(xié)同工作。
哨兵集群必須部署 2 個以上節(jié)點,如果哨兵集群僅僅部署了 2 個哨兵實例,quorum = 1。
+----+ +----+
| M1 |---------| R1 |
| S1 | | S2 |
+----+ +----+
配置?quorum=1
,如果 master 宕機, s1 和 s2 中只要有 1 個哨兵認為 master 宕機了,就可以進行切換,同時 s1 和 s2 會選舉出一個哨兵來執(zhí)行故障轉移。但是同時這個時候,需要 majority,也就是大多數(shù)哨兵都是運行的。
2 個哨兵,majority=2
3 個哨兵,majority=2
4 個哨兵,majority=2
5 個哨兵,majority=3
...
如果此時僅僅是 M1 進程宕機了,哨兵 s1 正常運行,那么故障轉移是 OK 的。但是如果是整個 M1 和 S1 運行的機器宕機了,那么哨兵只有 1 個,此時就沒有 majority 來允許執(zhí)行故障轉移,雖然另外一臺機器上還有一個 R1,但是故障轉移不會執(zhí)行。
經(jīng)典的 3 節(jié)點哨兵集群是這樣的:
+----+
| M1 |
| S1 |
+----+
|
+----+ | +----+
| R2 |----+----| R3 |
| S2 | | S3 |
+----+ +----+
配置?quorum=2
,如果 M1 所在機器宕機了,那么三個哨兵還剩下 2 個,S2 和 S3 可以一致認為 master 宕機了,然后選舉出一個來執(zhí)行故障轉移,同時 3 個哨兵的 majority 是 2,所以還剩下的 2 個哨兵運行著,就可以允許執(zhí)行故障轉移。
主備切換的過程,可能會導致數(shù)據(jù)丟失:
因為 master->slave 的復制是異步的,所以可能有部分數(shù)據(jù)還沒復制到 slave,master 就宕機了,此時這部分數(shù)據(jù)就丟失了。
腦裂,也就是說,某個 master 所在機器突然脫離了正常的網(wǎng)絡,跟其他 slave 機器不能連接,但是實際上 master 還運行著。此時哨兵可能就會認為master 宕機了,然后開啟選舉,將其他 slave 切換成了 master。這個時候,集群里就會有兩個 master ,也就是所謂的腦裂。
此時雖然某個 slave 被切換成了 master,但是可能 client 還沒來得及切換到新的 master,還繼續(xù)向舊 master 寫數(shù)據(jù)。因此舊 master 再次恢復的時候,會被作為一個 slave 掛到新的 master 上去,自己的數(shù)據(jù)會清空,重新從新的 master 復制數(shù)據(jù)。而新的 master 并沒有后來 client 寫入的數(shù)據(jù),因此,這部分數(shù)據(jù)也就丟失了。
進行如下配置:
min-slaves-to-write 1
min-slaves-max-lag 10
表示,要求至少有 1 個 slave,數(shù)據(jù)復制和同步的延遲不能超過 10 秒。
如果說一旦所有的 slave,數(shù)據(jù)復制和同步的延遲都超過了 10 秒鐘,那么這個時候,master 就不會再接收任何請求了。
有了?min-slaves-max-lag
這個配置,就可以確保說,一旦 slave 復制數(shù)據(jù)和 ack 延時太長,就認為可能 master 宕機后損失的數(shù)據(jù)太多了,那么就拒絕寫請求,這樣可以把 master 宕機時由于部分數(shù)據(jù)未同步到 slave 導致的數(shù)據(jù)丟失降低的可控范圍內(nèi)。
如果一個 master 出現(xiàn)了腦裂,跟其他 slave 丟了連接,那么上面兩個配置可以確保說,如果不能繼續(xù)給指定數(shù)量的 slave 發(fā)送數(shù)據(jù),而且 slave 超過 10 秒沒有給自己 ack 消息,那么就直接拒絕客戶端的寫請求。因此在腦裂場景下,最多就丟失 10 秒的數(shù)據(jù)。
sdown 達成的條件很簡單,如果一個哨兵 ping 一個 master,超過了?is-master-down-after-milliseconds
指定的毫秒數(shù)之后,就主觀認為 master 宕機了;如果一個哨兵在指定時間內(nèi),收到了 quorum 數(shù)量的其它哨兵也認為那個 master 是 sdown 的,那么就認為是 odown 了。
哨兵互相之間的發(fā)現(xiàn),是通過 redis 的?pub/sub
系統(tǒng)實現(xiàn)的,每個哨兵都會往?__sentinel__:hello
這個 channel 里發(fā)送一個消息,這時候所有其他哨兵都可以消費到這個消息,并感知到其他的哨兵的存在。
每隔兩秒鐘,每個哨兵都會往自己監(jiān)控的某個 master+slaves 對應的?__sentinel__:hello
channel 里發(fā)送一個消息,內(nèi)容是自己的 host、ip 和 runid 還有對這個 master 的監(jiān)控配置。
每個哨兵也會去監(jiān)聽自己監(jiān)控的每個 master+slaves 對應的?__sentinel__:hello
channel,然后去感知到同樣在監(jiān)聽這個 master+slaves 的其他哨兵的存在。
每個哨兵還會跟其他哨兵交換對?master
的監(jiān)控配置,互相進行監(jiān)控配置的同步。
哨兵會負責自動糾正 slave 的一些配置,比如 slave 如果要成為潛在的 master 候選人,哨兵會確保 slave 復制現(xiàn)有 master 的數(shù)據(jù);如果 slave 連接到了一個錯誤的 master 上,比如故障轉移之后,那么哨兵會確保它們連接到正確的 master 上。
如果一個 master 被認為 odown 了,而且 majority 數(shù)量的哨兵都允許主備切換,那么某個哨兵就會執(zhí)行主備切換操作,此時首先要選舉一個 slave 來,會考慮 slave 的一些信息:
如果一個 slave 跟 master 斷開連接的時間已經(jīng)超過了?down-after-milliseconds
的 10 倍,外加 master 宕機的時長,那么 slave 就被認為不適合選舉為 master。
(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state
接下來會對 slave 進行排序:
每次一個哨兵要做主備切換,首先需要 quorum 數(shù)量的哨兵認為 odown,然后選舉出一個哨兵來做切換,這個哨兵還需要得到 majority 哨兵的授權,才能正式執(zhí)行切換。
如果 quorum < majority,比如 5 個哨兵,majority 就是 3,quorum 設置為 2,那么就 3 個哨兵授權就可以執(zhí)行切換。
但是如果 quorum >= majority,那么必須 quorum 數(shù)量的哨兵都授權,比如 5 個哨兵,quorum 是 5,那么必須 5 個哨兵都同意授權,才能執(zhí)行切換。
哨兵會對一套 redis master+slaves 進行監(jiān)控,有相應的監(jiān)控的配置。
執(zhí)行切換的那個哨兵,會從要切換到的新 master(salve->master)那里得到一個 configuration epoch,這就是一個 version 號,每次切換的 version 號都必須是唯一的。
如果第一個選舉出的哨兵切換失敗了,那么其他哨兵,會等待 failover-timeout 時間,然后接替繼續(xù)執(zhí)行切換,此時會重新獲取一個新的 configuration epoch,作為新的 version 號。
哨兵完成切換之后,會在自己本地更新生成最新的 master 配置,然后同步給其他的哨兵,就是通過之前說的?pub/sub
消息機制。
這里之前的 version 號就很重要了,因為各種消息都是通過一個 channel 去發(fā)布和監(jiān)聽的,所以一個哨兵完成一次新的切換之后,新的 master 配置是跟著新的 version 號的。其他的哨兵都是根據(jù)版本號的大小來更新自己的 master 配置的。
針對于上面所涉及到的知識點我總結出了有1到5年開發(fā)經(jīng)驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
分享題目:Redis哨兵集群實現(xiàn)高可用-創(chuàng)新互聯(lián)
文章源于:http://jinyejixie.com/article18/dpcegp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、做網(wǎng)站、動態(tài)網(wǎng)站、網(wǎng)站排名、營銷型網(wǎng)站建設、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)