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

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

前边我们已经讲解了 redis 的相关配置,接下来我们把上边提到的概念串起来,聊一下主从复制的相关原理。

系统的运行依靠三个主要的机制

  • 当一个 master 实例和一个 replica 实例连接正常时, master 会发送一连串的命令流来保持对 replica 的更新,以便于将自身数据集的改变复制给 replica ,包括客户端的写入、key 的过期或被逐出等等。
  • 当 master 和 replica 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, replica 重新连接上 master 并会尝试进行部分重同步。这意味着它会尝试只获取在断开连接期间内丢失的命令流。
  • 当无法进行部分重同步时, replica 会请求进行全量重同步。这会涉及到一个更复杂的过程,例如 master 需要创建所有数据的快照,将之发送给 replica ,之后在数据集更改时持续发送命令流到 replica 。

Redis 复制功能是如何工作的

每一个 Redis master 都有一个 replication ID :这是一个较大的伪随机字符串,标记了一个给定的数据集。每个 master 也持有一个偏移量,master 将自己产生的复制流发送给 replica 时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新 replica 的状态。

复制偏移量即使在没有一个 replica 连接到 master 时,也会自增,所以基本上每一对给定的 Replication ID, offset 都会标识一个 master 数据集的确切版本。

当 replica 连接到 master 时,它使用 PSYNC 命令来发送它记录的旧的 master replication ID 和它至今为止处理的偏移量。通过这种方式, master 能够仅发送 replica 所需的增量部分。但是如果 master 的缓冲区中没有足够的 backlog 或者 replica 引用了 master 不知道的历史记录(replication ID),则会转而进行一个全量重同步:在这种情况下, replica 会得到一个完整的数据集副本,从头开始。

说到这儿,那什么是全量同步,那什么又是增量同步呢?我们在下文中讲解。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!

猜你喜欢

转载自juejin.im/post/7033576441258180638