PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案

作者:吴迪,SelectDB 内核研发工程师、Apache Doris PMC Member

PostgreSQL 已成为众多业务系统的核心数据库,在 各类 TP 场景中被广泛采用。然而,PostgreSQL 的设计目标是高并发在线事务处理,并不适合承载分析型负载。当执行跨表聚合、大范围扫描等查询时,容易占用大量系统资源,从而影响线上业务的稳定性。

因此,在实时分析、实时大屏、数据仓库以及 AI 数据供给等场景中,通常会将 PostgreSQL 中的数据实时同步至 Apache Doris 等分析型数据库,由 Doris 承担分析查询任务,实现 TP 与 AP 负载分离。

相比分析系统本身,真正具有挑战性的往往是实时同步链路的搭建与维护。如何持续、稳定、准确地将 PostgreSQL 的数据同步至 Doris,是整个架构中的关键环节

PostgreSQL 至 Apache Doris 的实时同步

先来看传统方案与 Apache Doris 一站式 CDC 同步方案的整体流程。

传统同步方案的挑战

由上图可知,传统方案的同步链路一般由三个部分组成:

  • CDC 采集:通过 Debezium、Flink CDC 等组件持续捕获 PostgreSQL WAL 日志中的数据变更;
  • 消息传递:根据业务需求,将变更数据写入 Kafka,或直接发送至下游系统;
  • 数据处理:依赖 Flink、Spark 等计算框架完成数据转换、清洗,并最终写入 Apache Doris。

这种方案具有较强的灵活性,能够支持复杂的数据处理逻辑,但同时也意味着需要维护一条由多个独立组件组成的数据链路。对于仅需完成 PostgreSQL 到 Doris 实时同步的场景,这样的架构往往存在以下问题:

  • 组件众多,部署复杂:除数据库外,还需要维护 CDC、Kafka、Flink/Spark 等多个系统,涉及部署、监控、升级以及扩缩容等工作。对于仅有数据同步需求的用户而言,引入如此多的组件成本较高。
  • 同步链路较长,故障排查困难:当数据延迟、丢失或异常时,需要在 CDC、消息队列、计算引擎等多个系统之间逐层排查,定位问题耗时且复杂。

Apache Doris 一站式 CDC 同步方案

针对上述问题,Apache Doris 提供了内置 PostgreSQL CDC 同步能力,是专门面向 TP 数据库的实时同步场景。该方案将数据采集、任务调度、数据写入、断点续传等能力统一集成到 Doris Job 调度框架中,无需部署额外的 CDC 工具、消息队列或计算引擎。

因此,整体同步链路被进一步简化为:PostgreSQL → Apache Doris。

对于用户而言,需要维护的对象也从多个独立组件收敛为一个 Doris 集群,降低了部署和运维复杂度。

创建同步任务也非常简单,只需执行一条 SQL:

sql 复制代码
CREATE JOB test_postgres_job
ON STREAMING
FROM POSTGRES (
    "jdbc_url" = "jdbc:postgresql://127.0.0.1:5432/postgres",
    "driver_url" = "postgresql-42.5.0.jar",
    "driver_class" = "org.postgresql.Driver",
    "user" = "postgres",
    "password" = "postgres",
    "database" = "postgres",
    "schema" = "cdc_test",
    "include_tables" = "student1,student2",
    "offset" = "initial"
)
TO DATABASE target_db

任务创建完成后,Doris 将自动完成以下工作:

  • 根据 PostgreSQL 表结构自动创建目标表(如不存在);
  • 导入历史存量数据;
  • 持续消费 PostgreSQL WAL,实时同步增量数据。

一站式 CDC 同步方案的实现原理

内置 PostgreSQL CDC 并不是一个独立运行的同步组件,而是构建在 Apache Doris 的 Job 调度框架之上。通过 FE 调度、BE 执行以及 CDC Client 拉取变更数据 三部分协同工作,实现持续运行的实时同步任务。

接下来我们了解下具体的执行流程。

  1. 用户在 FE 中通过 SQL 创建 PostgreSQL Streaming Job,并指定同步库、同步表及相关参数;
  2. FE 根据 PostgreSQL 表结构自动创建 Doris 目标表(若不存在);
  3. Job Scheduler 生成同步 Task,并调度至某个 BE 节点执行;
  4. BE 接收到任务后,将请求转发给本机 CDC Client;若 CDC Client 尚未启动,则自动拉起对应进程;
  5. CDC Client 持续读取 PostgreSQL WAL,完成全量及增量数据采集;
  6. 数据序列化后,通过 Stream Load 写入 Doris;
  7. 当前批次写入完成后,BE 将同步 Offset 上报给 FE;
  8. FE 持久化 Offset,并继续调度下一轮同步任务,实现持续同步。

整个过程中,数据同步、任务调度以及状态管理均由 Doris 自身完成,无需依赖 Kafka、Flink 或 Spark 等外部系统。

这种设计一方面缩短了同步链路,另一方面也充分复用了 Doris 已有的 Job 调度能力,使整个同步过程更加稳定、易于维护。

快速体验

创建 PostgreSQL 同步任务仅需执行一条 SQL:

下面示例将 PostgreSQL 中的数据同步至目标数据库 target_test_db

sql 复制代码
CREATE JOB test_postgres_job
ON STREAMING
FROM POSTGRES (
    "jdbc_url" = "jdbc:postgresql://127.0.0.1:5432/postgres",
    "driver_url" = "postgresql-42.5.0.jar",
    "driver_class" = "org.postgresql.Driver",
    "user" = "postgres",
    "password" = "postgres",
    "database" = "postgres",
    "schema" = "cdc_test",
    "include_tables" = "student1,student2",
    "offset" = "initial"
)
TO DATABASE target_test_db

创建完成后,Job 会自动完成目标表创建、全量数据导入以及后续增量同步。

同步过程中,可以通过如下命令查看任务状态:

sql 复制代码
mysql> select * from jobs(type='insert') where name='test_postgres_job'\G
*************************** 1. row ***************************
               Id: 1774599451260
             Name: test_postgres_job
          Definer: root
      ExecuteType: STREAMING
RecurringStrategy:
           Status: RUNNING
       ExecuteSql: FROM POSTGRES('schema'='cdc_test','include_tables'='student1,student2','database'='postgres','driver_class'='org.postgresql.Driver','offset'='initial','driver_url'='postgresql-42.5.0.jar','jdbc_url'='jdbc:postgresql://127.0.0.1:5432/postgres','user'='postgres') TO DATABASE target_test_db ('table.create.properties.replication_num'='1')
       CreateTime: 2026-03-27 17:02:48
 SucceedTaskCount: 3
  FailedTaskCount: 0
CanceledTaskCount: 0
          Comment:
       Properties:
    CurrentOffset: {"lsn":"53547640","txId":"1523","splitId":"binlog-split"}
        EndOffset: {"lsn":"53547640"}
    LoadStatistic: {"scannedRows":7,"loadBytes":341,"fileNumber":0,"fileSize":0,"filteredRows":0}
         ErrorMsg:
    JobRuntimeMsg: No data available for consumption at the moment, will retry after 1774602192496

其中几个关键字段含义如下:CurrentOffset 记录当前同步进度、LoadStatistic 反映已写入的行数与字节数。通过这些指标,可以快速判断同步任务是否正常运行,以及当前数据同步的实时进度。

更多参数配置和高级用法,可参考 PostgreSQL CDC 自动建表同步 - Apache Doris

总结

对于 PostgreSQL 到 Apache Doris 的实时同步而言,传统方案通常需要引入 CDC、消息队列和计算引擎等多个组件,虽然具备较高的灵活性,但也增加了部署和运维成本。

Apache Doris 将 PostgreSQL CDC、Job 调度、自动建表、数据导入以及断点续传等能力统一集成到 Job 调度框架中,使实时同步能够简化为一条 SQL 即可完成。后续,该能力也将陆续集成至 SelectDB,进一步降低生产环境下 PostgreSQL 实时同步的部署与运维成本。

对于以数据同步为主要需求、无需复杂实时计算的场景,这种内置方案能够有效缩短同步链路,降低系统复杂度,并减少后续的运维成本。

相关推荐
Database_Cool_2 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
会编程的土豆2 小时前
数据库范式
数据库·oracle
L1624762 小时前
MySQL 全环境生产快速安装 + 完整配置手册(整合国产银河麒麟适配 + 主从补充版)
数据库·mysql
yio_yin2 小时前
Spring事务管理(数据一致性)
数据库·sql·spring
X Chow2 小时前
MongoDB Beginner Guide 01:理解 NoSQL、文档模型与 Python 开发环境
数据库·mongodb·nosql
前端世界3 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
nianniannnn4 小时前
Qt QMessageBox知识点
开发语言·数据库·qt
—Miss. Z—4 小时前
计算机二级MySQL——简单应用题(存储过程&存储函数)
数据库·oracle·php
Vect__5 小时前
MySQL 数据类型和约束:从字段设计到表结构建模
数据库·mysql