是什么?
从一个Redis实例(主节点)将数据复制到其他Redis实例(从节点),从节点数据与主节点数据保存同步。
复制的流程
- 从节点向主节点发起同步命令
psync ? -1 - 全量复制,主节点会将数据快照RDB文件发给从节点
- 主节点收到命令后,发现runId没有值,判断是全量复制,返回full sync,并带上主服务器的runId和当前复制进度,从服务器会存储这两个值
- 主节点执行bgsave,生成RDB文件,生成过程中新操作会存储到replication buffer中,生成完毕发送给从节点,从节点清空数据,加载RDB数据
- 从节点将RDB文件加载完后,主节点将replication buffer缓存的数据发送给从节点,从节点执行命令
- 全量复制完,会保持一个长连接,主节点会将这个连接后续的写操作传递给从节点,用来保证数据一致

增量同步
由于网络可能不稳定,主节点有部分操作没有发送给从节点,如果再来一次全量同步会非常耗时,主节点其实只需要把断开连接期间的数据同步给从节点。
repl_backlog_buffer 是一个环形缓冲区,默认1m。增量同步也是psync命令,主节点会将命令存储存储到这个缓冲区中,然后根据从节点的runId判断,如果runId一致,并且根据offset判断数据在repl_backlog_buffer 中,则可以进行增量同步。repl_backlog_buffer 将对应的命令写到replication buffer中发给从节点去执行。

