Redis Sentinel哨兵集群架构模式原理(下)

简介: Redis Sentinel哨兵集群架构模式原理

1.png5 定时任务

  1. 每10s 每个 sentinel 对 master 和 replica 执行 INFO 命令


  • 发现 replica 节点
  • 确认主从关系

1.png

  1. 每 2s 每个 sentinel 通过 master 节点的channel交换信息(pub/sub)
  • 通过 sentinel :java频道交互
  • 交互对节点的"看法”和自身信息

image.png

  1. 每 1s 每个 sentinel 对其他 sentinel 和 redis 执行ping
  • 心跳检测,失败判定依据

image.png

6 主观下线、客观下线

6.1 主观下线(Subjectively Down,SDOWN)

单个 Sentinel 节点对服务器做出的下线判断,即单个 Sentinel 认为某个服务下线(有可能是接收不到订阅,之间的网络不通等一系列原因)。

主观下线是每个sentinel节点对Redis节点失败的偏见

所以还需客观下线机制。

6.2 客观下线(Objectively Down,ODOWN)

多个 Sentinel 实例在对同一服务器做出 SDOWN 判断,并通过命令互相交流后,得出的服务器下线判断,然后开启 failover。


只有在足够数量( 超过quorum个)的 Sentinel 都将一个服务器标记为主观下线后, 服务器才会被标记为客观下线(ODOWN)。


只有当 M 被认定为客观下线时,才会发生故障迁移。

仲裁

仲裁指配置文件中的 quorum 参数。某个 Sentinel 先将 Master 节点标记为主观下线,然后会将这个判定通过 sentinel is-master-down-by-addr 命令询问其他 Sentinel 节点是否也同样认为该 addr 的 Master 节点要做主观下线。

image.png

sentinel monitor <masterName> <ip> < port> <quorum>
sentinel monitor myMaster 127.0.0.1 6379 2
# 
sentinel down-after-milliseconds < masterName> < timeout>
sentinel down-after-milliseconds mymaster 30000

最后当达成这一共识的 Sentinel 个数达到前面说的 quorum 设置的值时,该 Master 节点会被认定为客观下线并进行故障转移。

quorum 值一般设为 Sentinel 个数的二分之一加 1,例如 3 个 Sentinel 就设为 2。


综上可得

哨兵工作原理

  1. 每个 Sentinel 以 1次/s 向它所知的 Master,Slave 以及其他 Sentinel 节点发送一个 PING
  2. 若一个实例距离最后一次有效回复 PING 的时间超过配置文件 down-after-milliseconds,则该实例会被 Sentinel 标记为 主观下线
  3. 若一个 Master 被标记为主观下线,则正在监视该 Master 的所有 Sentinel 会 1次/s 确认 Master 是否真的进入主观下线状态
  4. 当有足够数量 Sentinel(大于等于配置文件指定的值)在指定时间范围内确认 Master 的确进入主观下线状态,则 Master 会被标记为 客观下线
  5. 若 Master 处于 ODOWN 状态,则投票自动选出新Master。将剩余从节点指向新Master继续数据复制
  6. 在正常情况下,每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令;当 Master 被 Sentinel 标记为客观下线时,Sentinel 向已下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次(因为原来是稳定的,10s 一次info就是为了看看有没有新加入的 sentinel,但现在故障了,所以要尽快将环境稳定好,快速确认完主从关系)
  7. 若没有足够数量 Sentinel 同意 Master 已经下线,Master 的客观下线状态会被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回复,Master 的主观下线状态就会被移除。

7 领导者选举

原因:只有一个sentinel节点完成故障转移。

选举:通过sentinel is-master-down-by-addr命令都希望成为领导者:

  1. 每个做主观下线的Sentinel节点向其他Sentinel节点发送命令,要求将它设置为领导者
  2. 收到命令的Sentinel节点如果没有同意通过其他Sentinel节点发送的命令,那么将同意该请求,否则拒绝
  3. 如果该Sentinel节点发现自己的票数已经超过Sentinel集合半数且超过quorum,则将成为领导者
  4. 如果此过程有多个Sentinel节点成为了领导者,那么将等待一段时间重新选举


  • 选举实例

1.png

8 故障转移

领导者节点完成

  1. 从slave节点中选出一个“合适的"节点作为新的master节点
  2. 对上面的slave节点执行slaveof no one命令让其成为master节点
  3. 向剩余slave节点发送命令,让它们成为新master节点的slave节点,复制规则和parallel-syncs参数有关
  4. 更新对原来master节点配置为slave,并保持着对其关注,当其恢复后命令它去复制新的master节点。

选择合适的slave节点

  1. 选择slave priority(slave节点优先级)最高的slave节点,如果存在划返同,不存在则继续。
  2. 选择复制偏移量最大的slave节点(复制的最完整),若存在则返回,不存在则
    继续。
  3. 选择runId最小的slave节点。

常见开发运维问题

节点运维

  • 机器下线:例如过保等情况
  • 机器性能不足:例如CPU、内存、硬盘、网络等
  • 节点自身故障:例如服务不稳定等


主节点

sentinel failover <masterName>

1.png

节点下线

  • 从节点:临时下线还是永久下线,例如是否做一些清理工作。但是要考虑读写分离的情况。
  • Sentinel节点: 同上。


节点上线

  • 主节点: sentinel failover进行替换
  • 从节点: slaveof即可, sentinel节点可以感知
  • sentinel节点:参考其他sentinel节点启动即可。


从节点的作用

  1. 副本:高可用基础
  2. 拓展读能力

1.png

由于Redis Sentinel只会对主节点进行故障转移,对从节点采取主观的下线,所以需要自定义一个客户端来监控对应的事件


三个消息


  • +switch-master :切换主节点(从节点晋升主节点)
  • +convert-to-slave :切换从节点(原主节点降为从节点)
  • +sdown:主观下线。

总结

  • Redis Sentinel是Redis的高可用实现方案:
    故障发现、故障自动转移、配置中心、客户端通知。
  • Redis Sentinel从2.8版本开始才正式生产可用
  • 尽可能在不同物理机上部署Redis Sentinel的所有节点
  • Redis Sentinel中的Sentinel节点个数应该≥3,且最好为奇数,便于选举
  • Redis Sentinel中的数据节点与普通数据节点无差异
  • 客户端初始化时连接的是Sentinel节点集合,不再是具体的Redis节点,但
    Sentinel只是配置中心,并非代理
  • Redis Sentinel通过三个定时任务实现了Sentinel节点对于主节点、从节点、
    其余Sentinel节点的监控
  • Redis Sentinel在对节点做失败判定时分为主观下线和客观下线
  • 看懂Redis Sentinel故障转移日志对于Redis Sentinel以及问题排查非常有帮助
  • Redis Sentinel实现读写分离高可用可以依赖Sentinel节点的消息通知,获取Redis数据节点的状态变化


参考

目录
相关文章
|
9月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
600 2
|
7月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
798 6
|
7月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1333 3
|
8月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
409 1
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
947 3
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
1241 0
|
Java 开发者 Sentinel
Spring Cloud系列——使用Sentinel进行微服务保护
Spring Cloud系列——使用Sentinel进行微服务保护
624 5