Redis 的主从库同步的基本原理,总结来说,有三种模式:全量复制、基于长连接的命令传播,以及增量复制。
-
主从级联模式分担全量复制时的主库压力
-
一旦主从库完成了全量复制,它们之间就会一直维护一个网络连接,主库会通过这个连接将后续陆续收到的命令操作再同步给从库,这个过程也称为基于长连接的命令传播,可以避免频繁建立连接的开销
启用混合持久化模式后,主从同步过程
启用混合持久化模式后,主从同步过程在Redis中依然遵循其基本的复制原理,但细节上有一些特别的地方需要注意。混合持久化模式主要影响的是数据如何被持久化到磁盘上,而主从同步是关于如何在网络上复制数据状态。不过,启用混合持久化模式对于初始化同步过程和部分重同步过程确实有一定的影响。
初始化同步过程
当一个Redis从服务器首次连接到主服务器,或者需要进行全量复制时,会发生以下步骤:
- 同步请求:从服务器向主服务器发送同步请求。
- RDB文件发送:在传统的复制过程中,主服务器会执行
BGSAVE命令生成当前数据的RDB快照,并将这个RDB文件发送给从服务器。在混合持久化模式下,由于AOF文件已经包含了一个RDB格式的数据快照(即AOF重写时的前言部分),主服务器有可能直接使用当前的AOF文件来满足从服务器的全量复制请求,而不需要额外生成一个新的RDB文件。 - 缓存写命令:在生成RDB文件或准备AOF文件的过程中,主服务器会缓存所有新的写命令。
- 数据加载:从服务器接收到RDB文件后,会加载这个文件来构建自己的数据状态。如果是混合持久化模式下的AOF文件,从服务器同样会先加载AOF文件中的RDB部分。
- 处理缓存的写命令:一旦RDB文件加载完毕,从服务器会开始接收并应用主服务器在RDB文件生成期间缓存的所有写命令,以确保与主服务器的数据状态一致。
部分重同步过程
如果连接在短暂中断后恢复,且主服务器能够识别从服务器(通过复制积压缓冲区中的信息),则会进行部分重同步:
- 重同步请求:从服务器请求部分重同步。
- 积压缓冲区:主服务器会使用其复制积压缓冲区中的数据来满足从服务器的请求,发送自上次断开以来的所有写命令。
混合持久化模式的影响
- 数据传输效率:在混合持久化模式下,由于AOF文件已经包括了RDB快照,这可能减少了主从同步时需要传输的数据量,尤其是在AOF重写后不久发生全量复制的情况下。
- 快速启动:从服务器能够通过加载AOF文件中的RDB部分更快地完成初始数据状态的构建。