天天看點

Redis學習筆記(十六) Sentinel(哨兵)(下)

消失了一段時間,我又回來啦。不多說,繼續把哨兵看完。

檢測主觀下線狀态

預設情況下,Sentinel會以每秒一次的頻率向所有與他建立了指令連接配接的執行個體(主從伺服器以及其他Sentinel)發送PING指令,并通過執行個體傳回的PING指令回複來判斷執行個體是否線上。

執行個體對PING指令的回複可以分為兩種情況:

有效回複:執行個體傳回+PONG、-LOADING、-MASTERDOWN三種回複的其中一種。

無效回複:執行個體傳回除+PONG、-LOADING、-MASTERDOWN三種回複之外的回複或者規定時間内沒有收到任何回複。

指定Sentinel判斷執行個體進入主觀回複的時間長度是由Sentinel配置檔案中的down-after-milliseconds選項指定的。

如果沒有收到master伺服器的回複,Sentinel就會将master标記為主觀下線,并在master所對應的執行個體結構的flags屬性中打開SRI_S_DOWN辨別。

檢查客觀下線狀态

當Sentinel将一個主伺服器判斷為主觀下線之後,為了确認這個主伺服器是否真的已經下線,它會向同樣監視這一主伺服器的其他Sentinel進行詢問,看他們是否也認為主伺服器已經進入下線狀态,當Sentinel從其他Sentinel那裡接收到足夠數量的已下線判斷後,Sentinel就會将主伺服器判定為科幻下線,并對主伺服器執行故障轉移操作。

使用 SENTINEL is-master-down-by-addr < ip >< port >< current_epoch >< runid >

當目标Sentinel收到源Sentinel發來的SENTINEL指令後,解析指令中的參數并根據主伺服器的ip端口号檢查主伺服器是否下線,然後回複源Sentinel ,< down_state >< leader_runid >< leader_epoch >

根據其他Sentinel發回的SENTINEL指令回複,統計其他SENTINEL同一主伺服器已下線的數量,當這一數量達到配置指定的判斷客觀下線所需要的數量時,Sentinel會将主伺服器執行個體結構flags屬性的SRI_O_DOWN辨別打開,辨別主伺服器已經進入客觀下線狀态。

選舉頭領Sentinel

當一個主伺服器被判斷為客觀下線時,監聽這個下線主伺服器的各個Sentinel會進行協商,選舉出一個頭領Sentinel,并由頭領Sentinel對下線主伺服器執行故障轉移操作。

1、所有線上的Sentinel都會有被選為頭領Sentinel的資格,換句話說,監視同一個主伺服器的多個線上Sentinel中的任何一個都有成為領頭Sentinel。

2、每次進行頭領Sentinel選舉之後,不論選舉是否成功,所有Sentinel的配置紀元的值都會自增一次,配置紀元實際上就是一個計數器。

3、在一個配置紀元所有Sentinel都有一次将某個Sentinel設定為局部頭領Sentinel的機會,并且局部領頭一旦設定,在這個配置紀元中就不能再次更改。

4、每個發現主伺服器進入客觀下線的Sentinel都會要求其他Sentinel将自己設定為局部頭領Sentinel。

5、當源Sentinel向目标Seninel發送SENTINEL is-master-down-by-addr指令,并且指令中runid不是*而是源Sentinel的運作ID時,這表示源Sentinel要求目标Sentinel将自己設定為局部頭領Sentinel。

6、Sentinel設定局部頭領Sentinel的規則是先到先得。

7、目标Sentinel在接收到SENTINEL is-master-down-by-addr指令之後,将向源Sentinel傳回一條指令回複,回複中的leader_runid參數和leader_epoch分别記錄了目标Sentinel的局部頭領Sentinel的運作ID和配置紀元。

8、源Sentinel在接收到目标Sentinel傳回的指令之後,會檢查回複中leader_epoch參數的值和自己的配置紀元是否相同,如果相同,那麼源Sentinel繼續取出回複中的leader_runid參數,如果leader_runid參數的值和源Sentinel的運作ID一緻,那麼辨別目标Sentinel将源Sentinel設定為局部頭領Sentinel。

9、如果某個Sentinel被半數以上的Sentinel設定為局部領頭Sentinel,那麼這個Sentinel就稱為頭領Sentinel。

10、如果在給定時間限制内,沒有一個Sentinel被選舉為頭領Sentinel,那麼各個Sentinel将在一段時間之後再次進行選舉,直到選出頭領Sentinel。

故障轉移

在選舉出頭領Sentinel之後,頭領Sentinel将對這個下線的伺服器執行故障轉移操作。

1、在已下線主伺服器屬下的所有從伺服器裡面,挑選出一個從伺服器,并将其轉換為主伺服器。

挑選過程:

(1)删除清單中的所有處于下線或者斷線狀态的從伺服器。

(2)删除清單中所有最近5秒内沒有服務過頭領Sentinel的INFO指令的從伺服器。

(3)删除與已下線主伺服器連接配接斷開超過down-after-milliseconds * 10 毫秒的從伺服器。

(4)按照優先級進行排序,如果優先級最高的有多台,則按照偏移量最大的排序,如果還有多台,則按照運作ID排序取運作ID最小的從伺服器。

2、讓已下線主伺服器屬下的所有從伺服器改為複制新的主伺服器。

發送指令SLAVEOF < 新主伺服器的IP ><新主伺服器的PORT>

3、将已下線主伺服器設定為新的主伺服器的從伺服器,當這個舊的主伺服器重新上線時,他就會成為新的主伺服器的從伺服器。

每天學一點,總會有收獲。

說明:尊重作者知識産權,文中内容參考《Redis設計與實作》,僅在此做學習與大家分享。

繼續閱讀