Redis哨兵模式与高可用
来自《Redis设计与实现》
Sentinel是Redis高可用的解决方案
哨兵是一个独立的进程,原理:哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个Redis实例。
由一个或者多个sentinel实例组成的sentinel系统可以监视任意多个服务器进程,以及这些主服务器属下的所有从服务器,并在被监视的主服务器下线以后,自动将现行的服务器属下的某个从服务器升级为新的猪服务器,然后由新的服务器代替已经下线的主服务器继续处理命令的请求。
Sentinel启动时,需要执行的步骤
- 初始化服务器
- 将普通的Redis服务器使用代码代替成Sentinel专用代码
- 初始化Sentinel状态
- 给定配置的文件,初始化sentinel监视主服务器列表
- 创建连向主服务器的网络连接
Sentinel本质上是一个运行在特殊模式下的Redis服务器
创建连接主服务器的连接的时候,会有两个连接:一个是命令连接,用以向主服务器发送命令,并且接受命令的回复;另一个是订阅主服务器的__sentinel__:hello命令
- Sentinel默认以10秒一次的频率向被监视的主服务器 发送INFO命令,分析INFO命令获取主服务器的当前信息。
- Sentinel发现主服务器的有新的从服务器以后,会向其创建新的命令连接与订阅连接。
- Sentinel默认2秒一次的频率向所有被监视的服务器的sentinel:hello频道发送命令 记录的是本身的信息
- Sentinel默认一秒一次的频率向所有的命令连接的实例发送PING命令,超过指定时间未返回确定主观下线
- 主观下线以后,会向其他同样监视这个服务的Sentinel进行询问,如果同时确定以后,将服务器判定为客观下线
- 客观下线以后,监视下线主服务器的Sentinel会协商选举出一个领头的Sentinel,对下线的主服务器进行故障转移的操作
故障转移:
- 对已经下线的所有的从属服务器里面,选出一个成为新的主服务器。
- 令其他所有的从属服务器复制新的主服务器
- 将原来的主服务器降级成为新的从属服务器,重新上线以后复制新的主服务器
新服务器产生的机制:向某个从属服务器发送SLAVEOF no one命令使其成为新的主服务器
- 删除所有下线或者断线的从属服务器
- 删除列表内最近五秒内没有响应INFO命令的从属服务器,从而保证所有从属服务器都是最近通信成功的
- 删除所有与已下线的主服务器连接断开超过down-after-milliseconds*10毫秒的从服务器,保证服务器保存的信息是比较新的
- 根据优先级==》复制偏移量==》运行ID的方法选出新的主服务器
- 向所有的从属服务器发送SLAVEOF命令,包括已经下线的原主服务器