Redis Sentinel
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 将对已下线的的主服务器执行故障转移操作。
- 在从服务器里面挑选一个,并将其转换为主服务器其。
- 让已下线主服务器属下的所有从服务器改为复制新的主服务器。
- 将已下线的主服务器设置为 新的主服务器 的从服务器,当其重新上线后,作为从服务器运行。
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)。
- 合理设置参数,防止误切,控制切换灵敏度控制:
- quorum
- down-after-milliseconds 30000
- failover-timeout 180000
- maxclient
- timeout
- 部署的各个节点服务器时间尽量要同步,否则日志的时序性会混乱。
- Redis 建议使用
pipeline
和multi-keys
操作,减少 RTT 次数,提高请求效率。 - 自行搞定配置中心 (zookeeper),方便客户端对实例的链接访问。
