reids在2.8版本增加了部分复制功能,在一些场景中代替了全量复制,提高了复制的效率。
1、全量复制
1)slave向master发送SYNC命令,master执行BGSAVE命令生成RDB文件。
2)master将生成的RDB文件发送给slave。
3)slave载入RDB文件到内存。
4)master将执行SYNC命令之后收到写命令记录到缓存中,并将这些命令发送给slave。
可以看出,全量复制会消耗大量的CPU,内存,磁盘IO,网络资源,因而应该尽量减少使用全量复制。
2、部分复制
部分复制主要在内存中缓存了一些最近的复制命令,当出现网络问题时,slave重新连接上master的时候,master会根据slave发送的复制偏移量来决定是进行部分复制还是全量复制。
1)复制偏移量
master向slave传播命令的时候会更新自己的偏移量,slave在收到命令后也会更新自己的偏移量。
2)复制缓冲区
master会维护一个固定长度的FIFO队列,默认大小是1M,当master进行命令传播后会将这个命令加入到复制缓冲区中。
3)服务器运行ID
每个redis服务启动时会自动生成一个40位的ID,slave断线重新连接上master开始复制时会发送这个ID,master根据这个ID判断是否是自己,如果不是自己则也需要进行全量复制。