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个节点集群。

相关文章
相关标签/搜索