1、哨兵的介紹
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)本身是單點的,那就很坑爹了
目前采用的是sentinal 2版本,sentinal 2相對于sentinal 1來說,重寫了很多代碼,主要是讓故障轉(zhuǎn)移的機制和算法變得更加健壯和簡單
2、哨兵的核心知識
(1)哨兵至少需要3個實例,來保證自己的健壯性
(2)哨兵 + redis主從的部署架構(gòu),是不會保證數(shù)據(jù)零丟失的,只能保證redis集群的高可用性
(3)對于哨兵 + redis主從這種復(fù)雜的部署架構(gòu),盡量在測試環(huán)境和生產(chǎn)環(huán)境,都進行充足的測試和演練
3、為什么redis哨兵集群只有2個節(jié)點無法正常工作?
哨兵集群必須部署2個以上節(jié)點
如果哨兵集群僅僅部署了個2個哨兵實例,quorum=1
+----+? ? ? ? +----+
| M1 |---------| R1 |
| S1 |? ? ? ? | S2 |
+----+? ? ? ? +----+
Configuration: quorum = 1
master宕機,s1和s2中只要有1個哨兵認(rèn)為master宕機就可以還行切換,同時s1和s2中會選舉出一個哨兵來執(zhí)行故障轉(zhuǎn)移
同時這個時候,需要majority,也就是大多數(shù)哨兵都是運行的,2個哨兵的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),2個哨兵都運行著,就可以允許執(zhí)行故障轉(zhuǎn)移
但是如果整個M1和S1運行的機器宕機了,那么哨兵只有1個了,此時就沒有majority來允許執(zhí)行故障轉(zhuǎn)移,雖然另外一臺機器還有一個R1,但是故障轉(zhuǎn)移不會執(zhí)行
4、經(jīng)典的3節(jié)點哨兵集群
? ? ? +----+
? ? ? | M1 |
? ? ? | S1 |
? ? ? +----+
? ? ? ? ? |
+----+? ? |? ? +----+
| R2 |----+----| R3 |
| S2 |? ? ? ? | S3 |
+----+? ? ? ? +----+
Configuration: quorum = 2,majority
如果M1所在機器宕機了,那么三個哨兵還剩下2個,S2和S3可以一致認(rèn)為master宕機,然后選舉出一個來執(zhí)行故障轉(zhuǎn)移
同時3個哨兵的majority是2,所以還剩下的2個哨兵運行著,就可以允許執(zhí)行故障轉(zhuǎn)移