Redis 中的复制遵循简单的主副本模型,其中复制单向进行 - 从主节点到一个或多个副本。数据仅写入主实例,副本保持同步,以便它们成为主节点的精确副本。
要创建副本,您需要使用配置指令 **replicaof** 实例化 Redis 服务器实例,该指令设置为主实例的地址和端口。副本实例启动并运行后,副本将尝试与主节点同步。为了尽可能高效地传输所有数据,主实例将生成数据的压缩版本,并将其保存在快照(.rdb)文件中,然后将其发送到副本。
然后,副本将读取快照文件并将所有数据加载到内存中,这将使其处于创建 .rdb 文件时主实例所处的相同状态。加载阶段完成后,主实例将发送自创建快照以来运行的所有写入命令的积压。最后,主实例将向副本发送所有后续命令的实时流。
默认情况下,复制是异步的。这意味着如果您向 Redis 发送写入命令,您将首先收到确认响应,然后命令才会复制到副本。
如果主节点在确认写入但写入尚未复制到副本之前出现故障,则可能会丢失数据。为了避免这种情况,客户端可以使用 **WAIT** 命令。此命令将阻塞当前客户端,直到所有先前的写入命令成功传输并由至少指定数量的副本确认。
例如,如果我们发送命令 **WAIT 2 0**,客户端将被阻塞(不会向客户端返回响应),直到该连接上发出所有先前的写入命令都已写入至少 2 个副本。第二个参数 - 0 - 将指示服务器无限期地阻塞,但我们可以将其设置为一个数字(以毫秒为单位),以便它在一段时间后超时并返回成功确认命令的副本数量。
副本是只读的。这意味着您可以配置您的客户端从它们读取数据,但不能向它们写入数据。如果您需要额外的读取吞吐量,您可以配置您的 Redis 客户端从副本以及主节点读取数据。但是,通常更容易扩展您的集群。这使您无需编写任何复杂的客户端逻辑即可扩展读取和写入操作。
另外,您应该了解 **Active-Active**,这是 Redis Enterprise 和 Redis Cloud 的一项高级功能。 **Active-Active** 在跨地理分布的集群之间复制整个数据库。使用 **Active-Active**,您可以本地写入任何副本数据库,这些写入将反映在全球范围内。当您真正扩展时需要注意的一件事!