Redis 复制
有关 redis 复制有以下几个概念需要明确:
- 完全复制:当从服务器第一次启动同步主服务器或者从服务器断连后,但是发送的 offset 不在主服务器的复制积压缓冲区中,则会进行完全复制。完全复制并不会阻塞主服务器,主服务器发送 FULLRESYNC 告知从服务器执行完全同步,主服务器执行 BGSAVE 命令,后台开启线程生成RDB文件,同时将客户端发送过来的写命令保存到写缓冲区中。RDB文件生成后,将文件发送到从服务器,从服务器执行数据同步,此时从服务器无法接受请求。数据同步后,主服务器将写缓冲区中的内容发送到从服务器。此时主从完成数据同步。
- 部分复制:也叫断点续传。从服务器断连后,发送 PSYNC 命令,主服务器发现 offset + 1 在复制积压缓冲区中,此时将积压的写命令发送给从服务器;
- 同步:从服务器第一次或者断连后重新连接主服务器,要执行数据同步;
- 命令传播:没有断连的情况下,主服务器接受到写命令,执行后,异步发送给从服务器完成数据同步;
- 复制积压缓冲区:主服务器将数据复制给从服务器的时候,还会将写命令复制到复制积压缓冲区,用于实现部分重同步 repl-backlog-size ;
- 心跳检测:从服务器默认每隔 1 s 向主服务器发送 REPLCONF ACK 。