redis集羣選舉機制

概要

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

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

選舉過程

一、主觀下線

Sentinel集羣的每個Sentinel節點會定時對redis集羣的全部節點發心跳包檢測節點是否正常。若是一個節點在down-after-milliseconds時間內沒有回覆Sentinel節點的心跳包,則該redis節點被該Sentinel節點主觀下線。bash

二、客觀下線

當節點被一個Sentinel節點記爲主觀下線時,並不意味着該節點確定故障了,還須要Sentinel集羣的其餘Sentinel節點共同判斷爲主觀下線才行。服務器

該Sentinel節點會詢問其餘Sentinel節點,若是Sentinel集羣中超過quorum數量的Sentinel節點認爲該redis節點主觀下線,則該redis客觀下線。spa

若是客觀下線的redis節點是從節點或者是Sentinel節點,則操做到此爲止,沒有後續的操做了;若是客觀下線的redis節點爲主節點,則開始故障轉移,從從節點中選舉一個節點升級爲主節點。code

三、Sentinel集羣選舉Leader

若是須要從redis集羣選舉一個節點爲主節點,首先須要從Sentinel集羣中選舉一個Sentinel節點做爲Leader。cdn

每個Sentinel節點均可以成爲Leader,當一個Sentinel節點確認redis集羣的主節點主觀下線後,會請求其餘Sentinel節點要求將本身選舉爲Leader。被請求的Sentinel節點若是沒有贊成過其餘Sentinel節點的選舉請求,則贊成該請求(選舉票數+1),不然不一樣意。blog

若是一個Sentinel節點得到的選舉票數達到Leader最低票數(quorumSentinel節點數/2+1的最大值),則該Sentinel節點選舉爲Leader;不然從新進行選舉。同步

image

四、Sentinel Leader決定新主節點

當Sentinel集羣選舉出Sentinel Leader後,由Sentinel Leader從redis從節點中選擇一個redis節點做爲主節點:it

  1. 過濾故障的節點
  2. 選擇優先級slave-priority最大的從節點做爲主節點,如不存在則繼續
  3. 選擇複製偏移量(數據寫入量的字節,記錄寫了多少數據。主服務器會把偏移量同步給從服務器,當主從的偏移量一致,則數據是徹底同步)最大的從節點做爲主節點,如不存在則繼續
  4. 選擇runid(redis每次啓動的時候生成隨機的runid做爲redis的標識)最小的從節點做爲主節點
graph TD
    A[從節點列表] --> B[過濾故障節點]
    B --> C[slave-priority最大的從節點]
    C --> |存在| D[升級主節點]
    C --> |不存在| E[複製偏移量最大的從節點]
    E -->  |存在| F[升級主節點]
    E -->  |不存在| G[runid最小的從節點升級主節點]

複製代碼

爲何Sentinel集羣至少3節點

一個Sentinel節選舉成爲Leader的最低票數爲quorumSentinel節點數/2+1的最大值,若是Sentinel集羣只有2個Sentinel節點,則io

Sentinel節點數/2 + 1
= 2/2 + 1
= 2
複製代碼

即Leader最低票數至少爲2,當該Sentinel集羣中由一個Sentinel節點故障後,僅剩的一個Sentinel節點是永遠沒法成爲Leader。

也能夠由此公式能夠推導出,Sentinel集羣容許1個Sentinel節點故障則須要3個節點的集羣;容許2個節點故障則須要5個節點集羣。

相關文章
相關標籤/搜索