实践心得 | 用 Apache SeaTunnel 搞定 PostgreSQL 到平凯数据库云服务的数据迁移

SeaTunnel 作为迁移工具表现稳定,全量同步与增量同步均顺利完成,未出现数据丢失问题。
178834265033230f9ed9e6752b03a

https://github.com/apache/SeaTunnel

点击蓝字



关注我们

作者 | bytehouse

一、迁移背景

我们业务初期采用 PostgreSQL 作为 OLTP 兼分析型数据库,采用本地自建部署方式。实际运维过程中,需要投入大量人力处理数据库高可用架构维护、定时备份、故障恢复等基础工作,运维成本高、复杂度高,且偶尔会出现运维疏漏,存在一定的业务连续性风险。考虑到 平凯数据库云服务 无需本地部署运维、使用便捷,且计费模式灵活可控,我们决定在优先保证业务连续性和稳定性的前提下,尝试将 PostgreSQL 数据库迁移至 平凯数据库云服务,同时也希望通过这次迁移,探索更适合业务的多元化数据存储与分析架构。我们的核心业务为道路交通卡口数据分析——基于海量车辆通行记录(车牌、车速、位置、驾驶行为特征等),为交通管理与安全监管提供数据支撑。核心数据表 driving_data_jsonb 采用 JSONB + 分区表设计,日均过车记录约 500 万条,单分区存储约 1.5 亿条车辆通行记录(约 60GB),是业务中数据量最大、查询最频繁的表。典型分析场景包括:

  • 道路拥堵指数分析:按时间段、路段聚合车流量与平均车速,实时评估道路通行状态

  • 区间超速检测:基于卡口间通行时间与距离,计算车辆区间平均速度,识别超速行为

  • 驾驶轨迹分析:还原车辆行驶路径,分析驾驶习惯与异常行为模式

  • 连续驾驶时长监控:追踪单车连续驾驶时间,配合交通法规(如连续驾驶 4 小时需强制休息)进行预警这类分析查询涉及大量数据聚合与多维交叉计算,对数据库的 OLAP 能力要求较高。

    二、迁移环境概览

2.1 源端环境

项目 详情
数据库 PostgreSQL 18.2
部署方式 本地虚拟机(测试环境)
数据库 traffic(交通数据业务库)
核心表 driving_data_jsonb(分区表,单分区约 1.5 亿行 / 60GB)
网络出口 500Mbps 宽带,直连公网

2.2 目标端环境

项目 详情
平台 平凯数据库云服务(PingKai Cloud)
区域 cn-shanghai(上海)
存储消耗 约 62.62 GiB

2.3 网络拓扑

源端通过 500Mbps 宽带经公网直连平凯数据库云服务,未部署专线或 VPN。

三、迁移工具选型

迁移过程中,我们重点对比了 DataX 和 SeaTunnel 两款常用迁移工具。

DataX SeaTunnel ✅
  • 长期未进行版本更新
  • 部分插件依赖 Python 2.x 辅助脚本,与当前技术栈兼容性较差
  • 扩展性有限,连接器生态不够丰富
  • 活跃开源项目,迭代更新及时(当前使用 2.3.13)
  • 支持数据源类型丰富,连接器生态完善
  • 社区活跃度高,问题响应快
  • 支持 JDBC 通用连接器,适配 PG 和 TiDB

结合业务对"及时同步、稳定无丢失"的核心要求,最终选用 SeaTunnel 2.3.13 作为迁移工具。

四、SeaTunnel迁移实战

4.1 迁移策略:全量+增量两步走

由于 SeaTunnel 2.3.13 版本的 PG-CDC 连接器在"全量 + 增量一体化"模式下存在已知 Bug(已向社区反馈并协助修复),我们采用全量初始化+ CDC增量同步两步走的方案:

第一步:通过 JDBC PostgreSQL 连接器进行全量数据初始化同步

第二步:基于 CDC 增量连接器实现实时数据同步

4.2 全量同步配置(Jdbc Source → Jdbc Sink

以下为全量同步阶段的核心配置:

env {  parallelism = 2  checkpoint.interval = 10000  pipeline.name = "PG_TO_TiDB_DRIVING"    flink.execution.checkpointing.mode = "EXACTLY_ONCE"  flink.execution.checkpointing.timeout = 600000}source {  Jdbc {    url = "jdbc:postgresql://<source_host>:5432/traffic"    driver = "org.postgresql.Driver"    user = "postgres"    password = "******"        query = "SELECT record_id, pass_time, plate_no, plate_color,             vehicle_type, speed, speed_limit, status,             longitude, latitude, speed_variance,             lane_change_count, raw_behavior_features,             create_time, update_time             FROM driving_data_jsonb"    column.filters = "update_time"    start.time = "2025-01-01 00:00:00"    fetch.size = 1000    parallelism = 2  }}sink {  Jdbc {    url = "jdbc:mysql://<tidb_cloud_host>:4000/traffic?sslMode=VERIFY_IDENTITY"    driver = "com.mysql.cj.jdbc.Driver"    user = "******"    password = "******"    database = "traffic"    table = "driving_data_jsonb"        generate_sink_sql = true        save_mode = "upsert"    unique_key = ["record_id"]        batch.size = 1000    batch.interval = 1000    parallelism = 2  }}

4.3 增量同步配置(Postgres-CDC Source → Jdbc Sink

全量同步完成后,启动 CDC 增量连接器实时同步源端变更数据:

env {  execution.parallelism = 1  job.mode = "STREAMING"  checkpoint.interval = 5000}source {  Postgres-CDC {    username = "postgres"    password = "******"    database-names = ["traffic"]    schema-names = ["public"]    table-names = ["traffic.public.driving_data_jsonb"]    url = "jdbc:postgresql://<source_host>:5432/traffic"    decoding.plugin.name = "pgoutput"    slot.name = "final_slot"    startup.mode = "latest"    plugin_output = "out"  }}sink {  Jdbc {    url = "jdbc:mysql://<tidb_cloud_host>:4000/traffic?sslMode=VERIFY_IDENTITY"    driver = "com.mysql.cj.jdbc.Driver"    user = "******"    password = "******"    database = "traffic"    table = "driving_data_jsonb"        generate_sink_sql = true        save_mode = "upsert"    unique_key = ["record_id"]        batch.size = 1000    batch.interval = 1000    parallelism = 2  }}

4.4 关键配置说明

以下为全量同步与增量同步中的关键配置项说明:

配置项 说明
parallelism = 2 并行度设为 2,匹配源端资源
checkpoint.mode = EXACTLY_ONCE 端到端精确一次语义,保障数据一致性
checkpoint.interval = 10000 Checkpoint 间隔 10 秒,平衡性能与容错
save_mode = upsert 基于 unique_key 做 Upsert 写入,避免重复数据
unique_key = ["record_id"] 以 record_id 作为去重键
sslMode = VERIFY_IDENTITY 平凯数据库云服务强制 TLS 加密连接
batch.size / batch.interval 批量写入 1000 条或每 1 秒刷写一次,取先到者
decoding.plugin.name = pgoutput CDC 增量同步使用 PostgreSQL 原生逻辑解码插件
slot.name 指定逻辑复制槽名称,确保增量数据不丢失
startup.mode = latest 从最新位置开始消费增量数据,避免重复同步

4.5 迁移结果

指标 数据
全量同步耗时 单分区约 12 小时(源端为虚拟机测试环境)
增量同步延迟 迁移过程顺畅,未出现明显延迟
数据一致性 每条记录包含唯一主键 record_id,Sink 端采用 upsert 模式写入,基于主键去重,确保数据不丢不重。迁移完成后通过源端与目标端的行数比对进行最终验证。
Schema 兼容性 未遇到 PG → TiDB 的数据类型映射问题

说明:本次迁移优先完成了数据量最大的主表(driving_data_jsonb),其他表数据量较小,后续按需同步。

五、踩坑与经验

5.1 PG-CDC连接器Bug

SeaTunnel 2.3.13 的 PG-CDC 连接器在全量 + 增量一体化模式下存在 Bug,导致流程无法正常完成。我们通过社区反馈联系到开发者并协助定位修复,最终采用全量与增量分步执行的方式规避了该问题。

建议:使用 SeaTunnel 进行 PG 迁移时,建议优先采用全量 + 增量两步走的方案,稳定性更有保障。如需使用一体化模式,请确认所用版本已修复该问题。

5.2 网络带宽影响

源端部署在本地虚拟机,通过 500Mbps 宽带经公网连接平凯数据库云服务,单分区 60GB 数据全量同步耗时约 12 小时。如果源端部署在云端同区域或使用专线,同步耗时预计可大幅缩短。

六、迁移后业务表现

迁移至平凯数据库云服务后,最直观的提升就是 OLAP场景下的业务表现——统计分析、复杂查询的效率有了明显改善,业务端查询等待时间缩短,查询体验得到优化。后续我们计划结合具体业务场景,进一步探索启用 TiFlash 列式存储引擎,以此进一步优化分析查询性能,充分发挥 TiDB HTAP 架构在行列混用场景下的优势。

说明:目前我们尚未整理出详细的迁移后业务应用分析结果,具体的查询性能对比数据将在后续补充。

七、总结与建议

整体评价

本次 PostgreSQL 到平凯数据库云服务的迁移整体达到了预期目标。SeaTunnel 作为迁移工具表现稳定,全量同步与增量同步均顺利完成,未出现数据丢失问题。平凯数据库云服务在 OLAP 分析场景下带来了可感知的性能提升,同时大幅降低了数据库运维负担。

给其他PG用户的迁移建议

  1. 工具选择:推荐 SeaTunnel,连接器生态丰富且社区活跃,JDBC 通用连接器可快速适配 PG 和 TiDB

  1. 迁移策略:建议采用全量 + 增量两步走,稳定性优于一体化模式

  1. 数据一致性:务必开启 EXACTLY_ONCE Checkpoint 模式,使用 upsert 写入避免重复

  1. 网络规划:源端与 平凯数据库云服务 的网络质量对全量同步耗时影响显著,建议优先使用同云部署或专线连接

  1. 安全连接:平凯数据库云服务 强制 TLS,Sink 端配置 sslMode=VERIFY_IDENTITY 确保传输加密

Apache SeaTunnel

Apache SeaTunnel是一个云原生的多模态、高性能海量数据集成工具。北京时间 2023 年 6 月1 日,全球最大的开源软件基金会ApacheSoftware Foundation正式宣布SeaTunnel毕业成为Apache顶级项目。目前,SeaTunnel在GitHub上Star数量已达9k+。SeaTunnel支持在云数据库、本地数据源、SaaS、大模型等170多种数据源之间进行数据实时和批量同步,支持CDC、DDL变更、整库同步等功能,更是可以和大模型打通,让大模型链接企业内部的数据。




同步Demo

MySQL→Doris | MySQLCDC | MySQL→Hive | HTTP → Doris | HTTP → MySQL | MySQL→StarRocks|MySQL→Elasticsearch |Kafka→ClickHouse

新手入门

SeaTunnel 让数据集成变得 So easy!/ 3 分钟入门指南
0 到 1 快速入门 /初探/深入理解
分布式集群部署 | CDC数据同步管道 | Oracle-CDC
图片

最佳实践

Apache SeaTunnel Engine Zeta 进阶之路同程旅行中控技术天翼云多点OPPO | 清风马蜂窝孩子王哔哩哔哩唯品会众安保险兆原数通 | 亚信科技|映客|翼康济世|信也科技|华润置地|Shopee|京东科技|58同城|互联网银行|JPMorgan
图片

测试报告

SeaTunnel VS GLUE | VS Airbyte | VS DataX|SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比
图片

源码解析

Zeta引擎源码解析(一) |(二) |(三)| API 源码解析 |2.1.1源码解析|封装 Flink 连接数据库解析





仓库地址:
https://github.com/apache/seatunnel
网址:
https://seatunnel.apache.org/
Apache SeaTunnel 下载地址:
https://seatunnel.apache.org/download
衷心欢迎更多人加入!
我们相信,在Community Over Code(社区大于代码)、「Open and Cooperation」(开放协作)、「Meritocracy」(精英管理)、以及「多样性与共识决策」The Apache Way 的指引下,我们将迎来更加多元化和包容的社区生态,共建开源精神带来的技术进步!
我们诚邀各位有志于让本土开源立足全球的伙伴加入 SeaTunnel 贡献者大家庭,一起共建开源!
提交问题和建议:
https://github.com/apache/seatunnel/issues
贡献代码:
https://github.com/apache/seatunnel/pulls
订阅社区开发邮件列表 :
dev-subscribe@seatunnel.apache.org
开发邮件列表:
dev@seatunnel.apache.org
加入 Slack:
https://join.slack.com/t/apacheseatunnel/shared_invite/zt-3uouszk3m-PtLLNyZsJVqE5Gb6gn24mA
关注 X.com:
https://x.com/ASFSeaTunnel


17883426532184510eaca9d9dfb38
17883426537544ce5255f601542ce
1788342654222462fe8a1d1e5050d