Redis哨兵的详解
1 哨兵的作用
哨兵是redis集群架構(gòu)中非常重要的一個(gè)組件,主要功能如下:
2 哨兵的核心知識(shí)
3 sdown和odown
4 quorum和majority
5 為什么哨兵至少3個(gè)節(jié)點(diǎn)
哨兵集群必須部署2個(gè)以上節(jié)點(diǎn)。如果哨兵集群僅僅部署了個(gè)2個(gè)哨兵實(shí)例,那么它的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),如果其中一個(gè)哨兵宕機(jī)了,就無(wú)法滿足majority>=2這個(gè)條件,那么在master發(fā)生故障的時(shí)候也就無(wú)法進(jìn)行主從切換。
6 腦裂以及redis數(shù)據(jù)丟失
主備切換的過(guò)程,可能會(huì)導(dǎo)致數(shù)據(jù)丟失
(1)異步復(fù)制導(dǎo)致的數(shù)據(jù)丟失
因?yàn)閙aster -> slave的復(fù)制是異步的,所以可能有部分?jǐn)?shù)據(jù)還沒(méi)復(fù)制到slave,master就宕機(jī)了,此時(shí)這些部分?jǐn)?shù)據(jù)就丟失了
(2)腦裂導(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的數(shù)據(jù)可能也丟失了,因此舊master再次恢復(fù)的時(shí)候,會(huì)被作為一個(gè)slave掛到新的master上去,自己的數(shù)據(jù)會(huì)清空,重新從新的master復(fù)制數(shù)據(jù)
7 如何盡可能減少數(shù)據(jù)丟失
下面兩個(gè)配置可以減少異步復(fù)制和腦裂導(dǎo)致的數(shù)據(jù)丟失:
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)求了
(1)減少異步復(fù)制的數(shù)據(jù)丟失
有了min-slaves-max-lag這個(gè)配置,就可以確保說(shuō),一旦slave復(fù)制數(shù)據(jù)和ack延時(shí)太長(zhǎng),就認(rèn)為可能master宕機(jī)后損失的數(shù)據(jù)太多了,那么就拒絕寫請(qǐng)求,這樣可以把master宕機(jī)時(shí)由于部分?jǐn)?shù)據(jù)未同步到slave導(dǎo)致的數(shù)據(jù)丟失降低的可控范圍內(nèi)
(2)減少腦裂的數(shù)據(jù)丟失
如果一個(gè)master出現(xiàn)了腦裂,跟其他slave丟了連接,那么上面兩個(gè)配置可以確保說(shuō),如果不能繼續(xù)給指定數(shù)量的slave發(fā)送數(shù)據(jù),而且slave超過(guò)10秒沒(méi)有給自己ack消息,那么就直接拒絕客戶端的寫請(qǐng)求,這樣腦裂后的舊master就不會(huì)接受client的新數(shù)據(jù),也就避免了數(shù)據(jù)丟失
上面的配置就確保了,如果跟任何一個(gè)slave丟了連接,在10秒后發(fā)現(xiàn)沒(méi)有slave給自己ack,那么就拒絕新的寫請(qǐng)求
因此在腦裂場(chǎng)景下,最多就丟失10秒的數(shù)據(jù)
8 哨兵集群的自動(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:hello channel里發(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:hello channel,然后去感知到同樣在監(jiān)聽(tīng)這個(gè)master+slaves的其他哨兵的存在
每個(gè)哨兵還會(huì)跟其他哨兵交換對(duì)master的監(jiān)控配置,互相進(jìn)行監(jiān)控配置的同步
9 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上
10 master選舉算法
如果一個(gè)master被認(rèn)為odown了,而且majority哨兵都允許了主備切換,那么某個(gè)哨兵就會(huì)執(zhí)行主備切換操作,此時(shí)首先要選舉一個(gè)slave來(lái)。
選舉的時(shí)候會(huì)考慮slave的一些信息:
(1)跟master斷開(kāi)連接的時(shí)長(zhǎng)
(2)slave優(yōu)先級(jí)
(3)復(fù)制offset
(4)run id
如果一個(gè)slave跟master斷開(kāi)連接已經(jīng)超過(guò)了down-after-milliseconds的10倍,外加master宕機(jī)的時(shí)長(zhǎng),那么slave就被認(rèn)為不適合選舉為master,計(jì)算公式如下:
(down-after-milliseconds * 10) +milliseconds_since_master_is_in_SDOWN_state
接下來(lái)會(huì)對(duì)slave進(jìn)行排序
(1)按照slave優(yōu)先級(jí)進(jìn)行排序,slave priority越低,優(yōu)先級(jí)就越高
(2)如果slave priority相同,那么看replica offset,哪個(gè)slave復(fù)制了越多的數(shù)據(jù),offset越靠后,優(yōu)先級(jí)就越高
(3)如果上面兩個(gè)條件都相同,那么選擇一個(gè)run id比較小的那個(gè)slave
11 configuration epoch
哨兵會(huì)對(duì)一套redis master+slave進(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)
12 configuraiton傳播
哨兵完成切換之后,會(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配置的
總結(jié)
以上是生活随笔為你收集整理的Redis哨兵的详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于服务器虚化的优势,vmware虚化优
- 下一篇: java求平均值Scanner_Scan