专栏首页颇忒脱的技术博客Redis Cluster配置传播及故障恢复笔记

Redis Cluster配置传播及故障恢复笔记

本笔记是对Redis Cluster Spec - Configuration handling, propagation, and failovers的归纳总结。

Epoch

  • 可以把Epoch当作是一个版本号,是一个64位无符号整形
  • 每个Node自己有一份Cluster.currentEpoch、MySelf.configEpoch、其他Node.configEpoch,详见文档
  • 每个Master有自己的ConfigEpoch且在整个Cluster中唯一
  • Slave的ConfigEpoch随其Master
  • Cluster.currentEpoch,该值等于所有Node中最大的ConfigEpoch的值
  • Master的ConfigEpoch初始值是0,也就是说Cluster.CurrentEpoch的初始值也是0
  • Node之间Gossip传输消息时,Receiver发现Sender的ConfigEpoch比自己大,那么就更新自己的Cluster.CurrentEpoch为该值,随时间收敛,所有Node的Cluster.CurrentEpoch都变成一样。

Slave Promotion

Slave的动作

下面是总结的在发生Slave Promotion时,Slave做的事情。

Master的动作

下面是总结的在发生Slave Promotion时,Master做的事情。

传播Slots的配置

Slave赢得选举之后会在己侧更新Slots上的归属信息,然后在定时的PING/PONG中将这个信息传播出去。

PING/PONG总是会携带上Slots所属Master的信息(包括ConfigEpoch)

PING的Reciever如果发现Sender的某个Slot上的Master.ConfigEpoch比自己这里记录的小,那么就会返回UPDATE告诉Sender更新Slots归属信息。

下面是两个规则:

  1. 如果一个Slot不属于任何Master,然后有一个Master宣称拥有它,那么就修改己侧的Slots信息把这个Slot关联到这个Master上。
  2. 如果一个Slot已经归属一个Master,然后又有一个Master宣称拥有它,那么就看谁的ConfigEpoch大,大的那个赢

Node复活后遇到的问题

Node A有两个Slot,然后它死了,它被顶替了,等它复活时发现两个Slot一个被Node B接管,另一个被Node C接管了,那么它:

  1. 因为自己的ConfigEpoch已经很旧了,所以它复活后不负责任何Slot
  2. 然后它会成为最后一个Slot的Master的Slave

Slave迁移算法

Slave迁移时一个自动过程。

举个例子,现在有Master A、B,它们对应的Slave有A1、B1、B2。现在A死了,A1顶替上去,不过这个时候A1就是一个光棍Master(它没有Slave),B有富余的Slave(B1和B2),把其中一个匀给A1当Slave。

这个过程不需要共识,因为只是修改Slave的归属,也不会修改ConfigEpoch。

Slave迁移有两个规则:

  1. 当有多个Slave富余时,选择NodeID字典顺最小的那个来迁移
  2. 只有当Master的Slave数量>=cluster-migration-barrier时,才会挑选它的Slave做Migration

两个跳过共识修改ConfigEpoch的操作

下面两个操作比较危险,最好确定一个成功后再执行另一个:

  • CLUSTER_FAILOVER TAKEOVER(手动Failover)直接将一个Slave提升为Master,不需要大多数Master同意。
  • Slot Migration同样不需要大多数Master同意。

所以就有可能出现同一个Slot有两个相同ConfigEpoch的Master宣称由自己负责,这种冲突的解决算法是:

  • 如果Master A发现Master B也宣称了对Slot X的主权,并且两者的ConfigEpoch一样
  • 如果Master A的NodeID的字典顺比Master B的小
  • 那么Master A就把己侧的CurrentEpoch+1,同时ConfigEpoch改成和CurrentEpoch一样

Node重制

略,见文档

移除Node

略,见文档

一些自问自答

Q:ConfigEpoch何时变化?

A:Slave Promotion时、手动Failover时、Slot Migration时

Q:ConfigEpoch怎么变化?

A:Node->ConfigEpoch = Cluster->CurrentEpoch + 1,结果也就是Cluster->CurrentEpoch加1了。源码见这里

Q:两个Master的ConfigEpoch一样怎么办?

A:这个会出现在两个Slave同时Promotion时,解决办法是NodeID字典序比较小的那个会再一次Bump ConfigEpoch,源码见这里

Q:ConfigEpoch有什么用?

A:当有两个Master宣称自己拥有同一个/批Slot时,ConfigEpoch大的那个赢,因为大的那个代表最新信息,其他Node只会采用赢的那方所宣称的信息。

Q:CurrentEpoch有什么用?

A:1)用来判定Node所获得的Cluster信息的新旧。2)当Node要变更ConfigEpoch时派用处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 创建Jenkins Pipeline流水账

    点击创建流水线后Jenkins会拉取GIT仓库,并且尝试寻找存在Jenkinsfile的分支,然后构建。不过不管构建是否成功,都不要管它,我们回到经典页面做进一...

    颇忒脱
  • 如何在Tomcat中做TLS客户端认证

    常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度...

    颇忒脱
  • Spring Cloud Config配置文件最佳实践

    大多数Spring Cloud项目都会使用Spring Cloud Config来管理应用启动时的配置文件,同时开发人员面临着多样化的程序启动方式:操作系统进程...

    颇忒脱
  • 在网页里让文本框只能输入数字的一种方法。外加回车换Tab

    第一步利用样式表。 <asp:TextBox Runat="server" id="TT" style="ime-mode:disabled"  onkeyd...

    用户1174620
  • LeetCode - N叉树的后序遍历

    原题地址:https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/

    晓痴
  • SpringBoot整合Redis

    偷懒了几天,好几天没写springboot了。真的不是没什么可写,是因为坚持做一件事真的很难。 今天抽空弄了一个springboot整合redis的小例子。 ...

    dalaoyang
  • [Silverlight动画]转向行为 - 群落

    说到群落,很难不引用Craig Reynolds和他的"boilds"模拟系统。Reynolds很牛的将一个看似非常恐怖的复杂过程,拆成了几个比较简单的行为。 ...

    用户1172164
  • Spring Boot2.0 Oauth2 服务器和客户端配置及原理

    有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。

    chinotan
  • GPU并行计算和CUDA编程(1)-CPU体系架构概述

    今天和实验室同学去听了周斌老师讲的《GPU并行计算和CUDA程序开发及优化》(课程主页:http://acsa.ustc.edu.cn/HPC2015/nvid...

    王云峰
  • node.js进阶学习

    简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Nod...

    财主刀刀

扫码关注云+社区

领取腾讯云代金券