概述
复制
复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡
缺点: 故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制
哨兵
在复制的基础上,哨兵实现了 自动化故障恢复
缺点: 写操作无法负载均衡、存储能力受到单机的限制
集群
解决了 写操作无法负载均衡、存储能力受到单机的限制
Sentinel
监控主服务器及其从服务器, 当主服务器下线时, 自动将某个从服务器升级为主服务器; 此外, sentinel还会继续监视下线的服务器, 等到它重新上线时, 将其设置为新的主服务器的从服务器.
命令
客户端可以对sentinel服务器执行的全部命令
- ping
- sentinel
- info
- subscribe / unsubscribe
- psubscribe / punsubscribe (模式订阅)
工作原理
节点发现 初始配置
sentinel只需要配置主服务器的地址信息, 通过info获得从服务器信息, 通过订阅
__sentinel__:hello频道获取其他sentinel节点信息
根据配置获取所监视的主服务器的地址, 向其创建两个异步网络连接
- 命令连接: 用于向服务器发送命令, 接受命令
- 订阅连接: 订阅服务器的
__sentinel__:hello频道
sentinel默认以每十秒一次的频率, 向主服务器发送
info命令; 通过回复, 可得知主服务器具体信息, 以及从服务具体信息- 若从服务对应实例已存在, sentinel会对从服务器的实例结构进行更新
- 若不存在, 则说明是新发现的从服务器, sentinel会创建新实例结构, 并创建订阅连接以及命令连接
sentinel默认以每十秒一次的频率, 向从服务器发送info命令, 得到从服务具体信息, 并更新其实例.
sentinel默认以两秒一次的频率, 向所监控的服务器
publish __sentinel__:hello sentinel的ip:port 配置纪元, 目标服务器的ip:port 配置纪元
则所有监控该服务器的sentinel节点都会收到这条信息

当一个Sentinel接收到其他Sentinel发来的信息时,目标Sentinel会从信息中分析并提取出以下两方面参数:
- 与Sentinel有关的参数:源Sentinel的IP地址、端口号、运行ID和配置纪元。
- 与主服务器有关的参数:源Sentinel正在监视的主服务器的名字、IP地址、端口号和配置纪元。
因此, 监视同一个主服务器的sentinel节点可以自动发现对方, 而无需配置
当一个sentinel发现新的sentinel时, 会创建其实例, 以及命令连接
sentinel之间不会创建订阅连接

自动化故障恢复
Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器、其他Sentinel在内)发送PING命令
- 有效回复:实例返回+PONG、-LOADING、-MASTERDOWN三种回复的其中一种
若在
down-after-milliseconds时间内没有得到有效回复, 则sentinel标识该服务器为 主观下线状态判断为主观下线后, 会询问其他sentinel节点; 当该sentinel接收到超过
quorum数量的主观下线判断后, 就会判定为 客观下线.当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作
故障转移操作主要分为三步: