Skip to content

实现原理

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。中间任意记录写入失败时,该批次位点保持不变。

数据验证与业务切流

  1. 当日志显示程序稳定运行在 Stream 阶段,且同步 QPS 与源端写入 QPS 大致持平时,增量数据已基本追平。
  2. 使用 ddb-data-check 执行全量一致性校验。
  3. 在切换窗口暂停所有源端写入。
  4. 等待 Stream 增量同步 QPS 下降并稳定为 0。
  5. 将应用配置指向新的 Tair 实例,然后重新启动服务。

Released under the MIT License.