跳至主要內容

Redis Sentinel

blacklad大约 4 分钟RedisRedisRedis 设计与实现

Redis Sentinel

Sentinel 哨兵是 Redis 的高可用性解决方案,由一个(多个)Sentinel 实例组成的Sentinel系统可以监视 Redis 服务器,当被监视的主服务器下线时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

Redis Sentinel 集群是由若干 Sentinel 节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端通知。

1 启动流程

1.1 初始化服务器

Sentinel 本质上是一个运行在特殊模式下的 Redis 服务器,只使用到了 Redis 的部分功能。

1.2 使用 Sentinel 专用代码

在加载过程中会替换 Redis 的配置代码、命令初始化代码等,所以在 Sentinel 模式下不能执行 Redis 的 set 等命令。

1.3 初始化 Sentinel 状态

保存记录 Sentinel 的状态。

1.4 初始化主服务器信息

记录所有需要被 Sentinel 监视的主服务器的信息。

1.5 与主服务器建立连接

创建网络连接,像服务器发送命令,从命令恢复中获取信息。

创建一个命令连接和一个订阅连接。

1.6 获取主服务器信息

每 10s 一次的频率、通过命令想被监视的主服务器发送 INFO 命令、通过返回内容获取主服务器信息,包括主服务器自身的信息和从服务器的地址信息,并对从服务器建立连接获取信息。

2 主观下线状态

Sentinel 会以每秒一次的频率向所有与他创建了命令连接的实例发送 PING 命令判断是否在线,当一个服务器在指定时间内都返回了无效恢复,Sentinel 就会标记为主观下线。

3 客观下线状态

当足够数量的 Sentinel 节点认为同一节点已经进入了主观下线状态(或者客观下线状态),Sentinel 会将从服务器判定为客观下线,主服务器执行故障转移操作。

4 选举领头 Sentinel

当主服务器被判断客观下线时,监视这个下线主服务器的各个 Sentinel 会进行协商选举出一个领头 Sentinel,并由领头 Sentinel 对下线主服务器执行故障转义操作。

5 故障转移

当选举出新的 Sentinel leader 之后,Sentinel 将对已下线的的主服务器执行故障转移操作。

  1. 在从服务器里面挑选一个,并将其转换为主服务器其。
  2. 让已下线主服务器属下的所有从服务器改为复制新的主服务器。
  3. 将已下线的主服务器设置为 新的主服务器 的从服务器,当其重新上线后,作为从服务器运行。

6 优点

  • Redis Sentinel 集群部署简单。
  • 能够解决 Redis 主从模式下的高可用切换问题。
  • 很方便实现 Redis 数据节点的线形扩展,轻松突破 Redis 自身单线程瓶颈,可极大满足 Redis 大容量或高性能的业务需求。
  • 可以实现一套 Sentinel 监控一组 Redis 数据节点或多组数据节点。

7 缺点

  • 部署相对 Redis 主从模式要复杂一些,原理理解更繁琐。
  • 资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务。
  • Redis Sentinel 主要是针对 Redis 数据节点中的主节点的高可用切换,对 Redis 的数据节点做失败判定分为主观下线和客观下线两种,对于 Redis 的从节点有对节点做主观下线操作,并不执行故障转移
  • 不能解决读写分离问题,实现起来相对复杂。

8 建议

  • 如果监控同一业务,可以选择一套 Sentinel 集群监控多组 Redis 数据节点的方案,反之选择一套 Sentinel 监控一组 Redis 数据节点的方案。
  • Sentinel monitor 配置中的建议设置成 Sentinel 节点的一半加 1,当 Sentinel 部署在多个 IDC 的时候,单个 IDC 部署的 Sentinel 数量不建议超过(Sentinel 数量 – quorum)。
  • 合理设置参数,防止误切,控制切换灵敏度控制:
    1. quorum
    2. down-after-milliseconds 30000
    3. failover-timeout 180000
    4. maxclient
    5. timeout
  • 部署的各个节点服务器时间尽量要同步,否则日志的时序性会混乱。
  • Redis 建议使用 pipelinemulti-keys 操作,减少 RTT 次数,提高请求效率。
  • 自行搞定配置中心 (zookeeper),方便客户端对实例的链接访问
上次编辑于:
贡献者: blacklad