实现原理
ddb-migrate 将迁移拆成全量 Scan 和 Stream 增量同步两个阶段,两个阶段共用目标端 writer 和 checkpoint。
启动检查
程序先读取源表和目标表定义,确认分区键和排序键(如有)的名称及类型一致。源表的 DynamoDB Streams 需要处于开启状态,视图类型需要包含 NewImage。
全量与增量如何衔接
首次启动时,程序先记录当前 Stream shard 位点,再开始全量 Scan。全量期间继续监控 shard,避免初始 iterator 过期后失去增量起点。
text
记录 Stream 起点
↓
并行 Scan 源表
↓
全量数据全部写入并确认
↓
从已记录位点消费 DynamoDB Streams全量 Scan
源表按 scan_segments 分段并行扫描,Scan 使用强一致读取。每个 item 转成写入任务发送给 writer。
一页中的所有 item 都写入目标端并返回成功确认后,程序才更新该 segment 的 Scan 位点。中断发生在位点更新前时,重启会重新扫描当前页。
目标端写入
writer 根据主键将同一 key 的任务分配到同一 worker,保持该 key 的写入顺序。每个 worker 将最多 25 条任务组成 BatchWriteItem。
INSERT、MODIFY 和 Scan item 转换为 PutRequest,REMOVE 转换为 DeleteRequest。目标端限流时,writer 保持当前批次并退避重试;非限流错误使进程退出。
Stream 增量同步
全量完成后,程序按 shard 消费 DynamoDB Streams。子 shard 等待父 shard 读完,避免旧记录在新记录之后写入。
一批 Stream 记录全部写入并确认后,checkpoint 才更新 sequence number。中间任意记录写入失败时,该批次位点保持不变。
数据验证与业务切流
- 当日志显示程序稳定运行在 Stream 阶段,且同步 QPS 与源端写入 QPS 大致持平时,增量数据已基本追平。
- 使用
ddb-data-check执行全量一致性校验。 - 在切换窗口暂停所有源端写入。
- 等待 Stream 增量同步 QPS 下降并稳定为 0。
- 将应用配置指向新的 Tair 实例,然后重新启动服务。