一、Redis 高可靠性
1、数据尽量少丢失。
2、服务尽量少中断。
AOF与RDB保证了前者;针对后者Redis做法是增加副本沉余量。
副本多了之后,Redis提供了主从库模式,以保证数据副本的一致;主从库之间采用的是读写分离的方式。
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步从库。
1.1同步数据步骤:
第一阶段:建立连接。协商同步过程。主要为了全量复制做准备(使用的RDB文件)。
第二阶段:主库执行bgsave命令。生成RDB文件,接着发给从库。从库清除当前数据,然后加载RDB文件。(传输过程主库不会阻塞,仍然正常接收请求)
第三阶段:主库会把第二阶段执行过程中新收到的写命令,再发送给从库。
总结:主从库第一次数据同步过程需要完成两个耗时操作:生成RDB文件和传输RDB文件。
注意:当从节点过多,可以优化成,主-从-从。
命令:replicaof 所选从库的IP 6379
二、哨兵机制
在这种模式,如果从库发生故障,客户端可以继续向主库或其他从库发生请求,但一旦主库故障。直接影响从库的同步。因为从库没有相应的主库可以进行数据复制操作了。(纯读场景可以接受这种情况)
哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移问题。
注意:哨兵其实就是一个运行在特殊模式下的Redis进程,主从库实例运行的同时,它也在运行,它负责的三个任务:监控、选新的主库和通知。
2.1监控:
哨兵进程在运行时,周期性给所有主从库发生ping命令,检测它们是否仍然在线运行。如果从库没有响应就会被标记为下线状态。主库如果也没在规定时间响应,就会触发自动切换主库的流程。
2.2选择主库:
哨兵从从库中选择一个主库
2.3通知:
选择完成主库之后,会执行通知,把主库的连接信息发生给其它从库,让它们执行replicaof命令,和新主库建立连接,并进行数据复制。
注意:主库切换涉及误判操作。为了避免这种情况,通常采用多实例组成的集群模式进行部署——哨兵集群。
2.2.1 选择新主库:
有一个简单描述——选择主库的过程称为“筛选+打分”。
筛选:
确认从库在线状态+网络连接状态。如果从库老是和主库断连,这个不能作为主库的候选者。
配置项:down-after-milliseconds * 10 其中10表示次数,次数超过这个阀值,说明这个从库网络状况不好。
打分:
分别安装三个规则依次三轮打分:从库优先级、从库复制进度和从库ID号。只要某一轮从库得分最高,那么它就是主库。
优先级最高:
配置项:slave-priority 给不同库设置不同优先级。在选主时,哨兵会优先级高的从库打高分。如果有一个从库优先级最高,它就是主库。如果优先级一致,进行第二轮打分;
从库复制进度:
主从库同步时通过命令:master_repl_offset记录当前最新写操作在repl_backlog_buffer中位置。而从库slave_repl_offset值记录当前的复制进度。此时我们需要找的就是这个值和主库最接近的。那么它的得分就最高,变更主库。但是如果从库有二个最高一致,就会进行第三轮;
从库ID
每个实例都有一个ID,类似于从库的编号。目前Redis选主库时,有一个默认的规定,在优先级和复制进度都相同的情况下,ID号最小的从库得分最高。