主动复制设置
#
设置您的副本节点以轻松接受读写操作KeyDB 支持主动复制(也称为“主主复制”)。这极大地简化了故障转移场景,因为副本不再需要被提升为活动主节点。此外,“主动复制”支持可用于在高写入场景下分摊负载。
#
工作原理默认情况下,KeyDB 的行为与 Redis 相同,只允许从主节点到副本节点的单向通信。新增了一个配置选项“active-replica”,当设置为 true 时,也意味着“replica-read-only no”。在此模式下,即使 KeyDB 与主节点的连接中断,它也会接受副本。它还允许循环连接,即两个节点互为主节点。
#
脑裂KeyDB 可以处理脑裂场景,即主节点之间的连接中断,但写入操作仍在继续。每次写入都会带上时间戳,当连接恢复时,每个主节点将共享其新数据。最新的写入将获胜。这可以防止旧数据覆盖在连接中断后写入的新数据。
#
启用步骤以下步骤假设有两台服务器,A 和 B。
- 两台服务器的配置文件中都必须有 "active-replica yes"
- 在服务器 B 上执行命令 "replicaof [A 地址][A 端口]"。服务器 B 将丢弃其数据库并加载服务器 A 的数据集
- 在服务器 A 上执行命令 "replicaof [B 地址][B 端口]"。服务器 A 将丢弃其数据库并加载服务器 B 的数据集(包括上一步刚刚传输的数据)
- 现在两台服务器将互相传播写入。您可以通过在服务器 A 上写入一个键并确保它在 B 上可见来测试这一点,反之亦然。
请在 YouTube 上观看我们的演示
#
技术实现在启动时,每个 KeyDB 实例都会计算一个动态 UUID。这个 UUID 不会被保存,只在进程的生命周期内存在。当一个副本连接到其主节点时,它会通知主节点自己的 UUID,主节点会回复自己的 UUID。通过比较 UUID,可以告知服务器两个客户端是否来自同一个 KeyDB 实例(IP 和端口不足以判断,因为同一台机器上可能有不同的进程)。UUID 用于防止将从某个主节点收到的更改再广播回给它(如果它同时也是我们的副本)。
增加了一个新的配置选项来启用此模式,启用后,即使 KeyDB 是一个副本,它也变为可写(默认情况下是禁用的)。除了防止查询在客户端之间无限循环弹跳的额外逻辑外,复制代码的执行方式与正常情况相同。
主动复制的大部分功能是在这次变更中实现的。
#
设置主动复制主动复制节点允许您对两个实例进行读写,这可以在高负载下增加读取量,并使您的备份/副本节点在故障情况下随时待命。设置非常简单,只需将您的代理服务器指向健康的实例即可。可以查看 HAProxy 部分的示例配置,这些配置可以启用健康检查和不同的路由配置(轮询、首选等)。设置代理服务器很简单,而 keydb 的配置如前所述,甚至更简单。一个示例配置文件
#
配置文件实例 A 的配置文件
实例 B 的配置文件
您也可以将此附加到配置文件中 keydb-server --active-replica yes --replicaof <ipaddress> <port>
#
测试主动复制您写入一个节点的任何命令都将在另一个节点上看到。如果一台服务器宕机,时间戳将确保您的副本在重新上线时不会覆盖较新的写入。这使您可以根据需要设置脚本、cron 等来自动重启失败的实例,而没有覆盖新数据的风险。在极高负载下,数据同步可能会有轻微延迟,但仍然非常低(几乎可以忽略不计)。