跳转到主要内容

主动复制设置

设置您的副本节点以轻松接受读写操作#

KeyDB 支持主动复制(也称为“主主复制”)。这极大地简化了故障转移场景,因为副本不再需要被提升为活动主节点。此外,“主动复制”支持可用于在高写入场景下分摊负载。

工作原理#

默认情况下,KeyDB 的行为与 Redis 相同,只允许从主节点到副本节点的单向通信。新增了一个配置选项“active-replica”,当设置为 true 时,也意味着“replica-read-only no”。在此模式下,即使 KeyDB 与主节点的连接中断,它也会接受副本。它还允许循环连接,即两个节点互为主节点。

脑裂#

KeyDB 可以处理脑裂场景,即主节点之间的连接中断,但写入操作仍在继续。每次写入都会带上时间戳,当连接恢复时,每个主节点将共享其新数据。最新的写入将获胜。这可以防止旧数据覆盖在连接中断后写入的新数据。

启用步骤#

以下步骤假设有两台服务器,A 和 B。

  1. 两台服务器的配置文件中都必须有 "active-replica yes"
  2. 在服务器 B 上执行命令 "replicaof [A 地址][A 端口]"。服务器 B 将丢弃其数据库并加载服务器 A 的数据集
  3. 在服务器 A 上执行命令 "replicaof [B 地址][B 端口]"。服务器 A 将丢弃其数据库并加载服务器 B 的数据集(包括上一步刚刚传输的数据)
  4. 现在两台服务器将互相传播写入。您可以通过在服务器 A 上写入一个键并确保它在 B 上可见来测试这一点,反之亦然。

请在 YouTube 上观看我们的演示

技术实现#

在启动时,每个 KeyDB 实例都会计算一个动态 UUID。这个 UUID 不会被保存,只在进程的生命周期内存在。当一个副本连接到其主节点时,它会通知主节点自己的 UUID,主节点会回复自己的 UUID。通过比较 UUID,可以告知服务器两个客户端是否来自同一个 KeyDB 实例(IP 和端口不足以判断,因为同一台机器上可能有不同的进程)。UUID 用于防止将从某个主节点收到的更改再广播回给它(如果它同时也是我们的副本)。

增加了一个新的配置选项来启用此模式,启用后,即使 KeyDB 是一个副本,它也变为可写(默认情况下是禁用的)。除了防止查询在客户端之间无限循环弹跳的额外逻辑外,复制代码的执行方式与正常情况相同。

主动复制的大部分功能是在这次变更中实现的。

设置主动复制#

主动复制节点允许您对两个实例进行读写,这可以在高负载下增加读取量,并使您的备份/副本节点在故障情况下随时待命。设置非常简单,只需将您的代理服务器指向健康的实例即可。可以查看 HAProxy 部分的示例配置,这些配置可以启用健康检查和不同的路由配置(轮询、首选等)。设置代理服务器很简单,而 keydb 的配置如前所述,甚至更简单。一个示例配置文件

配置文件#

实例 A 的配置文件

# 假设已设置以下参数,并且此实例的 IP 地址是 10.0.0.2
port 6379
requirepass mypassword123
masterauth mypassword123
# 您需要配置以下内容
active-replica yes
replicaof 10.0.0.3 6379

实例 B 的配置文件

# 假设已设置以下参数,并且此实例的 IP 地址是 10.0.0.3
port 6379
requirepass mypassword123
masterauth mypassword123
# 您需要配置以下内容
active-replica yes
replicaof 10.0.0.2 6379

您也可以将此附加到配置文件中 keydb-server --active-replica yes --replicaof <ipaddress> <port>

测试主动复制#

您写入一个节点的任何命令都将在另一个节点上看到。如果一台服务器宕机,时间戳将确保您的副本在重新上线时不会覆盖较新的写入。这使您可以根据需要设置脚本、cron 等来自动重启失败的实例,而没有覆盖新数据的风险。在极高负载下,数据同步可能会有轻微延迟,但仍然非常低(几乎可以忽略不计)。