Redis 主从复制的原理

配置主从复制

  为了拓展 Redis 的读性能,通常我们可以为一个master实例增加一个或多个slave实例,这就是主从复制。另一方面,主从复制提供了数据冗余,这在一定程度上提高了 Redis 的可用性,例如,当master实例发生故障时,我们可以将其中一个slave实例提升为master,从而继续保证 Redis 的可用性。
  设置主从复制很简单,只需要在slave实例的配置文件加入一行,然后重启slave实例:

1
2
# /etc/redis/redis.conf
slaveof your_redis_master_ip 6379

主从复制的原理

  在设置好主从复制之后,一开始 slave 与 master 之间的数据是不同步的,为了让 slave 与 master 之间保存数据同步,slave 会发送一个 PSYNC 命令给 master。由于 slave 是初次连接上 master,所以 master 接收到 PSYNC 命令之后会执行完整重同步(full resynchronization),具体的过程是这样的:

  • 首先 master 会执行 BGSAVE 命令,在后台生成一个 RDB 文件,与此同时开辟一个缓冲区用于存储 client 发来的命令。
  • 当 BGSAVE 执行成功之后,master 会将这个 RDB 文件发送给 slave,slave 在接收到这个 RDB 文件之后会将它加载到内存。
  • 接着 master 会将缓冲区内的所有命令发送给 slave 去执行。

  主从复制时还可能出现另一种情况,譬如说,master 与 slave 之间已经保持同步了,但是由于网络状况不好,导致 master 与 slave 断开连接,一段时间之后网络变好了,slave 又重新连上 master,但此时 slave 已经与 master 不同步了。那么为了让 slave 与 master 继续保持同步,这时候它们会怎么做呢?

参考资料