# 介绍

主从复制,可以通过 SLAVEOF 命令或 slaveof 选项设置主从服务器。

# 旧版复制功能的实现

  • 同步
  • 命令传播

# 同步

# 命令传播

完成同步操作后,后续的写操作同步命令传播的方式同步给从服务器。

# 旧版复制功能的缺陷

同步操作会在两种情况下执行:

  • 初次复制
  • 断线后复制

断线后复制也需要主服务器同步一个完整的 RDB 文件给从服务器,而不是断线期间的命令。这个过程会浪费主服务器的 CPU、内存、磁盘和网络,也会导致从服务器在载入的过程中不能相应命令请求,整个过程非常耗费资源。

# 新版复制功能的实现

支持完整同步和部分重同步。

# 部分重同步的实现

# 复制偏移量

主从服务器都有一个复制偏移量,主服务器发送之后更新偏移量,从服务器接受到之后更新偏移量。

# 复制积压缓冲区

有主服务器维护的一个固定长度先进先出队列,默认大小 1MB。写命令会同时写入缓冲区,当从服务器发出带有复制偏移量的 PSYNC 命令后,如果偏移量在缓冲区中就部分重同步,如果不在,就执行完整同步。

复制积压缓冲区大小 = second * write_size_per_second

# 服务器运行 ID

每个服务器都有一个 ID,为了区分是首次复制还是断线复制。

# PSYNC 命令的实现

# 复制的实现

  1. 设置主服务器的地址和端口
  2. 建立套接字连接
  3. 发送 PING 命令
  4. 身份验证
  5. 发送端口信息
  6. 发送 PSYNC 命令执行同步,之后主服务器也成为从服务器的客户端
  7. 命令传播

# 心跳检测

  • 检测主从服务器的网络连接状态
  • 辅助实现 min-slaves 配置选项
  • 检测命令丢失