v2 → v3 离线迁移
跟着一个单节点集群实例,完成冷备、填写计划、执行迁移、启动验证和正式切换。
按五步迁入全新 v3 单节点集群。多节点、插件或兼容问题先查迁移参考。
本次实战用什么环境
本例来源为原版 v2.2.5-20260422(节点 1001、DB 分片 8);迁移机同时运行目标 v3(节点 1)。实际值按旧部署修改,不包含插件与外部集成。
- 全部来源停写、停机;目标为全新空集群。 v3 不能直接打开 v2 目录,不支持在线增量迁移。
wkcli与wukongim使用配套版本,核对交付摘要;其他版本、自定义构建和所需能力先评估。- 先隔离演练,测量完整冷备、工作空间、归档、目标副本与启动前快照的峰值空间和完整耗时。
完整环境、示例取值与准备条件
本文用一个具体例子,把原 v2 的用户、凭据、会话和消息迁入全新 v3 单节点集群。按顺序操作:备份 → 写计划 → 跑迁移 → 启动验收 → 切换。
多节点集群请使用迁移参考中的三节点计划,列全所有来源节点,在一台迁移机统一执行;不要按本例只取一个节点的数据。
下面假设你有一台独立的 Linux 迁移机,迁移完成后也在这台机器上启动 v3。示例不包含插件和外部集成,先在隔离环境演练。
| 项目 | 本例取值 |
|---|---|
| 原 v2 | 原版 v2.2.5-20260422,单节点集群,节点 ID 为 1001 |
| 原业务 DB 分片数 | 8,请按旧配置中的实际值修改 |
| 已停机的 v2 服务器 | SSH 主机名 v2-a,完整数据目录 /opt/wukongim/data |
| 迁移机上的冷备目录 | /srv/v2-snapshots/node1001/data |
| 本次迁移工作目录 | /srv/wkmigrate,必须是新目录 |
| 目标 v3 | 节点 ID 为 1,RPC 地址 127.0.0.1:7001 |
| 目标数据目录 | /srv/wkmigrate/targets/node1,由迁移工具创建 |
你需要把 v2 主机名、原数据目录、节点 ID、分片数换成实际值。其余路径可以沿用本例;以下命令在迁移机有权写入 /srv 的 Bash 终端中执行。
开始前确认三件事:
- 来源已完整停机,目标是全新空集群。 v3 不能直接打开 v2 数据目录,也不支持在线增量迁移。
- 按 wkcli 安装说明准备同一版本的
wkcli和wukongim,并核对交付摘要。当前文档版本为v3.0.0-beta.24。其他 v2 版本、自定义构建、有插件或外部集成的部署,先查兼容性要求。 - 磁盘要同时容纳完整冷备、工作空间、归档、目标数据和验收前快照。先演练测量峰值空间和完整耗时,再确定正式停机窗口。
1. 取一份完整冷备
停止写入口,等待日志应用、拓扑变更和通知队列排空,再正常停止 v2、关闭自动拉起。复制完整目录与隐藏文件,保留原程序、配置和环境变量;不能复制运行中的库。
成功标志: rsync 校验退出码 0,无文件差异;-n 仅检查,不删除。演练后若恢复 v2 写入,正式迁移必须重新取最新冷备并使用新工作目录。
复制冷备、校验命令与演练规则
先在原部署停止业务写入口,等待日志应用、拓扑变更和通知队列排空,再正常停止 v2 并关闭自动拉起。保留旧程序、配置和环境变量。下面复制的是已经停止变化的数据目录,不能对运行中的库直接复制。
在迁移机执行:
umask 077
mkdir -p /srv/v2-snapshots/node1001/data
rsync -a --numeric-ids --partial \
root@v2-a:/opt/wukongim/data/ /srv/v2-snapshots/node1001/data/复制成功后,再校验一次:
rsync -anc --numeric-ids --delete --itemize-changes \
root@v2-a:/opt/wukongim/data/ /srv/v2-snapshots/node1001/data/通过标准:退出码为 0,且没有文件差异输出。 这里的 -n 表示只检查,不会删除文件。路径末尾的 / 要保留;不要只复制消息文件或漏掉隐藏文件。已有完整冷备时,直接从冷备位置复制即可,不需要重启 v2。
演练取完冷备后可以恢复原 v2 业务。正式切换时必须再次停写、停机,取得最新冷备,用新的工作目录重做后续步骤;演练期间新增的数据不会自动补进旧迁移结果。
2. 保存迁移计划
两程序的 version、commit、build_source 必须一致。计划路径为迁移机上的绝对路径,源、工作空间、归档与目标互不包含。
成功标志: 新工作目录中的 plan.json 已保存;目标 targets/node1 尚不存在。示例为 12 个逻辑 Slot Raft Group、256 个物理哈希槽、1 副本,与启动配置一致。source_commit 选择读取规则,不能声明任意旧库兼容;默认不启用去重、丢弃或重新编号。
工具检查、目录命令与单节点 plan.json
先检查工具并创建本次工作目录:
wkcli version --output json
wukongim version --output json两个程序的 version、commit、build_source 必须一致。确认后执行;如果 /srv/wkmigrate 已存在,换一个新路径并同步修改下文路径,不要覆盖上次结果。
mkdir /srv/wkmigrate && mkdir -p /srv/wkmigrate/{reports,work,targets}将下面内容保存为 /srv/wkmigrate/plan.json,修改来源节点、分片数和本次创建时间:
{
"version": 1,
"source_commit": "a888f89533d0e7d1b2030e06504ca97f1ad891d4",
"sources": [
{"node_id": 1001, "data_dir": "/srv/v2-snapshots/node1001/data", "shard_count": 8}
],
"target": {
"cluster_id": "migration-v3-new",
"created_at": "2026-09-12T00:00:00Z",
"slot_count": 12,
"hash_slot_count": 256,
"replicas": 1,
"channel_replicas": 1,
"nodes": [
{"node_id": 1, "addr": "127.0.0.1:7001", "data_dir": "/srv/wkmigrate/targets/node1"}
]
}
}source_commit 是工具支持的 v2 读取规则,保持此值,不是填你猜测的镜像版本。目标使用 12 个逻辑 Slot Raft Group、256 个物理哈希槽和 1 副本。所有路径都是迁移机上的绝对路径,互不包含;不要提前创建 targets/node1。
这份计划不启用去重、排除 CMD/流消息或重新编号。遇到兼容性阻塞,按文末说明处理,不要为了通过检查直接套用数据丢弃策略。
3. 执行迁移,看到 offline_verified
v3 保持停机;在一台迁移机依次执行四阶段,失败立即停止并查看对应报告。
成功标志: 四阶段退出码均为 0,最终报告为 offline_verified。cutover_ready: false 是正常的:还需启动与业务验收。保留冷备、归档、计划和全部报告。
展开并执行:四阶段完整命令与报告标准
保持 v3 停机,在迁移机一次执行下面的命令块。某一步失败会立即停止,报告保存在 reports 目录中。
(
set -e
umask 077
wkcli migrate prepare --plan /srv/wkmigrate/plan.json \
--workspace /srv/wkmigrate/work/prepare \
> /srv/wkmigrate/reports/prepare.json 2> /srv/wkmigrate/reports/prepare.stderr
wkcli migrate export --plan /srv/wkmigrate/plan.json \
--workspace /srv/wkmigrate/work/prepare --archive /srv/wkmigrate/source-archive \
> /srv/wkmigrate/reports/export.json 2> /srv/wkmigrate/reports/export.stderr
wkcli migrate import --plan /srv/wkmigrate/plan.json \
--workspace /srv/wkmigrate/work/import --archive /srv/wkmigrate/source-archive \
> /srv/wkmigrate/reports/import.json 2> /srv/wkmigrate/reports/import.stderr
wkcli migrate verify --plan /srv/wkmigrate/plan.json \
--workspace /srv/wkmigrate/work/verify --archive /srv/wkmigrate/source-archive \
> /srv/wkmigrate/reports/verify.json 2> /srv/wkmigrate/reports/verify.stderr
cat /srv/wkmigrate/reports/verify.json
)| 阶段 | 做什么 | 通过标准 |
|---|---|---|
prepare | 检查冷备并准备转换 | 退出码 0,报告为 prepared |
export | 将源数据封存为归档 | 退出码 0,归档生成 COMPLETE |
import | 生成 v3 数据目录 | 退出码 0,报告为 imported |
verify | 从原始归档独立核对目标数据 | 退出码 0,报告为 offline_verified |
cutover_ready: false 是正常的:离线数据已经验证,接下来还要启动服务和验证业务。保留冷备、归档、计划和所有报告。
4. 启动 v3,验证真实业务
首次启动会改变库,先保存已校验、从未启动过的完整目标快照。配置与计划一致,保留生成的密钥,检查 WK_ 覆盖;保持 gateway.token_auth_on=true,原 v2 白名单开关需单独适配。
成功标志: /readyz 返回 200 且 ready: true,再验证原 UID/Token 与相同 device_flag 登录(错误 Token 拒绝,不覆盖原凭据)、早期/最近/跨页历史与已读未读、新消息序号与重试去重,以及重启后数据。插件和外部集成另行验收。
写入测试用隔离演练副本,生产目标在切换前无业务写入。已启动目录不能作为初始导入状态再 verify,也不能再次 import 覆盖。
快照、配置、启动命令与完整业务验收
首次启动会改变数据库。先保存一份校验通过且从未启动过的目标快照;在本例中,确认快照路径不存在后执行:
test ! -e /srv/wkmigrate/targets-before-start && \
cp -a /srv/wkmigrate/targets /srv/wkmigrate/targets-before-start && \
wukongim config init --config /srv/wkmigrate/wukongim.toml确认快照复制成功,并保存初始化时显示的管理员密码。编辑生成的 wukongim.toml,修改以下两处,保留其余配置及生成的密钥:
| 配置位置 | 改为 |
|---|---|
[node] 的 data_dir | "/srv/wkmigrate/targets/node1" |
[cluster] 的 id | "migration-v3-new" |
同时核对生成值与计划一致:node.id=1,cluster.listen_addr="127.0.0.1:7001",cluster.nodes=[{id=1,addr="127.0.0.1:7001"}],initial_slot_count=12、hash_slot_count=256、slot_replica_n=1、channel_replica_n=1。保留 gateway.token_auth_on=true。若原 v2 的 whitelistOffOfPerson=false,还需设置 message.person_whitelist_enabled=true。
确认没有遗留的 WK_ 环境变量覆盖这些值,然后校验并前台启动:
wukongim config validate --config /srv/wkmigrate/wukongim.toml && \
wukongim -config /srv/wkmigrate/wukongim.toml保持这个终端运行,在迁移机另开一个终端检查:
curl --fail http://127.0.0.1:5001/readyz/readyz 成功后,用你自己的客户端或 Chat Demo验证下面四项。默认仅监听回环地址;远程访问可按 Linux 部署使用 SSH 转发。
- **能登录:**用原 UID、原 Token 和相同
device_flag登录,错误 Token 应被拒绝;不要重新注册账号覆盖原凭据。 - **旧数据正确:**检查单聊和群聊的早期、最近及跨页消息,核对正文、消息 ID、序号、会话列表、已读和未读状态。
- **能继续收发:**在隔离演练数据上发新消息,确认接收、未读数和重试去重正确,新序号大于原频道当前尾部。
- **重启后还在:**正常停止并重新启动 v3,再次检查历史、新消息和未读状态。
本例的写入验收用于演练。正式迁移也要完成验收,但写入测试应使用隔离副本;生产目标在切换前保持无业务写入。已启动的目录不能再作为初始导入状态执行 verify,也不能再次 import 覆盖。
5. 正式切换
保持 v2 停写;由服务管理器运行使用已验证配置和同一目录的 v3。完成全部验收后才切换业务后端及客户端路由。重新编号时先处理草稿和未发送消息、保留登录凭据,再处理旧缓存与同步游标;工具不会自动清理客户端缓存。
成功标志: 同一业务只有一套集群接收写入。
- v3 尚未接收新生产写入:可关闭新入口,按演练流程恢复原 v2 数据、程序与路由。
- v3 已接收新生产写入:不能直接切回旧 v2,否则丢失新数据;没有 v3 → v2 反向增量迁移。
完整正式切换与回退边界
完成演练后,在正式停机窗口使用最新完整冷备和新的工作目录重做迁移,完成离线校验及运行、客户端验收。保持原 v2 停写,将 v3 按 Linux 部署交给服务管理器运行,确认它使用已校验的配置和同一数据目录,再把业务后端与客户端的连接/路由入口指向 v3,逐步恢复流量。
如果使用了参考页中的重新编号策略,切换时还要处理客户端历史缓存和同步游标,保留登录凭据,并先安置未发送消息及草稿。工具不会自动清理客户端缓存。
v2 与 v3 不得同时接收同一业务的写入。 v3 接收新生产写入之前,可以关闭 v3 入口,按演练流程恢复原 v2 数据、程序及路由;之后不能直接切回旧 v2,否则会丢失新数据。工具不提供 v3 → v2 反向增量迁移。
卡住了,先看哪里
先查看对应阶段的 .stderr 与 JSON 报告,保留失败现场,不覆盖日志、删源数据或改标记强行通过。
- 无输出或
context canceled:检查原进程、阶段日志、磁盘和外层超时;不要并发第二次迁移。 - 目标已存在或需要重试:按重试条件判断能否复用;来源、目标、策略或工具变化时用全新工作空间、归档与目标。
- 多节点、插件或数据冲突:查迁移参考,逐项处理,不自动套用丢弃策略。
报告命令、故障对照与重试参考
例如 prepare 失败,先查看这两个文件:
cat /srv/wkmigrate/reports/prepare.stderr
cat /srv/wkmigrate/reports/prepare.json其他阶段换成对应文件名。保留失败现场和日志,不要重复整段命令覆盖报告,也不要删除源数据或修改标记强行通过。
| 遇到的情况 | 下一步 |
|---|---|
| 目标目录已存在 | 确认是否为上次迁移产物;首次执行改用新目录,重试按参考页处理 |
| 插件、重复消息、会话或副本冲突 | 查看报告后按迁移参考逐项处理 |
长时间没有输出、context canceled | 查对应 .stderr 的阶段进度与进程状态,核对磁盘空间和外层超时;不要并发启动第二次迁移 |
| 需要多节点、Docker 或迁到其他服务器 | 使用迁移参考中的计划、目录分发和启动配置 |
完整的重试条件、插件策略、数据转换和业务验收清单均在迁移参考中,按遇到的问题查阅即可。