1、哨兵的介紹
sentinal,中文名是哨兵
哨兵是redis叢集架構中非常重要的一個元件,主要功能如下
(1)叢集監控,負責監控redis master和slave程序是否正常工作
(2)消息通知,如果某個redis執行個體有故障,那麼哨兵負責發送消息作為報警通知給管理者
(3)故障轉移,如果master node挂掉了,會自動轉移到slave node上
(4)配置中心,如果故障轉移發生了,通知client用戶端新的master位址
哨兵本身也是分布式的,作為一個哨兵叢集去運作,互相協同工作
(1)故障轉移時,判斷一個master node是當機了,需要大部分的哨兵都同意才行,涉及到了分布式選舉的問題
(2)即使部分哨兵節點挂掉了,哨兵叢集還是能正常工作的,因為如果一個作為高可用機制重要組成部分的故障轉移系統本身是單點的,那就很坑爹了
目前采用的是sentinal 2版本,sentinal 2相對于sentinal 1來說,重寫了很多代碼,主要是讓故障轉移的機制和算法變得更加健壯和簡單
2、哨兵的核心知識
(1)哨兵至少需要3個執行個體,來保證自己的健壯性
(2)哨兵 + redis主從的部署架構,是不會保證資料零丢失的,隻能保證redis叢集的高可用性
(3)對于哨兵 + redis主從這種複雜的部署架構,盡量在測試環境和生産環境,都進行充足的測試和演練
3、為什麼redis哨兵叢集隻有2個節點無法正常工作?
哨兵叢集必須部署2個以上節點
如果哨兵叢集僅僅部署了個2個哨兵執行個體,quorum=1
±—+ ±—+
| M1 |---------| R1 |
| S1 | | S2 |
±—+ ±—+
Configuration: quorum = 1
master當機,s1和s2中隻要有1個哨兵認為master當機就可以還行切換,同時s1和s2中會選舉出一個哨兵來執行故障轉移
同時這個時候,需要majority,也就是大多數哨兵都是運作的,2個哨兵的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),2個哨兵都運作着,就可以允許執行故障轉移
但是如果整個M1和S1運作的機器當機了,那麼哨兵隻有1個了,此時就沒有majority來允許執行故障轉移,雖然另外一台機器還有一個R1,但是故障轉移不會執行
4、經典的3節點哨兵叢集
+----+
| M1 |
| S1 |
+----+
|
±—+ | ±—+
| R2 |----±—| R3 |
| S2 | | S3 |
±—+ ±—+
Configuration: quorum = 2,majority
如果M1所在機器當機了,那麼三個哨兵還剩下2個,S2和S3可以一緻認為master當機,然後選舉出一個來執行故障轉移
同時3個哨兵的majority是2,是以還剩下的2個哨兵運作着,就可以允許執行故障轉移