Github
1 Redis Sentinal機制
sentinal,中文名哨兵
哨兵是redis叢集架構中非常重要的一個元件,主要功能如下
-
叢集監控
監控Redis master和slave程序的正常工作
-
消息通知
如果某個Redis執行個體有故障,那麼哨兵負責發送報警消息給管理者
-
故障轉移
若master node當機,會自動轉移到slave node上
-
配置中心
若發生故障轉移,通知client用戶端新的master位址
哨兵本身也是分布式的,作為一個哨兵叢集去運作,協同工作
- 故障轉移時,判斷一個master node是否當機,需要大部分的哨兵都同意,涉及到了分布式選舉問題
- 即使部分哨兵節點當機,哨兵叢集還是能正常工作的
目前采用的是sentinal 2版本,sentinal 2相對于sentinal 1來說,重寫了很多代碼,主要是讓故障轉移的機制和算法變得更加健壯和簡單
2 哨兵的核心知識
- 哨兵需要至少3個執行個體,保證自己的健壯性
- 哨兵 + Redis主從的部署架構,是不會保證資料零丢失的,隻能保證redis叢集的高可用性
- 對于哨兵 + Redis主從這種複雜的部署架構,盡量在測試環境和生産環境,都進行充足的測試和演練
3 為什麼僅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
4個哨兵的majority=2
5個哨兵的majority=3
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個哨兵運作着,就可執行故障轉移
參考
《Java工程師面試突擊第1季-中華石杉老師》