Redis主从
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
数据同步
主节点有了从节点之后,就需要进行数据同步
全量同步流程:
1、slave节点请求同步
2、主节点开启子线程将内存数据生成RDB,发送RDB到slave
3、slave清空本地数据,利用RDB文件同步主节点数据
4、主节点将开启子线程之后的新增命令记录在repl_baklog,发给从节点进一步同步
增量同步流程:
从节点提交自己的offset到master,主节点获取repl_baklog中从offset之后的命令,发送给从节点
全量增量选择:
1、主从第一次同步->全量
2、断开时间太久了,repl_baklog中的offset已经被覆盖了(想增量也办不到了)->全量
3、能找到offset->增量
slave从节点宕机恢复后可以找master主节点同步数据,那master节点宕机怎么办?
哨兵的作用
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:
1、监控:哨兵不断检查主从节点是否正常工作
2、自动故障恢复:主节点故障,哨兵将一个从节点提升为主节点。当故障恢复继续使用新主节点
3、通知:哨兵充当Redis客户端的服务发现来源,主从节点发生变化推送给redis客户端
服务状态监控:
Sentinel基于心跳机制检测服务状态,每隔一秒向集群的每个实例发送ping命令:
1、主观下线:哨兵集群中的某个哨兵发现某个实例未在规定时间响应,则该哨兵认为实例主观下线
2、客观下线:若集群中超过一半的哨兵都认为该实例主观下线,则认为该实例客观下线(真故障了)
如何选举新的master
一旦发现master故障,sentinel需要在从节点中选出一个新主节点
1、首先判断从节点与主节点断开时间长短,断开时间过长直接排除
2、判断从节点的slave-priority值,值越小优先级越高
3、slave-priority一样,则判断从节点offset值,越大->数据越新->优先级越高
4、判断从节点运行id大小,越小->优先级越高
如何实现故障转移?
选中要成为主节点的从节点后,
1、哨兵给备选从节点发送slave of no one 命令,晋升为主节点
2、哨兵给其他从节点发送命令,让其他从节点的master变成新主节点,并开始从新主节点上同步数据
3、将原故障主节点标记为slave,故障恢复后自动成为新主节点的从节点