真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Redis哨兵集群實(shí)現(xiàn)高可用-創(chuàng)新互聯(lián)

哨兵的介紹

sentinel,中文名是哨兵。哨兵是 redis 集群機(jī)構(gòu)中非常重要的一個(gè)組件,主要有以下功能:

創(chuàng)新互聯(lián)建站主要業(yè)務(wù)有網(wǎng)站營(yíng)銷(xiāo)策劃、網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、HTML5建站、程序開(kāi)發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶(hù)當(dāng)客戶(hù),還把客戶(hù)視為我們的合作伙伴,在開(kāi)展業(yè)務(wù)的過(guò)程中,公司還積累了豐富的行業(yè)經(jīng)驗(yàn)、全網(wǎng)整合營(yíng)銷(xiāo)推廣資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶(hù)服務(wù)和保障體系。 
  • 集群監(jiān)控:負(fù)責(zé)監(jiān)控 redis master 和 slave 進(jìn)程是否正常工作。
  • 消息通知:如果某個(gè) redis 實(shí)例有故障,那么哨兵負(fù)責(zé)發(fā)送消息作為報(bào)警通知給管理員。
  • 故障轉(zhuǎn)移:如果 master node 掛掉了,會(huì)自動(dòng)轉(zhuǎn)移到 slave node 上。
  • 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知 client 客戶(hù)端新的 master 地址。

哨兵用于實(shí)現(xiàn) redis 集群的高可用,本身也是分布式的,作為一個(gè)哨兵集群去運(yùn)行,互相協(xié)同工作。

  • 故障轉(zhuǎn)移時(shí),判斷一個(gè) master node 是否宕機(jī)了,需要大部分的哨兵都同意才行,涉及到了分布式選舉的問(wèn)題。
  • 即使部分哨兵節(jié)點(diǎn)掛掉了,哨兵集群還是能正常工作的,因?yàn)槿绻粋€(gè)作為高可用機(jī)制重要組成部分的故障轉(zhuǎn)移系統(tǒng)本身是單點(diǎn)的,那就很坑爹了。

哨兵的核心知識(shí)

  • 哨兵至少需要 3 個(gè)實(shí)例,來(lái)保證自己的健壯性。
  • 哨兵 + redis 主從的部署架構(gòu),是不保證數(shù)據(jù)零丟失的,只能保證 redis 集群的高可用性。
  • 對(duì)于哨兵 + redis 主從這種復(fù)雜的部署架構(gòu),盡量在測(cè)試環(huán)境和生產(chǎn)環(huán)境,都進(jìn)行充足的測(cè)試和演練。

哨兵集群必須部署 2 個(gè)以上節(jié)點(diǎn),如果哨兵集群僅僅部署了 2 個(gè)哨兵實(shí)例,quorum = 1。

+----+         +----+
| M1 |---------| R1 |
| S1 |         | S2 |
+----+         +----+

配置?quorum=1,如果 master 宕機(jī), s1 和 s2 中只要有 1 個(gè)哨兵認(rèn)為 master 宕機(jī)了,就可以進(jìn)行切換,同時(shí) s1 和 s2 會(huì)選舉出一個(gè)哨兵來(lái)執(zhí)行故障轉(zhuǎn)移。但是同時(shí)這個(gè)時(shí)候,需要 majority,也就是大多數(shù)哨兵都是運(yùn)行的。

2 個(gè)哨兵,majority=2
3 個(gè)哨兵,majority=2
4 個(gè)哨兵,majority=2
5 個(gè)哨兵,majority=3
...

如果此時(shí)僅僅是 M1 進(jìn)程宕機(jī)了,哨兵 s1 正常運(yùn)行,那么故障轉(zhuǎn)移是 OK 的。但是如果是整個(gè) M1 和 S1 運(yùn)行的機(jī)器宕機(jī)了,那么哨兵只有 1 個(gè),此時(shí)就沒(méi)有 majority 來(lái)允許執(zhí)行故障轉(zhuǎn)移,雖然另外一臺(tái)機(jī)器上還有一個(gè) R1,但是故障轉(zhuǎn)移不會(huì)執(zhí)行。

經(jīng)典的 3 節(jié)點(diǎn)哨兵集群是這樣的:

   +----+
       | M1 |
       | S1 |
       +----+
          |
+----+    |    +----+
| R2 |----+----| R3 |
| S2 |         | S3 |
+----+         +----+

配置?quorum=2,如果 M1 所在機(jī)器宕機(jī)了,那么三個(gè)哨兵還剩下 2 個(gè),S2 和 S3 可以一致認(rèn)為 master 宕機(jī)了,然后選舉出一個(gè)來(lái)執(zhí)行故障轉(zhuǎn)移,同時(shí) 3 個(gè)哨兵的 majority 是 2,所以還剩下的 2 個(gè)哨兵運(yùn)行著,就可以允許執(zhí)行故障轉(zhuǎn)移。

Redis 哨兵主備切換的數(shù)據(jù)丟失問(wèn)題

兩種情況和導(dǎo)致數(shù)據(jù)丟失

主備切換的過(guò)程,可能會(huì)導(dǎo)致數(shù)據(jù)丟失:

  • 異步復(fù)制導(dǎo)致的數(shù)據(jù)丟失

因?yàn)?master->slave 的復(fù)制是異步的,所以可能有部分?jǐn)?shù)據(jù)還沒(méi)復(fù)制到 slave,master 就宕機(jī)了,此時(shí)這部分?jǐn)?shù)據(jù)就丟失了。

Redis 哨兵集群實(shí)現(xiàn)高可用

  • 腦裂導(dǎo)致的數(shù)據(jù)丟失

腦裂,也就是說(shuō),某個(gè) master 所在機(jī)器突然脫離了正常的網(wǎng)絡(luò),跟其他 slave 機(jī)器不能連接,但是實(shí)際上 master 還運(yùn)行著。此時(shí)哨兵可能就會(huì)認(rèn)為master 宕機(jī)了,然后開(kāi)啟選舉,將其他 slave 切換成了 master。這個(gè)時(shí)候,集群里就會(huì)有兩個(gè) master ,也就是所謂的腦裂。

此時(shí)雖然某個(gè) slave 被切換成了 master,但是可能 client 還沒(méi)來(lái)得及切換到新的 master,還繼續(xù)向舊 master 寫(xiě)數(shù)據(jù)。因此舊 master 再次恢復(fù)的時(shí)候,會(huì)被作為一個(gè) slave 掛到新的 master 上去,自己的數(shù)據(jù)會(huì)清空,重新從新的 master 復(fù)制數(shù)據(jù)。而新的 master 并沒(méi)有后來(lái) client 寫(xiě)入的數(shù)據(jù),因此,這部分?jǐn)?shù)據(jù)也就丟失了。

Redis 哨兵集群實(shí)現(xiàn)高可用

數(shù)據(jù)丟失問(wèn)題的解決方案

進(jìn)行如下配置:

min-slaves-to-write 1
min-slaves-max-lag 10

表示,要求至少有 1 個(gè) slave,數(shù)據(jù)復(fù)制和同步的延遲不能超過(guò) 10 秒。

如果說(shuō)一旦所有的 slave,數(shù)據(jù)復(fù)制和同步的延遲都超過(guò)了 10 秒鐘,那么這個(gè)時(shí)候,master 就不會(huì)再接收任何請(qǐng)求了。

  • 減少異步復(fù)制數(shù)據(jù)的丟失

有了?min-slaves-max-lag這個(gè)配置,就可以確保說(shuō),一旦 slave 復(fù)制數(shù)據(jù)和 ack 延時(shí)太長(zhǎng),就認(rèn)為可能 master 宕機(jī)后損失的數(shù)據(jù)太多了,那么就拒絕寫(xiě)請(qǐng)求,這樣可以把 master 宕機(jī)時(shí)由于部分?jǐn)?shù)據(jù)未同步到 slave 導(dǎo)致的數(shù)據(jù)丟失降低的可控范圍內(nèi)。

  • 減少腦裂的數(shù)據(jù)丟失

如果一個(gè) master 出現(xiàn)了腦裂,跟其他 slave 丟了連接,那么上面兩個(gè)配置可以確保說(shuō),如果不能繼續(xù)給指定數(shù)量的 slave 發(fā)送數(shù)據(jù),而且 slave 超過(guò) 10 秒沒(méi)有給自己 ack 消息,那么就直接拒絕客戶(hù)端的寫(xiě)請(qǐng)求。因此在腦裂場(chǎng)景下,最多就丟失 10 秒的數(shù)據(jù)。

sdown 和 odown 轉(zhuǎn)換機(jī)制

  • sdown 是主觀宕機(jī),就一個(gè)哨兵如果自己覺(jué)得一個(gè) master 宕機(jī)了,那么就是主觀宕機(jī)
  • odown 是客觀宕機(jī),如果 quorum 數(shù)量的哨兵都覺(jué)得一個(gè) master 宕機(jī)了,那么就是客觀宕機(jī)

sdown 達(dá)成的條件很簡(jiǎn)單,如果一個(gè)哨兵 ping 一個(gè) master,超過(guò)了?is-master-down-after-milliseconds指定的毫秒數(shù)之后,就主觀認(rèn)為 master 宕機(jī)了;如果一個(gè)哨兵在指定時(shí)間內(nèi),收到了 quorum 數(shù)量的其它哨兵也認(rèn)為那個(gè) master 是 sdown 的,那么就認(rèn)為是 odown 了。

哨兵集群的自動(dòng)發(fā)現(xiàn)機(jī)制

哨兵互相之間的發(fā)現(xiàn),是通過(guò) redis 的?pub/sub系統(tǒng)實(shí)現(xiàn)的,每個(gè)哨兵都會(huì)往?__sentinel__:hello這個(gè) channel 里發(fā)送一個(gè)消息,這時(shí)候所有其他哨兵都可以消費(fèi)到這個(gè)消息,并感知到其他的哨兵的存在。

每隔兩秒鐘,每個(gè)哨兵都會(huì)往自己監(jiān)控的某個(gè) master+slaves 對(duì)應(yīng)的?__sentinel__:hellochannel 里發(fā)送一個(gè)消息,內(nèi)容是自己的 host、ip 和 runid 還有對(duì)這個(gè) master 的監(jiān)控配置。

每個(gè)哨兵也會(huì)去監(jiān)聽(tīng)自己監(jiān)控的每個(gè) master+slaves 對(duì)應(yīng)的?__sentinel__:hellochannel,然后去感知到同樣在監(jiān)聽(tīng)這個(gè) master+slaves 的其他哨兵的存在。

每個(gè)哨兵還會(huì)跟其他哨兵交換對(duì)?master的監(jiān)控配置,互相進(jìn)行監(jiān)控配置的同步。

slave 配置的自動(dòng)糾正

哨兵會(huì)負(fù)責(zé)自動(dòng)糾正 slave 的一些配置,比如 slave 如果要成為潛在的 master 候選人,哨兵會(huì)確保 slave 復(fù)制現(xiàn)有 master 的數(shù)據(jù);如果 slave 連接到了一個(gè)錯(cuò)誤的 master 上,比如故障轉(zhuǎn)移之后,那么哨兵會(huì)確保它們連接到正確的 master 上。

slave->master 選舉算法

如果一個(gè) master 被認(rèn)為 odown 了,而且 majority 數(shù)量的哨兵都允許主備切換,那么某個(gè)哨兵就會(huì)執(zhí)行主備切換操作,此時(shí)首先要選舉一個(gè) slave 來(lái),會(huì)考慮 slave 的一些信息:

  • 跟 master 斷開(kāi)連接的時(shí)長(zhǎng)
  • slave 優(yōu)先級(jí)
  • 復(fù)制 offset
  • run id

如果一個(gè) slave 跟 master 斷開(kāi)連接的時(shí)間已經(jīng)超過(guò)了?down-after-milliseconds的 10 倍,外加 master 宕機(jī)的時(shí)長(zhǎng),那么 slave 就被認(rèn)為不適合選舉為 master。

(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

接下來(lái)會(huì)對(duì) slave 進(jìn)行排序:

  • 按照 slave 優(yōu)先級(jí)進(jìn)行排序,slave priority 越低,優(yōu)先級(jí)就越高。
  • 如果 slave priority 相同,那么看 replica offset,哪個(gè) slave 復(fù)制了越多的數(shù)據(jù),offset 越靠后,優(yōu)先級(jí)就越高。
  • 如果上面兩個(gè)條件都相同,那么選擇一個(gè) run id 比較小的那個(gè) slave。

quorum 和 majority

每次一個(gè)哨兵要做主備切換,首先需要 quorum 數(shù)量的哨兵認(rèn)為 odown,然后選舉出一個(gè)哨兵來(lái)做切換,這個(gè)哨兵還需要得到 majority 哨兵的授權(quán),才能正式執(zhí)行切換。

如果 quorum < majority,比如 5 個(gè)哨兵,majority 就是 3,quorum 設(shè)置為 2,那么就 3 個(gè)哨兵授權(quán)就可以執(zhí)行切換。

但是如果 quorum >= majority,那么必須 quorum 數(shù)量的哨兵都授權(quán),比如 5 個(gè)哨兵,quorum 是 5,那么必須 5 個(gè)哨兵都同意授權(quán),才能執(zhí)行切換。

configuration epoch

哨兵會(huì)對(duì)一套 redis master+slaves 進(jìn)行監(jiān)控,有相應(yīng)的監(jiān)控的配置。

執(zhí)行切換的那個(gè)哨兵,會(huì)從要切換到的新 master(salve->master)那里得到一個(gè) configuration epoch,這就是一個(gè) version 號(hào),每次切換的 version 號(hào)都必須是唯一的。

如果第一個(gè)選舉出的哨兵切換失敗了,那么其他哨兵,會(huì)等待 failover-timeout 時(shí)間,然后接替繼續(xù)執(zhí)行切換,此時(shí)會(huì)重新獲取一個(gè)新的 configuration epoch,作為新的 version 號(hào)。

configuration 傳播

哨兵完成切換之后,會(huì)在自己本地更新生成最新的 master 配置,然后同步給其他的哨兵,就是通過(guò)之前說(shuō)的?pub/sub消息機(jī)制。

這里之前的 version 號(hào)就很重要了,因?yàn)楦鞣N消息都是通過(guò)一個(gè) channel 去發(fā)布和監(jiān)聽(tīng)的,所以一個(gè)哨兵完成一次新的切換之后,新的 master 配置是跟著新的 version 號(hào)的。其他的哨兵都是根據(jù)版本號(hào)的大小來(lái)更新自己的 master 配置的。

文末彩蛋

針對(duì)于上面所涉及到的知識(shí)點(diǎn)我總結(jié)出了有1到5年開(kāi)發(fā)經(jīng)驗(yàn)的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費(fèi)分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個(gè)好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時(shí)間來(lái)學(xué)習(xí),也可以關(guān)注我一下以后會(huì)有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費(fèi)領(lǐng)取

Redis 哨兵集群實(shí)現(xiàn)高可用
Redis 哨兵集群實(shí)現(xiàn)高可用
Redis 哨兵集群實(shí)現(xiàn)高可用

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。


網(wǎng)站標(biāo)題:Redis哨兵集群實(shí)現(xiàn)高可用-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://weahome.cn/article/dpcegp.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部