什么是高可用
全年時間里,99%的時間里都能對外提供服務,就是高可用
主備切換
在master故障時,自動檢測,將某個slave切換為master的過程,叫做主備切換。這個過程,實現了Redis主從架構下的高可用性。
哨兵是redis集群架構中非常重要的一個組件,主要功能如下
集群監控,負責監控redis master和slave進程是否正常工作
消息通知,如果某個redis實例有故障,那么哨兵負責發送消息作為報警通知給管理員
故障轉移,如果master node掛掉了,會自動轉移到slave node上
配置中心,如果故障轉移發生了,通知client客戶端新的master地址
哨兵本身也是分布式的,作為一個哨兵集群去運行,互相協同工作
故障轉移時,判斷一個master node是宕機了,需要大部分的哨兵都同意才行,涉及到了分布式選舉的問題
即使部分哨兵節點掛掉了,哨兵集群還是能正常工作的,因為如果一個作為高可用機制重要組成部分的故障轉移系統本身是單點的,那就很坑爹了
哨兵的核心知識
哨兵至少需要3個實例,來保證自己的健壯性
哨兵 + redis主從的部署架構,是不會保證數據零丟失的,只能保證redis集群的高可用性
對於哨兵 + redis主從這種復雜的部署架構,盡量在測試環境和生產環境,都進行充足的測試和演練
兩種數據丟失的情況
主備切換的過程,可能會導致數據丟失
(1)異步復制導致的數據丟失
因為master -> slave的復制是異步的,所以可能有部分數據還沒復制到slave,master就宕機了,此時這些部分數據就丟失了
(2)腦裂導致的數據丟失
腦裂(網絡分區),也就是說,某個master所在機器突然脫離了正常的網絡,跟其他slave機器不能連接,但是實際上master還運行着
此時哨兵可能就會認為master宕機了,然后開啟選舉,將其他slave切換成了master
這個時候,集群里就會有兩個master,也就是所謂的腦裂
此時雖然某個slave被切換成了master,但是可能client還沒來得及切換到新的master,還繼續寫向舊master的數據可能也丟失了
因此舊master再次恢復的時候,會被作為一個slave掛到新的master上去,自己的數據會清空,重新從新的master復制數據
解決異步復制和腦裂導致的數據丟失
min-slaves-to-write 1
min-slaves-max-lag 10
要求至少有1個slave,數據復制和同步的延遲不能超過10秒
如果說一旦所有的slave,數據復制和同步的延遲都超過了10秒鍾,那么這個時候,master就不會再接收任何請求了
上面兩個配置可以減少異步復制和腦裂導致的數據丟失
(1)減少異步復制的數據丟失
有了min-slaves-max-lag這個配置,就可以確保說,一旦slave復制數據和ack延時太長,就認為可能master宕機后損失的數據太多了,那么就拒絕寫請求,這樣可以把master宕機時由於部分數據未同步到slave導致的數據丟失降低的可控范圍內
(2)減少腦裂的數據丟失
如果一個master出現了腦裂,跟其他slave丟了連接,那么上面兩個配置可以確保說,如果不能繼續給指定數量的slave發送數據,而且slave超過10秒沒有給自己ack消息,那么就直接拒絕客戶端的寫請求
這樣腦裂后的舊master就不會接受client的新數據,也就避免了數據丟失
上面的配置就確保了,如果跟任何一個slave丟了連接,在10秒后發現沒有slave給自己ack,那么就拒絕新的寫請求
因此在腦裂場景下,最多就丟失10秒的數據
轉自:中華石杉Java工程師面試突擊