1、Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新节点地址,对于很多应用场景这种故障处理的方式是无法接受的。可喜的是 Redis 从 2.8 开始正式提供了 Redis Sentinel (哨兵)架构来解决这个问题。
2、Redis Sentinel 的高可用性
当主节点出现故障时,Redis Sentinel 能自动完成故障发现和转移,并通知应用方,从而实现真正的高可用。
Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis数据节点,每个 Sentinel 节点对数据节点和其余 Sentinel 节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它们会选举出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化实时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。
如下图所示,Redis Sentinel 与 Redis 主从复制模式只是多了若干 Sentinel 节点,所以 Redis Sentinel 并没有针对 Redis 节点做了特殊处理,这里是很多开发和运维人员容易混淆的。
从逻辑架构上看,Sentinel 节点集合会定期对所有节点进行监控,特别是对主节点的故障实现自动转移。
从Redis Sentinel 逻辑架构以及故障转移的处理,可以看出 Redis Sentinel 具有以下几个功能:
- 监控:Sentinel 节点会定义检测 Redis 数据节点、其余 Sentinel 节点是否可达。
- 通知:Sentinel 节点会将故障转移的结果通知给应用方。
- 主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
- 配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。
同时看到, Redis Sentinel 包含了若个 Sentinel 节点,这样做也带来了两个好处:
- 对于节点的故障判断是由多个 Sentinel 节点共同完成,这样可以有效地防止误判。
- Sentinel 节点集合是由若干个 Sentinel 节点组成的,这样即使个别 Sentinel 节点不可用,整个 Sentinel 节点集合依然是健壮的。
但是 Sentinel 节点本身就是独立的 Redis 节点,只不过他们有一些特殊,它们不存储数据,只支持部分命令。