学习

Redis 中的复制遵循简单的主从模型,复制方向为单向,即从主节点到单个或多个从节点。数据仅写入主节点实例,从节点保持同步以成为主节点的精确副本。

要创建从节点,您需要实例化一个 Redis 服务器实例,并将其配置指令 replicaof 设置为指向主节点的地址和端口。从节点实例启动并运行后,它将尝试与主节点同步。为了尽可能高效地传输所有数据,主节点实例将生成数据的压缩版本并保存到快照 (.rdb) 文件中,然后将其发送给从节点。

随后,从节点将读取快照文件并将其所有数据加载到内存中,这将使其达到主节点在创建 .rdb 文件时的状态。加载阶段完成后,主节点实例将发送自生成快照以来运行的所有写入命令的积压内容。最后,主节点实例将向从节点发送后续所有命令的实时流。

默认情况下,复制是异步的。这意味着如果您向 Redis 发送写入命令,您将首先收到确认响应,然后该命令才会复制到从节点。

如果主节点在确认写入后但在写入可以复制之前发生故障,则可能会导致数据丢失。为了避免这种情况,客户端可以使用 WAIT 命令。此命令会阻塞当前客户端,直到之前所有在此连接上发出的写入命令都成功传输并至少被指定数量的从节点确认。

例如,如果我们发送命令 WAIT 2 0,客户端将阻塞(不会向客户端返回响应),直到在该连接上发出的所有先前写入命令都写入至少 2 个从节点。第二个参数 0 将指示服务器无限期阻塞,但我们可以将其设置为一个数字(以毫秒为单位),以便它在一段时间后超时并返回成功确认命令的从节点数量。

从节点是只读的。这意味着您可以配置客户端从它们读取数据,但不能向它们写入数据。如果您需要额外的读取吞吐量,您可以配置 Redis 客户端从从节点以及主节点读取。但是,更常见的情况是直接横向扩展集群。这使您无需编写任何复杂的客户端逻辑即可扩展读取和写入。

此外,您还应该了解 Active-Active,这是 Redis Enterprise 和 Redis Cloud 的一项高级功能。 Active-Active 将整个数据库跨地理分布式集群进行复制。使用 Active-Active,您可以本地写入任何从属数据库,并且这些写入将在全球范围内反映。当您真正进行大规模扩展时,这一点值得注意!