前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对线面试官-Redis(八 基于哨兵HA的原理)

对线面试官-Redis(八 基于哨兵HA的原理)

作者头像
@派大星
发布2023-08-10 13:42:48
1320
发布2023-08-10 13:42:48
举报
文章被收录于专栏:码上遇见你

面试官:之前聊了基于哨兵模式的Redis高可用,那哨兵如何部署才能保证故障转移成功呢?

派大星:哨兵集群必须部署 2 个以上节点,如果哨兵集群仅仅部署了 2 个哨兵实例,quorum = 1。

如果 master 宕机, s1 和 s2 中只要有 1 个哨兵认为 master 宕机了,就可以进行切换,同时 s1 和 s2 会选举出一个哨兵来执行故障转移。但是同时这个时候,需要 majority,也就是大多数哨兵都是运行的。

2 个哨兵,majority=2 3 个哨兵,majority=2 4 个哨兵,majority=2 5 个哨兵,majority=3

如果此时仅仅是 M1 进程宕机了,哨兵 s1 正常运行,那么故障转移是 OK 的。但是如果是整个 M1 和 S1 运行的机器宕机了,那么哨兵只有 1 个,此时就没有 majority 来允许执行故障转移,虽然另外一台机器上还有一个 R1,但是故障转移不会执行。经典的 3 节点哨兵集群是这样的:

配置 quorum=2,如果 M1 所在机器宕机了,那么三个哨兵还剩下 2 个,S2 和 S3 可以一致认为 master 宕机了,然后选举出一个来执行故障转移,同时 3 个哨兵的 majority 是 2,所以还剩下的 2 个哨兵运行着,就可以允许执行故障转移。

面试官:哨兵集群的自动发现机制了解吗?

派大星:这个我知道,哨兵之间的发现其实现方式是通过Redis的pub/sub,每个哨兵都会网__sentinel__:hello这个channel里发送一个消息,这个时候所有其它哨兵都可以消费到这个消息,并感知到其它哨兵的存在。

  • 同时,每隔两秒钟,每个哨兵都会往自己监控的某个master+slave对应的__sentinel__:hellochannel里发送一个消息,内容是自己host、ip和runid还有对这个master的监控配置。
  • 每个哨兵也会去监听自己监控的每个master + slave对应的__sentinel__:hellochannel,然后去感知到同样在监听这个master+slave的其它哨兵的存在
  • 每个视频还会和其它哨兵交换对master的监控配置,互相进行监控配置的同步

面试官:不错。有了解slave 配置的自动纠正吗?

派大星:其实是哨兵会负责自动纠正slave的一些配置,比如slave如果要成为潜在的master候选人,哨兵会确保slave复制现有master的数据,如果slave连接到一个错误的master上,比如故障迁移之后,那么哨兵会确保它们连接到正确的master上

面试官:那你知道对你的选举算法吗?可以聊一聊slave选举为master的算法吗?

派大星:如果一个master被任务odown了,而且majority(大多数)的数量的哨兵都允许主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave来,当然如果一个slave与master断开连接的时间已经超过了down-after-milliseconds的10倍,那么slave就会被认为不适合选举为master

代码语言:javascript
复制
(down-after-milliseconds * 10) + milliseconds_since_master_is_in_SDOWN_state

具体slave排序规则如下:

  • 首先按照slave的优先级排序,slave priority越低,优先级越高
  • 如果slave priority相同,那么看replica offset,哪个slave复制了越多的数据,offset越靠后,优先级则就越高
  • 如果上两个条件都相同,那么选择一个run id比较小的那个slave。

面试官:好的,刚刚有提到**odown**什么是**odown**,能简单解释以下吗?

派大星:可以,

  • odown是客观宕机,如果quorum数量的哨兵都觉得一个master宕机了,那么就是客观宕机
  • sdown是主观宕机,就一个哨兵如果自己都觉得一个master宕机了,那么就是主管宕机。

简单来说sdown达成的条件很简单,如果一个哨兵ping一个master,超过了is-master-down-after-milliseconds指定的毫秒数之后,就主观认为master宕机了;如果一个哨兵在指定时间内,收到了quorum数量的其它哨兵也认为那个master是sdown的,那么就是认为是odown了。

面试官:好的上面看你有提到quorum和majority,这两个能解释以下吗?

派大星:可以的,首先每一次哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来切换,这个哨兵还需要得到majority哨兵的授权才可以进行切换。如果当quorum < majority,比如 5 个哨兵,majority 就是 3,quorum 设置为 2,那么就 3 个哨兵授权就可以执行切换。但是如果 quorum >= majority,那么必须 quorum 数量的哨兵都授权,比如 5 个哨兵,quorum 是 5,那么必须 5 个哨兵都同意授权,才能执行切换。

面试官:了解configuration epoch吗?

派大星:哨兵会对一套 redis master+slaves 进行监控,有相应的监控的配置。执行切换的那个哨兵,会从要切换到的新 master(salve->master)那里得到一个 configuration epoch,这就是一个 version 号,每次切换的 version 号都必须是唯一的。如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待 failover-timeout 时间,然后接替继续执行切换,此时会重新获取一个新的 configuration epoch,作为新的 version 号。

面试官:了解configuration 传播吗?

派大星:哨兵完成切换之后,会在自己本地更新生成最新的 master 配置,然后同步给其他的哨兵,就是通过之前说的 pub/sub 消息机制。这里之前的 version 号就很重要了,因为各种消息都是通过一个 channel 去发布和监听的,所以一个哨兵完成一次新的切换之后,新的 master 配置是跟着新的 version 号的。其他的哨兵都是根据版本号的大小来更新自己的 master 配置的。configuration 传播 哨兵完成切换之后,会在自己本地更新生成最新的 master 配置,然后同步给其他的哨兵,就是通过之前说的 pub/sub 消息机制。这里之前的 version 号就很重要了,因为各种消息都是通过一个 channel 去发布和监听的,所以一个哨兵完成一次新的切换之后,新的 master 配置是跟着新的 version 号的。其他的哨兵都是根据版本号的大小来更新自己的 master 配置的。

面试官:非常不错,我对你这边的情况还是比较满意的。

派大星:谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档