目录
64.增量复制如果在网络断开期间,repl_backlog_size环形缓冲区写满以后,从库是会丢失掉那部分被覆盖的数据,还是直接进行全量复制呢?
61.Redis全量复制的三个阶段?
第一阶段是主从库间建立连接,协商同步的过程,主要是为全量复制做准备。在这一步,从库和主库建立起链接,并告诉主库即将进行同步,主库确认回复后,主从库间就可以开始同步了。
具体来说,从库给主库发送psync命令,表示要进行数据同步,主库根据这个命令的参数来启动复制。psync命令包含了主库的runId和复制进度offset两个参数。runId,是每一个Redis实例启动时都会自动生成的一个随机ID,用来唯一标记这个实例。当从库和主库第一次复制时,因为不知道主库的runId,所以将runId设置为“?”。
offset,此时设为-1,表示第一次复制。主库收到psync命令后,会用fullresync相应命令带上两个参数:主库runid和主库目前的复制进度offset,返回给从库。从库收到相应后,会记录下这两个参数。这里有个地方需要注意,FULLRESYC响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库。
第二阶段,主库将所有数据同步给从库。从库收到数据后,在本地完成数据加载。这个过程依赖于内存快照生辰的RDB文件。
具体来说,主库执行bgsave命令,生成RDB文件,接着将文件发送给从库。从库接收到RDB文件后,会先清空当前数据库,然后加载RDB文件。这是因为从库在通过replicaAOF命令开始个主库同步前,可能保存了其他数据。为了避免之前数据的影响,从库需要先把当前数据库清空。在主库将数据同步给从库的过程中,主库不会被阻塞,仍然可以正常接收请求。否则,Redis的服务就被中断了。但是,这些请求中的写操作并没有记录到刚刚生成的RDB文件中。为了保证主从库的数据一致性,主库会在内存中用专门的replication buffer,记录RDB文件生成后收到的所有写操作。
第三个阶段,主库会把第二阶段执行过程中新收到的写命令,再发送给从库。