# 介绍
主从复制,可以通过 SLAVEOF 命令或 slaveof 选项设置主从服务器。
# 旧版复制功能的实现
- 同步
- 命令传播
# 同步
# 命令传播
完成同步操作后,后续的写操作同步命令传播的方式同步给从服务器。
# 旧版复制功能的缺陷
同步操作会在两种情况下执行:
- 初次复制
- 断线后复制
断线后复制也需要主服务器同步一个完整的 RDB 文件给从服务器,而不是断线期间的命令。这个过程会浪费主服务器的 CPU、内存、磁盘和网络,也会导致从服务器在载入的过程中不能相应命令请求,整个过程非常耗费资源。
# 新版复制功能的实现
支持完整同步和部分重同步。
# 部分重同步的实现
# 复制偏移量
主从服务器都有一个复制偏移量,主服务器发送之后更新偏移量,从服务器接受到之后更新偏移量。
# 复制积压缓冲区
有主服务器维护的一个固定长度先进先出队列,默认大小 1MB。写命令会同时写入缓冲区,当从服务器发出带有复制偏移量的 PSYNC 命令后,如果偏移量在缓冲区中就部分重同步,如果不在,就执行完整同步。
复制积压缓冲区大小 = second * write_size_per_second
# 服务器运行 ID
每个服务器都有一个 ID,为了区分是首次复制还是断线复制。
# PSYNC 命令的实现
# 复制的实现
- 设置主服务器的地址和端口
- 建立套接字连接
- 发送 PING 命令
- 身份验证
- 发送端口信息
- 发送 PSYNC 命令执行同步,之后主服务器也成为从服务器的客户端
- 命令传播
# 心跳检测
- 检测主从服务器的网络连接状态
- 辅助实现 min-slaves 配置选项
- 检测命令丢失