Redis-Sentinel总结
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/redis/Redis-Sentinel-Summary.html
1.Redis主从架构
- 主节点负责写入操作
- 从节点可以提供读取操作(可配置,有延迟,高一致性的场景下需要注意)
2.Redis主从复制流程
- Redis Slave 与Master
建立连接
- Master执行bgsave
生成rdb快照文件
- Master
发送rdb快照文件
给到Slave - Slave接收到rdb快照文件后,
清空自己的数据
,然后加载rdb快照文件
- 同时,Master会继续将
新的写操作同步给Slave
(这里用了老版本用的环形结构,高并发情况下可能会丢数据,新版本用的无盘复制不会有这个问题) - Slave加载完rdb快照文件后,开始接收Master的写操作,完成同步
- 之后Slave会周期性的向Master发送sync命令,Master接收到sync命令后,会将新的写操作同步给Slave,保证数据的一致性
3.Redis-Sentinel高可用集群
每个Sentinel节点每秒钟会向所有Redis节点以及所有Sentinel节点发送ping命令(实际上是info命令),来确认节点是否正常工作
3.1 Redis故障发现&故障转移
故障发现
- 如果Sentinel
主节点发现Master节点挂了
(Ping命令响应超时,对应配置为own-after-millisecond),那么Sentinel会将这个节点标记为主观下线
- Sentinel主节点
通知Sentinel从节点们ping
这个Master节点,如果有足够多Sentinel节点认为Master节点挂了
(可配置,一般配置为过半,也就是2个节点),那么Sentinel会将这个节点标记为客观下线
,即『真下线』
故障转移
Sentinel主节点会剔除无效节点(最近一次ping超时),并且选取一个偏移量最新的Redis Slave节点作为新的Master节点(偏移量一致会根据节点id,选最小的)
- Sentinel主节点下发
slave of no one
命令给新的Master节点,让它升级为Master节点 - Sentinel从节点订阅原有的Redis从节点信息发现该节点已经变成了Master节点,于是将自己的Master节点信息更新为新的Master节点,同时把原来的主节点信息给剔除掉
- Sentinel主节点向其他所有的Redis从节点下达
slave of
命令,让它们成为新的Master节点的从节点 - 新的从节点会重新执行一次主从复制流程,从新的Master节点同步数据
- 故障转移完成
PS.
原有的Master
在故障恢复后会变成新的Master的从节点
,启动后执行主从复制流程,与新Master保持数据一致
4. Sentinel集群的高可用
Sentinel相互感知发现
- 每个Sentinel节点都会在Redis注册自己的信息
Sentinel的故障发现与选举
基于Raft算法,大意是说:
- 主节点与从节点之间维持心跳(心跳的时候还会顺带带上新的日志信息)
- 从节点如果一定时间内收不到主节点的心跳信息,自己就会发起选举选自己为主节点
- 其他节点会根据选举周期、日志偏移量确定是否能让他升主节点
- 就这样🤷
raft算法详细可以参考: 这个up主的视频
Redis-Sentinel总结