sentinal(哨兵)
哨兵是redis集群架構(gòu)中非常重要的一個組件吞加,主要功能如下:
(1)集群監(jiān)控秕岛,負責(zé)監(jiān)控redis master 和slave進程是否正常工作。
(2)消息通知童番,如果某個redis實例有故障伪货,那么哨兵負責(zé)發(fā)送消息作為報警通知給管理員。
(3)故障轉(zhuǎn)移踩官,如果master node掛掉了却桶,會自動轉(zhuǎn)移到slave node上。
(4)配置中心蔗牡,如果故障轉(zhuǎn)移發(fā)生了颖系,通知client客戶端新的master地址。
哨兵本身也是分布式的辩越,作為一個哨兵集群去運行的嘁扼,相互協(xié)同工作
(1)故障轉(zhuǎn)移時,判斷一個master node宕機了黔攒,需要大部分哨兵都同意才行趁啸,涉及到分布式選舉問題。
(2)及時部分哨兵節(jié)點掛掉了督惰,哨兵集群還是能正常工作的不傅,因為如果一個作為高可用機制重要組成部分的故障轉(zhuǎn)移系統(tǒng)本身就是單點,那么就不靠譜赏胚。
哨兵的核心知識
- 哨兵至少需要3個實例访娶,來保證自己的健壯性。
- 哨兵+redis主從的部署架構(gòu)觉阅,是不會保證數(shù)據(jù)零丟失的震肮,只能保證redis集群的高可用性
- 對于哨兵+redis主從這種復(fù)雜的部署架構(gòu),盡量在測試環(huán)境和生產(chǎn)環(huán)境留拾,都進行充分的測試和演練。
redis哨兵主備切換的數(shù)據(jù)丟失問題
兩種丟失情況:
- 異步復(fù)制導(dǎo)致的數(shù)據(jù)丟失
因為master->slave的復(fù)制是異步的鲫尊,所以可能有部分?jǐn)?shù)據(jù)還沒復(fù)制到slave痴柔,master就宕機了,這些數(shù)據(jù)就丟失了疫向。 - 腦裂導(dǎo)致的數(shù)據(jù)丟失
腦裂咳蔚,也就是說,某個master所在機器突然脫離了正常的網(wǎng)絡(luò)搔驼,跟其他slave機器不能連接谈火,但是實際上master還運行著
這個時候,集群中就會出現(xiàn)兩個master舌涨。
此時雖然某個slave被切換成了master糯耍,但是可能client還沒來得及切換到新的master,還繼續(xù)寫向舊master數(shù)據(jù)可能就會丟失。
因此master在恢復(fù)的時候温技,會被作為一個slave掛到新的master上革为,自己的數(shù)據(jù)會被清空,從新的master復(fù)制數(shù)據(jù)
解決異步復(fù)制和腦裂導(dǎo)致的數(shù)據(jù)丟失
min-slaves-to-write 1
min-slaves-max-lag 10
要求至少有1個slave舵鳞,數(shù)據(jù)復(fù)制和同步的延遲不能超過10秒
如果說一旦所有slave震檩,數(shù)據(jù)復(fù)制和同步的延遲都超過了10秒鐘,那么這個時候蜓堕,master就不會再接收任何請求了抛虏。
(1)減少異步復(fù)制的數(shù)據(jù)丟失
有了min-slaves-max-lag這個配置,就可以確保說套才,一旦slave復(fù)制數(shù)據(jù)和ack延時太長迂猴,就認為可能master宕機后損失的數(shù)據(jù)太多了,那么就拒絕寫請求霜旧,這樣可以把master宕機時由于部分?jǐn)?shù)據(jù)未同步到slave導(dǎo)致的數(shù)據(jù)丟失降低的可控范圍內(nèi)
(2)減少腦裂的數(shù)據(jù)丟失
如果一個master出現(xiàn)了腦裂错忱,跟其他slave丟了連接,那么上面兩個配置可以確保說挂据,如果不能繼續(xù)給指定數(shù)量的slave發(fā)送數(shù)據(jù)以清,而且slave超過10秒沒有給自己ack消息,那么就直接拒絕客戶端的寫請求
這樣腦裂后的舊master就不會接受client的新數(shù)據(jù)崎逃,也就避免了數(shù)據(jù)丟失
上面的配置就確保了掷倔,如果跟任何一個slave丟了連接,在10秒后發(fā)現(xiàn)沒有slave給自己ack个绍,那么就拒絕新的寫請求
因此在腦裂場景下勒葱,最多就丟失10秒的數(shù)據(jù)