系列文章目录

第一节 Redis的安装
第二节 Redis的五种数据结构(String、Hash、List、Set、ZSet)
第三节 Redis的持久化方式
第四节 Redis主从架构
第五节 Redis哨兵高可用架构
第六节 Redis集群高可用架构


Redis集群选举原理与脑裂问题

  • 系列文章目录
  • 一、Redis集群选举原理
    • currentEpoch的含义
    • currentEpoch的作用
  • 二、集群脑裂问题
  • 三、其它问题
    • 1、集群是否完整才能对外提供服务
    • 2、Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?
    • 3、Redis集群对批量操作命令的支持

一、Redis集群选举原理

当slave节点发现自己的master节点变为FAIL状态时,便尝试进行Failover(故障转移),以期成为新的master。由于挂掉的master节点可能会有多个slave节点,从而存在多个slave节点竞争成为master节点的过程。
过程如下:

  1. slave节点发现自己的master节点变为FAIL状态
  2. 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST(会携带有currentEpoch)信息
  3. 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch(纪元)只发送一次ACK
  4. 尝试Failover的slave收集master返回的FAILOVER_AUTH_ACK
  5. slave收到超过半数master的ACK后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)
  6. slave广播Pong消息通知其他集群节点

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

  • 延迟计算公式:DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
  • SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。

currentEpoch的含义

  1. 这是一个集群状态相关的概念,可以用来记录集群状态变更的递增版本号。
  2. 每个集群节点,都会通过 server.cluster->currentEpoch 记录当前的 currentEpoch。
  3. 集群节点创建时,不管是master还是slave,都将currentEpoch置为 0。
  4. 当前节点接收到来自其他节点的包时,如果发送者的currentEpoch(消息头部会包含发送者的currentEpoch)大于当前节点的currentEpoch,那么当前节点会更新 currentEpoch 为发送者的
    currentEpoch。
  5. 集群中所有节点的 currentEpoch 最终会达成一致,相当于对集群状态的认知达成了一致。

currentEpoch的作用

当集群的状态发生改变,目前currentEpoch只用于slave的故障转移流程,例如当 slave1节点发现其所属的master节点无法访问时,就会试图发起故障转移流程。

  1. 增加 currentEpoch的值,这个增加后的 currentEpoch 是所有集群节点中最大的。
  2. 然后slave1向所有节点发起拉票请求,请求其他master投票给自己,使自己能成为新的master。
  3. 其他节点收到包后,发现发送者的 currentEpoch 比自己的 currentEpoch 大,就会更新自己的
    currentEpoch,并在尚未投票的情况下,投票给slave1,表示同意使其成为新的master。

二、集群脑裂问题

redis集群没有过半机制会有脑裂问题,网络抖动导致脑裂后多个主节点对外提供写服务,一旦网络环境问题恢复,会将其中一个主节点变为从节点,然后从节点会从主节点进行全量数据复制,这时主节点变成从节点前的所有数据丢失。
规避方法可以在redis配置里加上参数(这种方法不可能百分百避免数据丢失,参考集群leader选举机制):

min-replicas-to-write 1  //写数据成功最少同步的slave数量,这个数量可以模仿大于半数机制配置,比如集群总共三个节点可以配置1,加上leader就是2,超过了半数

注意:这个配置在一定程度上会影响集群的可用性,比如slave要是少于1个,也就是当只有master节点时,这个集群也不能提供服务了,需要具体场景权衡选择。

三、其它问题

1、集群是否完整才能对外提供服务

当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的master主库下线且没有相应的slave从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。

2、Redis集群为什么至少需要三个master节点,并且推荐节点数为奇数?

因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,无法达不到选举新master的条件的。
奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。

3、Redis集群对批量操作命令的支持

对于类似mset,mget这样的多个key的原生批量操作命令,redis集群只支持所有key落在同一slot的情况,如果有多个key一定要用mset命令在redis集群上操作,则可以在key的前面加上{XX},这样参数数据分片hash计算的只会是大括号里的值,这样能确保不同的key能落到同一slot里去,示例如下:

mset {student1}:1001:name zhangsang {student1}:1001:age 20

假设name和age计算的hash slot值不一样,但是这条命令在集群下执行,redis只会用大括号里的 student1做hash slot计算,所以算出来的slot值肯定相同,最后都能落在同一slot。


Redis集群选举原理与脑裂问题相关推荐

  1. Redis集群的原理和搭建

    Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...

  2. redis 集群模式原理

    一.Redis分布式扩展之Redis Cluster方案 主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题.而且每个节点都保存了所有数据,一个是内存的占用率较高 ...

  3. Redis 集群搭建原理

    一.设计的主要特性和基本原理 1.集群目标 Redis 集群是 Redis 的分布式实现,在设计中按重要性顺序具有以下目标: 高性能和线性可扩展性,多达 1000 个节点.没有代理,使用异步复制,并且 ...

  4. Redis集群分片原理

    转载:http://blog.csdn.net/shmnh/article/details/72868328 Redis集群的目的是实现数据的横向伸缩,把一块数据分片保存到多个机器,可以横向扩展数据库 ...

  5. 三张图秒懂Redis集群设计原理

    Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计. 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读写分离,直接上图: 图上能 ...

  6. elasticsearch7.x集群搭建及倒排索引脑裂问题精讲

    简介 大家好,我是jackxu,es大家都听过,现在也是越来越火了,用到的公司越来越多.中文官网:https://www.elastic.co/cn/ . es的特点: 可拓展性:大型分布式集群(数百 ...

  7. Redis集群运维与核心原理(哨兵选举、集群选举等)剖析

    1.Redis集群方案比较 哨兵模式 高可用集群模式 redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制.高可用和分片特性.Redis集群不需要 sentinel哨兵也能完成节点移除 ...

  8. Redis集群架构搭建和原理

    Redis集群架构教程 Redis常见的架构有主从.哨兵.高可用集群,接下来的文章分四章分别介绍linux安装redis.主从架构搭建.哨兵模式搭建.集群架构搭建 第一章 Redis的安装 我的cen ...

  9. 一文道明Redis集群架构工作原理及搭建

    文章目录 前言 一.Redis-Cluster(集群)长什么样子? 二.Redis-Cluster集群搭建 1. Redis集群搭建 2. 客户端测试 3. 增加主节点(6000)到集群环境中 4. ...

最新文章

  1. ctrl+Enter 自动加上 .com 而不是 .com.cn
  2. vim调用python显示json数据
  3. tmpfs加速并降低squid负载(一)
  4. js面向对象的五种写法
  5. mysql要将语句反复执行15次_MySQL多表查询疑问
  6. 数据挖掘十大经典算法原理
  7. 2016.10.9晨记
  8. Java高级之HashMap中的put()方法和putIfAbsent()方法
  9. 计算机文化基础试题每日一练15,【每日一练】2018教师[资格考编]笔试备考练习(9.6)...
  10. 《Web全栈工程师的自我修养》读后感
  11. 现代操作系统学习笔记三、死锁
  12. 正则表达式 - 自动生成器
  13. 使用POI对excel文件进行读取
  14. iOS SDWebImage缓存
  15. mmdetection配置踩坑
  16. 微型计算机的多级存储结构,微型计算机存储系统结构.doc
  17. 网络安全专业应届生必备的几个实用工具,快收藏
  18. 接雨水---LeetCode----(20)--左右夹逼法
  19. 未来乡村|数字乡村|数字化解决方案|乡村数字化体验
  20. 大学认可的一类出版社目录

热门文章

  1. 名帖243 唐寅 行书《题跋达摩六代祖师图》
  2. k8s k3s云容器性能测试-边端云端性能测试
  3. 深度学习:Diffusion Models in Vision: A Survey视觉中的扩散模型:综述
  4. Hex-Rays Decompiler
  5. oracle 03002,RMAN-03002 RMAN-06091 错误解决方法
  6. SLM6500原厂2A同步降压型锂电池充电电路
  7. 如何解决kaldi的依赖库mkl安装失败的问题
  8. Python3.7 pytesseract+PIL+Tesseract-OCR识别中文
  9. android 笔记管理app,安卓有什么记笔记的软件?安卓平台好用的笔记app
  10. WinXP内核驱动调试