原图
原始数据存储在外部数据中心的 SQL Server 上,需要将其迁移上 AWS 云,数据库切换到 Amazon Redshift,先前 ETL 方案使用的是 SSIS Package,也同样需要切换到 AWS 架构,本文只谈论数据迁移部分。
整个数据迁移方案从初次提出需求到最后完整落地花了两个半月时间,一开始只是需要写个一次的性脚本工具来简单处理 Schema 转换,将 SQL Server 的库表结构迁到 Redshift,后期陆续新增需求: RDS 还原 → 自动定期还原 → 迁移数据到 Redshift → 定期将数据同步到 Redshift,最后发现这演变成了一条完整的 Data Pipeline。
这是一个传统数仓上云的场景,环境隔离,有诸多限制,所以无法借助 CDC 做增量同步。
SQL Server 的备份文件会定时上传到 S3,分为每周一次全量和每天一次差异,为了能在备份上传完成后及时还原到 RDS,采用订阅 S3 Event Notifications 的方式,通过 Lambda Function 处理并触发启动 Step Function,随后调度 Glue Job 进行 RDS 还原,还原是一个 long time 作业,一次需要十个小时以上的时间。
RDS 还原任务的处理逻辑较为复杂,会记录每个任务到数据表中(这里使用了 Redshift),检查并更新状态,支持幂等,也就是避免重复还原相同的备份,更具体的细节本文中不做表述。
Schema
基于 https://github.com/tobymao/sqlglot 进行扩展实现 Schema 转换。
Data
bcp
从 RDS 导出数据,格式默认选用 TSV(支持 JOSN、CSV);split
将大文件切分为小块;lzop
压缩文件块(支持 GZIP);