大规模数据迁移,先跑通可回退的最小批次
大规模数据迁移不必从复杂的平台开始。先做一个能分片、限速、重试、记录进度并校验结果的最小管道,把边界和失败语义跑通,再逐步补并发和自动化。规模越大,越不能依赖进程内状态或一次性全量校验。
最小管道的组成
先选稳定分片键并约定边界,例如使用半开区间。每个分片有任务 ID、可重放输入和明确状态。目标端写入需要可识别重复投递;检查点只能在写入结果及必要校验完成后推进。
不要用 sleep 代替背压
固定休眠不能反映目标库是否拥堵。根据连接池等待、写入超时、延迟或错误类别调整并发,并设置上限。只重试确认可恢复的错误;超时后先确认目标端结果,再决定是否重放。
type Chunk struct { Start, End string; ID string } func nextChunk(c Chunk) error { if c.Start >= c.End { return errors.New("invalid range") } return nil }字符串比较仅适用于有序编码一致的键,实际实现应使用对应主键类型和数据库比较规则。
小范围演练比宏大承诺更重要
先在可回收数据集上测试暂停、重启、重复执行、源端变更和目标端慢写。通过后再扩大范围。记录每个分片的输入范围、版本、校验摘要和失败原因,出现不一致就停在该分片,不继续把问题扩散到后续范围。