redis集群选举分析

当salve发现自己的master变为FAIL状态时,尝试进行Failover(故障切换)

当存在多个slave的时候,就需要竞争成为master,过程如下

  • (1) slave发现自己的master变为FAIL
  • (2) 将自己记录的集群currentEpock加一,并广播FAILOVER_AUTH_REQUEST信息
  • (3) 其他小集群的master会相应slave的广播消息,首先判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  • (4) 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  • (5) Slave受到超过半数的master的ack就成为新的master
  • (6) Slave广播ping消息通知其他集群节点

Slave节点不是主节点已进入FAIL状态就马上尝试发起选举,而是有一定的延时,一定的延时确保等待FAIL状态在集群中传播。Slave如果立即尝试选举,其它的masters或许尚未意识到FAIL状态,可能会拒绝投票。

延时计算公式:

DELAY = 500ms+random(0~5000ms)+SLAVE_RANK*1000ms

SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已经复制的数据越新。这种方式下,只有最新数据的slave将会首先发起选举。

Redis集群如果发生脑裂,网络分区导致脑裂后多个主节点对外提供写服务,当网络分区回复,会将其中一个主节点变为从节点,变为从节点之后,回从现有主节点复制数据,那原来的数据就会丢失,redis不像zookeeper有过半机制,是通过配置文件的参数

min-replicas-to-write 3

min-replicas-max-lag 10

第一个参数表示连接到master的最少slave数量

第二个参数表示slave连接到master的最大延迟时间

按照上面的配置,要求至少3个slave节点,且数据复制和同步的延迟不能超过10秒,否则的话master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。

集群为什么至少三个节点而且推荐节点数为奇数

因为选举需要收到大于master节点总数的一半,若只有两个master节点,其中一个挂了,是选举不出来新的master的
奇数个master节点是为了满足上述要求并且节省资源,三个master节点与四个master节点,当大家都挂了一个master的时候,都能进行选举,当挂了两个的是否都选举不了

哨兵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节点作为主节点:

  • 过滤故障的节点
  • 选择优先级slave-priority最大的从节点作为主节点,如不存在则继续
  • 选择复制偏移量(数据写入量的字节,记录写了多少数据。主服务器会把偏移量同步给从服务器,当主从的偏移量一致,则数据是完全同步)最大的从节点作为主节点,如不存在则继续
  • 选择runid(redis每次启动的时候生成随机的runid作为redis的标识)最小的从节点作为主节点

为什么Sentinel集群至少3节点

一个Sentinel节选举成为Leader的最低票数为quorum和Sentinel节点数/2+1的最大值,如果Sentinel集群只有2个Sentinel节点,则

Sentinel节点数/2 + 1
= 2/2 + 1
= 2

即Leader最低票数至少为2,当该Sentinel集群中由一个Sentinel节点故障后,仅剩的一个Sentinel节点是永远无法成为Leader。

也可以由此公式可以推导出,Sentinel集群允许1个Sentinel节点故障则需要3个节点的集群;允许2个节点故障则需要5个节点集群。

Redis 哨兵选举机制相关推荐

  1. 算法高级(18)-Redis Cluster选举机制

    Redis集群是一个distribute.fault-tolerant的Redis实现,主要设计目标是达到线性可扩展性.可用性.数据一致性. 一.一些特性 线性拓展 官方推荐最大的节点数量为1000, ...

  2. 配置Redis哨兵模式

    Redis哨兵模式 配置哨兵: 1.新建名为sentinel.conf的配置文件 2.填写内容(其中mymaster为监控对象起的服务器名称,1为至少有一个哨兵同意迁移) 3.配置完成后进行启动哨兵 ...

  3. redis哨兵集群配置

    Redis集群配置(docker环境) 一.redis集群架构图 一主两从三哨兵集群,当master节点宕机时,通过哨兵(sentinel)重新推选出新的master节点,保证集群的可用性. 二.se ...

  4. redis哨兵主从不切换_《「面试突击」—Redis篇》-- Redis的主从复制?哨兵机制?...

    Redis如何保证高并发,高可用? 高并发:redis的单机吞吐量可以达到几万不是问题,如果想提高redis的读写能力,可以用redis的主从架构,redis天热支持一主多从的准备模式,单主负责写请求 ...

  5. redis哨兵模式原理_Redis的哨兵 (sentinal) 机制的工作原理

    什么是哨兵机制? Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务: 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Mas ...

  6. 什么是Redis哨兵机制?

    写在前面 之前有位朋友去面试被问到Redis哨兵机制,这道题其实很多小伙伴都应该有被问到过!本文将跟大家一起来探讨如何回答这个问题!同时用XMind画了一张导图记录Redis的学习笔记和一些面试解析( ...

  7. Redis - 哨兵机制与主从切换

    Redis 哨兵简介 哨兵(Sentinel)是一个分布式的系统,一个架构中可以运行多个哨兵进程,他们之间使用gossip protocols来进行通信,它为Redis提供了高可用的方案,主要是通过管 ...

  8. python redis 哨兵_Redis高可用哨兵机制及SpringBoot整合哨兵

    前言:在前面讲到了Redis分片机制可实现内存数据的扩容来提高执行速率---Redis分片机制,可是Redis分片依旧有一些问题,如果redis分片的节点如果有一个服务器宕机,则直接影响用户的使用.R ...

  9. Redis哨兵机制以及发布订阅

    Redis哨兵机制 1 哨兵Sentinel机制 2 哨兵架构原理 3 搭建哨兵架构 4 通过springboot操作哨兵 Redis发布订阅 1 哨兵Sentinel机制 Sentinel(哨兵)是 ...

最新文章

  1. system.out 汉字乱码
  2. PowerShell CLI 获取VM信息
  3. 【直播回放】80分钟剖析GAN如何从各个方向提升图像的质量
  4. matlab提示未定义wc,WooCommerce 教程:修复致命错误调用未定义的函数wc_get_order() - WooCommerce 微站...
  5. 电视光端机应用范围及故障维护问题介绍
  6. 跌倒识别 摔倒识别 -lightweight_openpose
  7. Python 装饰器理解
  8. eclipse启动时间很慢的调优解决
  9. 在LabVIEW中如何使用Flash动画
  10. outlook——分类及密送
  11. 服装企业SPA经营模式解析
  12. pyecharts制作地图Map
  13. OSI七层网络参考模型详解
  14. yiui易柚7 是Android什么版本,康佳YIUI易柚操作系统
  15. 爬取起点小说+mongoDB存储
  16. 渗透测试-安服面试点总结
  17. Skycc营销软件,让我成了“宝马男”
  18. Linux根目录”/“下各个系统文件夹的含义和用途
  19. Ubuntu 18.04 安装ns-3.30
  20. 3. Oracle数据库在Linux系统安装步骤

热门文章

  1. iptables详解【1】: 概念
  2. 山东大学计算机组成原理实验课程设计-模型机
  3. SQL Server 2008中的代码安全(三):通过PassPhrase加密
  4. BZOJ4184 shallot葱苗
  5. 智能水杯设计方案_一种新型早教智能水杯设计方案
  6. FreeBSD 下载 Exif扩展
  7. 创业阶段如何找客户_创业初期,如何寻找最初的合伙人?
  8. git branch diverged
  9. 如何理解 Spring Boot 中的 Starters?
  10. 基于web的游戏类虚拟物品交易平台