redis sentinel集群選舉機制


概要

當redis集群的主節點故障時,Sentinel集群將從剩余的從節點中選舉一個新的主節點,有以下步驟:

  1. 故障節點主觀下線
  2. 故障節點客觀下線
  3. Sentinel集群選舉Leader
  4. Sentinel Leader決定新主節點

選舉過程

1、主觀下線

Sentinel集群的每一個Sentinel節點會定時對redis集群的所有節點發心跳包檢測節點是否正常。如果一個節點在down-after-milliseconds時間內沒有回復Sentinel節點的心跳包,則該redis節點被該Sentinel節點主觀下線。

2、客觀下線

當節點被一個Sentinel節點記為主觀下線時,並不意味着該節點肯定故障了,還需要Sentinel集群的其他Sentinel節點共同判斷為主觀下線才行。

該Sentinel節點會詢問其他Sentinel節點,如果Sentinel集群中超過quorum數量的Sentinel節點認為該redis節點主觀下線,則該redis客觀下線。

如果客觀下線的redis節點是從節點或者是Sentinel節點,則操作到此為止,沒有后續的操作了;如果客觀下線的redis節點為主節點,則開始故障轉移,從從節點中選舉一個節點升級為主節點。

3、Sentinel集群選舉Leader

如果需要從redis集群選舉一個節點為主節點,首先需要從Sentinel集群中選舉一個Sentinel節點作為Leader。

每一個Sentinel節點都可以成為Leader,當一個Sentinel節點確認redis集群的主節點主觀下線后,會請求其他Sentinel節點要求將自己選舉為Leader。被請求的Sentinel節點如果沒有同意過其他Sentinel節點的選舉請求,則同意該請求(選舉票數+1),否則不同意。

如果一個Sentinel節點獲得的選舉票數達到Leader最低票數(quorumSentinel節點數/2+1的最大值),則該Sentinel節點選舉為Leader;否則重新進行選舉。

在這里插入圖片描述

4、Sentinel Leader決定新主節點

當Sentinel集群選舉出Sentinel Leader后,由Sentinel Leader從redis從節點中選擇一個redis節點作為主節點:

  1. 過濾故障的節點
  2. 選擇優先級slave-priority最大的從節點作為主節點,如不存在則繼續
  3. 選擇復制偏移量(數據寫入量的字節,記錄寫了多少數據。主服務器會把偏移量同步給從服務器,當主從的偏移量一致,則數據是完全同步)最大的從節點作為主節點,如不存在則繼續
  4. 選擇runid(redis每次啟動的時候生成隨機的runid作為redis的標識)最小的從節點作為主節點
 
 
存在
不存在
存在
不存在
從節點列表
過濾故障節點
slave-priority最大的從節點
升級主節點
復制偏移量最大的從節點
升級主節點
runid最小的從節點升級主節點

為什么Sentinel集群至少3節點

一個Sentinel節選舉成為Leader的最低票數為quorumSentinel節點數/2+1的最大值,如果Sentinel集群只有2個Sentinel節點,則

Sentinel節點數/2 + 1
= 2/2 + 1
= 2

即Leader最低票數至少為2,當該Sentinel集群中由一個Sentinel節點故障后,僅剩的一個Sentinel節點是永遠無法成為Leader。

也可以由此公式可以推導出,Sentinel集群允許1個Sentinel節點故障則需要3個節點的集群;允許2個節點故障則需要5個節點集群。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM