从 Redis Cluster 迁移

为每个源端主节点建立复制流,将稳定的 Redis Cluster 数据集汇入独立 Lavik。

选择目标拓扑

使用全新的独立 Lavik 目标实例,并确保磁盘和内存容量充足。连接源端可能替换目标数据。不要使用 Meta 管理或 --cluster-enabled 目标:beta.1 在此模式下拒绝 Redis 复制。备份源数据,并在生产切换之前演练完整迁移。

此流程将源分片汇入一个独立 Lavik 实例,不保留 Redis Cluster 节点 ID,也不会将目标变成 Meta 管理的 Lavik 集群。切换时为新地址配置独立模式客户端。如需 Meta 管理的目标,应规划独立的应用级数据转移,将数据写入新建的 Lavik 拓扑。

beta.1 导入 RDB 版本 1–11,逻辑数据库范围为 0–15。较新的 Redis 版本或不支持的编码可能阻止全量同步。自描述的 Module 2 及 Function 库记录可能在警告后被跳过;较早或未知格式可能被拒绝。请单独盘点,并仅重建 Lavik 支持的功能。不支持的增量命令会停止复制。核对命令、脚本、TTL、ACL 需求及客户端设置。使用带长度的全量同步流:通过正常配置流程,在每个 Redis 源端配置 repl-diskless-sync no。与源端负责人协调此变更,并预留 RDB 磁盘空间和 fork 开销。

固定槽位布局

从 CLUSTER NODES 盘点每个持有槽的主节点,要求完整且不重叠地覆盖 0–16383 槽。开始之前解决故障及 migrating/importing 状态。在迁移窗口暂停重分片和自动扩缩容。保持完全相同槽集合的主节点故障切换可被发现;槽布局变化不会自动合并,可能停止所有源会话。恢复稳定布局,并重新连接全部所需主节点后再继续。

连接每个主节点

命令示例用于可信私有网络、无认证的演练环境。将 LAVIK_HOST、LAVIK_PORT、REDIS_HOST、REDIS_PORT 设置为实际地址。Lavik 必须能直接访问 Redis;localhost 指 Lavik 自己的主机或容器。连接已启用认证的源端之前,先配置上游凭据和 TLS;不要把密码放在复制的终端命令中,也不要公开暴露无认证实例。

以下示例有三个源端主节点。另行定义 REDIS_HOST_2 / REDIS_PORT_2 及 REDIS_HOST_3 / REDIS_PORT_3;更多主节点需继续执行 ADDREPLICAOF。所有主节点须公布可达地址及相同的固定槽布局。全部持槽主节点注册并同步完成之前,目标保持 LOADING。不要连接副本或槽集合重叠的源端。

attach-cluster.sh

Linux · bash
# Begin with one slot-owning Redis primary; never use a replica endpoint.
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" REPLICAOF "$REDIS_HOST" "$REDIS_PORT"
# Repeat ADDREPLICAOF for EVERY remaining slot-owning primary.
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" ADDREPLICAOF "$REDIS_HOST_2" "$REDIS_PORT_2"
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" ADDREPLICAOF "$REDIS_HOST_3" "$REDIS_PORT_3"
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" INFO replication

检查 INFO replication 的每个源端条目,并验证来自每个源主节点的键。仅检查总体连接状态或成功读取一个键是不够的。Lavik 重启后,应重放完整的源端连接顺序;运行时新增源端及 Redis 复制游标不会持久化。

追平与切换

OK 只确认角色变更,不表示复制完成。保持连接,直到初始同步完成且正常读取可用。暂停所有源端写入,包括定时任务。暂停写入后,记录每个源端的复制偏移量,识别 Lavik 副本连接,并确认其 ACK 达到所记录的位点。复制 PING 和过期流量可能继续推进偏移量。核对代表性值、数据类型、键数量和 TTL。集群的每个主节点都需独立检查。不要在 LOADING 期间脱离:不完整的加载可能被丢弃。流失败或缺少任何数据类型时,继续以源端为准,解决问题后再切换。

detach.sh

Linux · bash
# Only after source writers are paused and all source streams are caught up.
# Never detach a target that is still LOADING or incompletely synchronized.
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" REPLICAOF NO ONE
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" ROLE
# Runtime attachment turns Tomb Raider off. Re-enable its cleanup schedule.
redis-cli -h "$LAVIK_HOST" -p "$LAVIK_PORT" TOMBRAIDER INTERVAL 1000

ROLE 返回 master 后,将应用切换到 Lavik 地址,并在 Lavik 恢复写入。全面恢复流量之前,先运行少量应用读写检查。保持 Redis 禁写。只有在 Lavik 尚未接收新写入之前,回滚才只是路由切换;之后若要返回 Redis,必须先对账或重放新增写入。REPLICAOF 不是双向迁移,也不保证零数据丢失。