Redis 主从复制是怎样进行的?断线重连后怎样避免全量复制?
先自己想一想,再看参考要点
参考要点
- 用 REPLICAOF 命令让一个服务器成为另一个服务器的从服务器,一个从服务器只能有一个主服务器
- 第一次连接时全量复制:从服务器发送 PSYNC,主服务器 fork 子进程生成 RDB 快照发给从服务器(7.0 起默认不写磁盘、直接通过网络发送),期间新的写命令记在缓冲区,从服务器载入快照后再执行,之后主服务器每执行一条写命令就发给从服务器
- 主服务器把最近发出的写命令保存在复制积压缓冲区(默认 1 MB)中,并给复制流中的每个字节编号,称为偏移量,从服务器重连时带上复制 ID 和需要的下一个偏移量,复制 ID 一致且偏移量还在缓冲区中,就只发送缺少的部分(部分重同步),否则重新全量复制
- 积压缓冲区可以按“最长断线时间 × 每秒写入的字节数”估算,例如每秒写入 1 MB、要容忍 60 秒断线,至少设为 60 MB