一、哨兵的介紹node
sentinal,中文名是哨兵redis
哨兵是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來講,重寫了不少代碼,主要是讓故障轉移的機制和算法變得更加健壯和簡單進程
二、哨兵的核心知識部署
(1)哨兵至少須要3個實例,來保證本身的健壯性
(2)哨兵 + redis主從的部署架構,是不會保證數據零丟失的,只能保證redis集羣的高可用性
(3)對於哨兵 + redis主從這種複雜的部署架構,儘可能在測試環境和生產環境,都進行充足的測試和演練it
三、爲何redis哨兵集羣只有2個節點沒法正常工做?io
哨兵集羣必須部署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,可是故障轉移不會執行
四、經典的3節點哨兵集羣
+----+
| M1 |
| S1 |
+----+
|
+----+ | +----+
| R2 |----+----| R3 |
| S2 | | S3 |
+----+ +----+
Configuration: quorum = 2,majority
若是M1所在機器宕機了,那麼三個哨兵還剩下2個,S2和S3能夠一致認爲master宕機,而後選舉出一個來執行故障轉移
同時3個哨兵的majority是2,因此還剩下的2個哨兵運行着,就能夠容許執行故障轉移