redis主机默认是10s发送一次心跳给从节点。
从节点默认1s去发送心跳给主节点。
1、原理
当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。
从节点的主要两个作用:
- 主节点的数据备份。
- 实现读写分离
2、部署架构
为了防止哨兵宕机,因此哨兵也是需要多台部署,不少于3台.
哨兵本身也是一台redis节点,只是充当监控的角色,不参与业务操作,不存储数据
3、哨兵实现原理
按照上图的部署架构,哨兵依赖于3个定时任务去实现监控和故障转移。
定时任务作用一
1.sentinel节点向主从节点发送一次info命令.就可以得到主从的拓扑结构。
//例如有新的从节点加入,执行slaveof命令后,哨兵会再下一次info命令后感知到新的拓扑结构。
2.同理,主机或者某一个从节点宕机,那么哨兵再次执行info命令的时候,会感知到新的哨兵结构,做出对应的操作.
定时任务作用二
每隔2s的一次publish/subscribe
1. 哨兵1,2,3会向redis中的数据节点发送发布订阅命令。
2. 目的是为了感知新加入的哨兵节点,以及在哨兵之间交互主节点的状态。
定时任务作用三
每隔1s发送一次ping
1.例如,哨兵3每隔1s向哨兵1,2,主节点,从节点发送一次ping心跳。
//首先是判断各个节点是否存活
由此可以看出,哨兵还是挺忙的,忙着故障的恢复和转移
哨兵与主从的通讯
4、主管下载,客观下线,领导者选举
达到客观下线的条件后,开启领导者哨兵选举
谁先发现下线,谁就是哨兵的领导者
5、故障转移
1. 哨兵从从节点列表中,选择一台从节点。
2. 过滤掉不监控的从节点,一般是5s内没有回复pong的。
3. 如果两个从节点都是健康的,则选择那个优先级高的。优先级是可以配置的
4. 如果以上不满足,则选择复制最完整的节点来充当主节点。
5. 如果还不满足,则选择runid最小的节点。runid最小表示是最早启动的节点。
哨兵完成主从切换后,对于Java客户端来说,是无感知的,客户端如何操作呢?不可能去修改配置文件的。
通过JedisSentinelPool实现在客户端的主从切换