Redis Sentinel 高可用架构
大约 12 分钟
Redis Sentinel 高可用架构
Redis 主从复制
基础架构
要了解 Redis 的高可用架构,首先要了解 Redis 主从复制的过程。
构建高可用架构的基础是构建多个数据相同的节点。我们这里构建了三个 Redis 节点,一个 master 主节点和两个 slave 从属节点,形成一主两从的小集群。这是最常见的 Redis 集群形态。
- Master 主节点:主要负责数据的写入操作。
- Slave 从属节点:分担来自应用的读取压力,可以配置读写分离。
主从复制过程
Redis 主从复制的背后原理如下:
- 建立连接:当 Redis 的 slave 向 master 建立连接时,执行
SLAVE OF
命令。 - 生成快照:作为 Redis 主节点,执行
BGSAVE
命令生成一个 RDB 快照。RDB 是 Redis 中的一种数据备份方式,会将内存中的数据以二进制文件形式在本地保存。 - 发送快照:将生成的 RDB 快照发送到从属服务器上。
- 数据还原:从属服务器接收到 RDB 快照后,读取并还原数据,确保主从数据一致。
- 命令转发:初始化完毕后,主服务器每接收到一个写命令,会将该命令转发给所有从属服务器,从属服务器重新执行命令,保持数据一致。
主从复制缺点
如果 Redis master 主节点挂掉,整个小集群就会瘫痪,这是现实应用中不允许的。
Redis Sentinel 高可用架构
Sentinel 架构概述
Redis 官方提供了一个名为 Sentinel 的高可用集群架构方案。
Sentinel(哨兵)就像一个哨兵一样(本质是监听程序),为 Redis 集群保驾护航。
Sentinel 集群推荐至少六个节点,其中三个 Sentinel 和三个 Redis 主从。
- Sentinel 集群:由三台 Sentinel 服务器构建,其中一个为 leader 领导者角色。
- 健康状态检测:每个 Sentinel 节点会向 Redis 主从实例发送 PING 命令,确保健康状态,形成网状通信结构。
每个 Sentinel 以每秒钟一次的频率向它所知的Master,Slavel以及其他Sentinel实例发送一个PING命令。
故障检测与转移
当 Redis master 因某种原因挂掉,Sentinel 会执行以下步骤:
主观下线:
- Sentinel leader 向 master 发起请求,超时无响应
- 如果一个实例 (instance) 距离最后一次有效回复PING命令的时间超过 own-after-milliseconds 选项所指定的值,刚这个实例会被 Sentinel 标记为主观下线。
- 主观下线可能是网络通信不畅导致的误判。
客观下线:
- Sentinel leader 通知其他 Sentinel 节点向 master 发起 PING 请求。
- 如果足够数量的 Sentinel 节点在指定范围内确认 master 无响应,则标记为客观下线,认为 master 真正宕机。
故障转移:选择新主节点 -> 剔除无效从属节点,选出数据最完整的 slave 节点作为新主节点。
- 剔除主观认为已下线、断线或超过一定时长无响应的从属节点。
- 剔除与失效主服务器连接断开时长超过
down-after
选项时长十倍的从属节点。 - 根据同步数据的偏移量选出数据最完整的 slave 节点。
- 如果多个 slave 数据完全同步,则按编号从小到大顺序提升。
- 提升新主节点:Sentinel leader 向新主节点下达
SLAVE OF NO ONE
命令,提升为主节点。 - 更新配置:其他 Sentinel 节点订阅新主节点消息,更新本地配置文件。
- 重建连接:Sentinel leader 向所有从属服务器下达
SLAVE OF
命令,与新主节点建立连接,重新同步数据。 - 旧主节点恢复:原有 master 恢复后,降级为 slave,与新主节点全量同步数据。
- 剔除主观认为已下线、断线或超过一定时长无响应的从属节点。
Sentinel 自身高可用
Sentinel 本身通过 raft 算法进行选举,确保高可用。
选举过程
- 集群中超过半数节点投票通过,节点成为主服务器(leader),负责故障转移和命令下达。
- leader 挂掉后,剩余节点重新选举新的 leader。
节点发现
- 每个 Sentinel 节点接入后,将自己的信息注册到 master 节点上。
Sentinel 节点通过 master 获取其他 Sentinel 节点的 IP 地址信息,进行选举和通信。
总结
Redis Sentinel 高可用集群通过故障检测、选举新主节点、更新配置和重建连接等步骤,确保 Redis 集群的高可用性。
Sentinel 自身通过 raft 算法进行选举,保证服务不中断。