Junhc

岂止于博客

Redis主从同步

1. 使用命令进行主从同步
// 如此 127.0.0.1:12345 服务器就会去复制 127.0.0.1:6379 的数据
127.0.0.1:12345> slaveof 127.0.0.1:6379
2. 完全同步
  • 从服务器向主服务器发送sync命令
  • 主服务器收到sync命令后,执行bgsave命令,用来生成RDB文件,并在一个缓冲区中记录从现在开始执行的写命令
  • 发送RDB文件给从服务器
  • 发送缓冲区记录的写命令给从服务器

3. 部分同步
  • 执行复制的主从服务器都会分别维护各自的复制偏移量

    主服务器每次向从服务器传播 n 个字节数据时,都会将自己的复制偏移量加 n
    从服务器接受主服务器传来的数据时,也会将自己的复制偏移量加 n

  • 复制积压缓冲区是一个固定长度,先进先出的队列,默认 1MB

    当主服务器进行命令传播时,不仅会将命令发送给从服务器,还会发送给这个缓冲区
    当从服务器向主服务器发送 psync 命令时,还需要将自己的复制偏移量带上,
    主服务器就可以通过这个复制偏移量和复制积压缓冲区的偏移量进行对比
    若复制积压缓冲区存在从服务器的复制偏移量 + 1 后的数据,则进行部分重同步,否则进行完整重同步

  • run id

    运行 id 是在进行初次复制时,主服务器将会将自己的运行 id 发送给从服务器,让其保存起来
    当从服务器断线重连后,从服务器会将这个运行 id 发送给刚连接上的主服务器
    若当前服务器的运行 id 与之相同,说明从服务器断线前复制的服务器就是当前服务器,
    主服务器可以尝试执行部分同步;若不同则说明从服务器断线前复制的服务器不是当前服务器,主服务器直接执行完全同步

  • 心跳检测

    当完成了同步之后,主从服务器就会进入命令传播阶段,此时从服务器会以每秒 1 次的频率,
    向主服务器发送命令:REPLCONF ACK <replication_offset> 其中 replication_offset 是从服务器当前的复制偏移量