Redis之主从复制
在redis中用户可以通过slaveof命令 让一个服务器成为另一个服务器的从服务器
旧版复制功能
旧版Redis复制功能分为两步:同步和命令传播
同步
1.从服务器向主服务器发送sync命令
2.主服务器收到sync命令执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令
3.当主服务器的BGSAVE命令执行完毕后,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接受并载入这个RDB文件,并将自己的数据库状态更新至主服务器发送BGSAVE指令时的状态
4.主服务器发送缓冲区的写命令给从服务器,从服务器执行这些写命令,将自己的服务器状态更新至主服务器现在的状态
命令传播
在同步后,主服务器和从服务器的状态保持一致。
之后,主服务器每次执行修改命令,会将命令发送给从服务器。
旧版复制功能的缺陷
在Redis2.8之前,当处于命令传播阶段的从服务器与主服务器断线后,重连需要重新执行同步命令。
这浪费了大量的时间,实际上从服务器只需要执行从断线到重连过程中的主服务器执行过的修改命令即可。
于是有个新版复制功能
新版复制功能
新版复制功能与旧版复制功能主要在命令传播时的断线重连阶段不同。
新版复制功能使用PSYNC代替SYNC
当断线重连后,PSYNC采用部分重同步
在部分重同步中,主服务器和从服务器会分别维护一个复制偏移量,每当主服务器发送N个字节给重服务器,就将自己的复制偏移量+N,每当从服务器收到N个字节的数据,就将自己的复制偏移量+N。
当断线重连后,只需要根据主从服务器的复制偏移量就知道双方差多少字节的命令。
同时主服务器会维持一个复制积压缓冲区(固定长度的队列),当主服务器执行命令传播时,它会同时将命令写入复制积压缓冲区,主服务器会根据主从服务器之间的复制偏移量差值从复制挤压缓冲区中发送命令(需要注意,如果主从服务器复制偏移量差的比较多,而复制积压缓冲区没有存那么多的命令,还是会执行同步操作)