如果redis实例宕机了,在恢复期间,无法服务新来的数据存取请求。
redis高可靠性:
- 数据尽量少丢失(AOF、RDB)
- 服务尽量少中断(增加副本冗余量)-将一份数据同时保存在多个实例上
redis提供了主从模式,采用读写分离-保证数据副本的一致
读操作-主库,从库都可以接收
写操作:主库先执行,然后主库将写操作同步给从库。
主从库如何进行第一次同步
如图:
第一阶段:psync 命令包含了主库的 runID 和复制进度 offset 两个参数。
runID,是每个 Redis 实例启动时都会自动生成的一个随机 ID,用来唯一标记这个实
例。当从库和主库第一次复制时,因为不知道主库的 runID,所以将 runID 设
为“?”。
offset,此时设为 -1,表示第一次复制。
FULLRESYNC 响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库。
第二阶段:主库将所有数据同步给从库。从库收到数据后,在本地完成数据加载。这个过程依赖于内存快照生成的 RDB 文件。
第三阶段:主库会把第二阶段执行过程中新收到的写命令,再发送给从库。
主从级联模式分担全量复制时的主库压力
为了防止给主库带来更多压力,提出一种“主 - 从 - 从”模式。
通过“主 - 从 - 从”模式将主库生成 RDB 和传输 RDB 的压力,以级联的方式分散到从库上。以减轻主库的压力
这个方案很好,但是当主从库之间网络断了将如何进行数据同步?
在redis 2.8之间,会进行主从之间的全量复制,这个开销非常大。
redis2.8开始:进行增量复制 使用repl_backlog_buffer (记录增量),repl_backlog_buffer 是一个环形缓冲区,主库会记录自己写到的位置,从库则会记录自己已经读到的位置。
增量复制的流程: