Redis 主从架构之原理篇(二)

79 阅读2分钟

「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。

上文中引出的全量同步和增量量同步到底是什么呢?我们顺着往下看!

全量同步

  1. replica 连接 master,发送 PSYNC 命令;
  2. master 执行 bgsave 开启一个后台保存进程,以便于生产一个 RDB 文件。同时它开始缓冲所有从客户端接收到的新的写入命令。
  3. 当后台保存完成时, master 将数据集文件传输给所有的 replica,并在发送期间继续记录被执行的写命令;
  4. replica 收到 RDB 文件之后,丢弃所有的旧数据,然后加载新文件到内存;
  5. replica 加载完成后,通知 master 发送所有缓冲的命令给 replica,这个过程以指令流的形式完成并且和 Redis 协议本身的格式相同;
  6. replica 开始接收命令请求,并执行来自 master 缓冲区的写命令。

注意:SYNC 是一个旧协议,在新的 Redis 中已经不再被使用,但是仍然向后兼容。因为它不允许部分重同步,所以现在 PSYNC 被用来替代 SYNC。

正常情况下,一个全量重同步要求在磁盘上创建一个 RDB 文件,然后将它从磁盘加载进内存,然后 replica 以此进行数据同步。如果磁盘性能很低的话,这对 master 是一个压力很大的操作。Redis 2.8.18 是第一个支持无磁盘复制的版本。在此设置中,子进程直接发送 RDB 文件给 replica 的 sockets 中,无需使用磁盘作为中间储存介质。

增量同步

master 把命令发送给所有的 replica 的同时,还会将命令写入 backlog 缓冲区里面。

当 replica 与 master 断开连接又重新连接之后,此时要判断 replica 的偏移量与 master 的偏移量的差集有没有超过 backlog 的大小,

  • 如果没有则给 replica 发送 CONTINUE,等待 master 将 backlog 中的数据发送给 replica;
  • 如果超过了则返回 FULLRESYNC runid offset,replica 将 runid 保存起来,并进行全量同步;

最后我们来聊几个在面试过程中经常提到的相关问题。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!