You need to enable JavaScript to run this app.
文档中心
流式计算 Flink版

流式计算 Flink版

复制全文
下载 pdf
CDC Connector 参考
Postgres (公测中)
复制全文
下载 pdf
Postgres (公测中)

PostgreSQL CDC Pipeline Source Connector 用于读取 PostgreSQL 表的初始快照和后续 WAL 增量变更,并将变更事件传递给 Flink CDC Pipeline 下游。

功能概述

类别

详情

支持类型

Source

作业类型

Flink CDC Pipeline YAML

运行模式

流模式;snapshot 启动模式仅执行有界快照

读取阶段

初始快照、WAL 增量

支持的变更类型

INSERT、UPDATE、DELETE;开启 Schema Change 推断后支持加列、删列、重命名列和修改列类型

交付方式

Connector 和 PostgreSQL JDBC Driver 均为平台内置,无需上传额外 JAR

处理语义

Source 基于 Checkpoint 保存快照进度和 WAL 读取位置;端到端一致性取决于下游 Sink

版本兼容性

组件

支持版本

说明

火山引擎流式计算 Flink 版

Flink 1.16、Flink 1.20

Connector 和 PostgreSQL JDBC Driver 均为平台内置。

Flink CDC

火山 Flink CDC 3.4

已包含 PostgreSQL Schema Change 推断增强。

PostgreSQL

无明确版本限制

原则上支持实现 PostgreSQL 兼容协议并提供逻辑复制能力的实例。

特色功能

  • 全量加增量同步:initial 模式先读取一致性快照,再持续读取 WAL。
  • 并行增量快照:将表快照拆分为多个 Chunk,提高全量读取并行度和恢复能力。
  • 多表选择:使用 database.schema.table 和正则表达式选择或排除表。
  • 多种启动位置:社区基线支持全量加增量、仅最新增量、复制槽已提交位置和仅快照。
  • 源端元数据:可输出操作时间、database、schema 和 table 名称供 Transform 或下游使用。
  • Schema Change 推断:使用 pgoutput 时,可以根据 Relation 消息与缓存 Schema 的差异推断加列、删列、重命名列和修改列类型事件。

前提条件

  1. 已准备实现 PostgreSQL 兼容协议并提供逻辑复制、WAL、Replication Slot 等能力的实例,并确保 Flink 资源池与数据库网络可达。
  2. PostgreSQL 已启用逻辑复制,wal_level 设置为 logical,并为 max_replication_slots、max_wal_senders 保留足够容量。
  3. 已准备具有目标表读取权限和逻辑复制权限的数据库用户,并允许 Flink 资源池通过 pg_hba.conf 或云数据库白名单连接。
  4. 已为目标表配置主键或适当的 Replica Identity,以确保 UPDATE、DELETE 可被正确识别。
  5. 已为每个运行中的作业规划唯一的 Replication Slot;使用 pgoutput 时已确认 Connector 用户能够使用或创建 Publication。
  6. 已使用 Flink 加密变量保存 PostgreSQL 用户名和密码。
  7. 已确认同一 Pipeline 中匹配的所有表属于同一个 PostgreSQL database。

使用限制

  • Connector 仅支持作为 Flink CDC Pipeline Source。
  • 一次 Pipeline 只能连接一个 PostgreSQL database;tables 中的 database 必须相同。
  • Schema Evolution 的处理结果受 pipeline.schema.change.behavior 和下游 Sink 能力影响。
  • schema-change.enabled 默认关闭,且仅支持与 pgoutput 配合使用。
  • TRUNCATE TABLE 和 DROP TABLE 事件会被忽略,不会传递给下游。
  • Replication Slot 不能同时被多个活跃消费者使用;每个并行运行的作业应使用独立 Slot。
  • Connector 在 Slot 不存在且用户权限充足时自动创建 Slot;默认不会在作业停止时删除 Slot。
  • 使用 pgoutput 时,Connector 可以在权限充足时自动创建 Publication;已有 Publication 会按其现有定义复用,作业停止时不会自动删除。
  • Slot 长期不消费会阻止旧 WAL 清理,可能持续占用 PostgreSQL 磁盘。
  • latest-offset 和 committed-offset 跳过初始快照,启动位置之前的数据不会补读。
  • snapshot 只读取快照,完成后退出,不持续读取 WAL。
  • PostgreSQL 多维数组不受支持,仅支持一维数组。
  • TIME 固定映射为 TIME(3);高精度时间和 Decimal 模式变更可能影响下游类型。
  • Sequence 和 Large Object 不属于行级 WAL 数据同步范围。

语法结构

source:
  type: postgres
  name: PostgreSQL Source 
  hostname: <postgres_host>
  port: 5432
  username: ${secret_values.postgres-username}
  password: ${secret_values.postgres-password}
  tables: <database>.<schema>.<table_pattern>
  slot.name: <replication_slot_name>
  decoding.plugin.name: pgoutput
  schema-change.enabled: true
  scan.startup.mode: initial

sink:
  type: values
  name: Values Sink

pipeline:
  name: PostgreSQL CDC Pipeline
  parallelism: 2
  local-time-zone: Asia/Shanghai
  schema.change.behavior: lenient

参数说明

连接器配置项

参数

说明

数据类型

是否必填

默认值

备注

type

Pipeline Source 类型。

STRING

是

无

固定为 postgres。

name

Source 名称。

STRING

否

无

用于作业拓扑和日志识别。

hostname

PostgreSQL 地址。

STRING

是

无

使用可由 Flink 资源池访问的地址。

port

PostgreSQL 端口。

INTEGER

否

5432

必须与实例实际端口一致。

username

PostgreSQL 用户名。

STRING

是

无

建议引用 Flink 加密变量。

password

PostgreSQL 密码。

STRING

是

无

建议引用 Flink 加密变量。

tables

需要捕获的表。

STRING

是

无

使用 database.schema.table;支持正则,所有 database 必须相同。

tables.exclude

排除的表。

STRING

否

无

在 tables 匹配结果上进一步排除,格式相同。

slot.name

逻辑复制槽名称。

STRING

是

无

仅允许小写字母、数字和下划线;不同运行实例使用不同 Slot。

decoding.plugin.name

逻辑解码插件。

STRING

否

无

支持 decoderbufs、pgoutput;需要 Schema Change 推断时使用 pgoutput。

server-time-zone

PostgreSQL Server 会话时区。

STRING

否

系统默认时区

影响不带时区的 TIMESTAMP 转换。

scan.startup.mode

首次启动的读取位置。

STRING

否

initial

支持 initial、latest-offset、committed-offset、snapshot。

scan.incremental.snapshot.chunk.size

快照 Chunk 行数。

INTEGER

否

8096

调大可能提高吞吐,也会增大单个 Chunk 的恢复成本。

scan.snapshot.fetch.size

快照每次读取的最大行数。

INTEGER

否

1024

影响数据库读取批次和客户端内存。

scan.incremental.close-idle-reader.enabled

快照结束后是否关闭空闲 Reader。

BOOLEAN

否

false

使用前确认 Flink 版本兼容性。

scan.lsn-commit.checkpoints-num-delay

延迟提交 LSN 的 Checkpoint 数。

INTEGER

否

3

按 Checkpoint 顺序滚动提交较早的 LSN。

connect.timeout

建立连接的最长等待时间。

DURATION

否

30s

不能小于 250ms。

connect.max-retries

建立连接的最大重试次数。

INTEGER

否

3

仅影响连接建立。

connection.pool.size

数据库连接池大小。

INTEGER

否

20

增大时评估 PostgreSQL 最大连接数。

heartbeat.interval

心跳间隔。

DURATION

否

30s

用于推进可用 WAL Offset,避免低流量表长期保留 WAL。

chunk-meta.group.size

Chunk 元数据分组大小。

INTEGER

否

1000

元数据量较大时分组保存。

metadata.list

输出的元数据字段。

STRING

否

无

支持 op_ts、table_name、database_name、schema_name。

table-id.include-database

Table ID 是否包含 database。

BOOLEAN

否

false

开启后 Table ID 为 database.schema.table。

jdbc.properties.*

透传 JDBC URL 属性。

STRING

否

无

例如 SSL 相关 JDBC 参数。

debezium.*

透传 Debezium PostgreSQL Connector 属性。

STRING

否

无

仅配置当前 Connector 版本支持的 Debezium 参数。
更多信息请参见 Debezium 的 Postgres Connector 属性。

以下是与 Slot、Publication 生命周期相关的常用 Debezium 透传参数。

参数

说明

数据类型

是否必填

默认值

备注

debezium.slot.drop.on.stop

作业正常停止时是否删除 Replication Slot。

BOOLEAN

否

false

建议保持默认值,以支持状态恢复;不再使用的 Slot 需要由管理员确认后清理。

debezium.publication.name

使用 pgoutput 时的 Publication 名称。

STRING

否

dbz_publication

多个 Connector 捕获同一数据库时应使用不同 Publication。

debezium.publication.autocreate.mode

Publication 自动创建方式。

STRING

否

all_tables

自动创建需要足够权限;生产环境可以提前创建 Publication,或按权限模型选择社区支持的模式。

类型映射

PostgreSQL 类型

Flink CDC 类型

说明

BOOLEAN、BIT(1)

BOOLEAN

多位 BIT 映射为 BYTES。

SMALLINT、SMALLSERIAL

SMALLINT

整数。

INTEGER、SERIAL

INT

整数。

BIGINT、BIGSERIAL、OID

BIGINT

整数。

REAL、FLOAT4

FLOAT

浮点数。

DOUBLE PRECISION、FLOAT8

DOUBLE

浮点数。

NUMERIC(p,s)、DECIMAL(p,s)

DECIMAL(p,s)

无精度 NUMERIC 默认 DECIMAL(38,0);可通过 Debezium 参数改为 Double 或 String。

字符类型、TEXT、UUID、ENUM

STRING

字符串。

JSON、JSONB、XML

STRING

原始文本或 JSON 字符串。

BYTEA

BYTES

可通过 Debezium 参数改为 Base64、Hex 等字符串。

DATE

DATE

日期。

TIME(p)

TIME(3)

当前固定为毫秒精度。

TIMESTAMP(p)

TIMESTAMP(p) 或 TIMESTAMP(3)

取决于 debezium.time.precision.mode。

TIMESTAMPTZ

带时区时间类型

保留时区语义。

一维 ARRAY

ARRAY

不支持多维数组。

HSTORE

STRING 或 MAP

取决于 debezium.hstore.handling.mode。

网络地址类型

STRING

包括 INET、CIDR、MACADDR、MACADDR8。

PostGIS Geometry/Geography

STRING

转换为包含坐标、类型和 SRID 的 JSON 字符串。

使用示例

读取 PostgreSQL 全量和增量数据

以下示例读取一个 PostgreSQL database 中匹配表的初始快照和后续 WAL 变更,并写入 Values Sink 进行验证。运行前请替换地址、表名、Slot 和加密变量名称。

source:
  type: postgres
  name: PostgreSQL Source 
  hostname: <postgres_host>
  port: 5432
  username: ${secret_values.postgres-username}
  password: ${secret_values.postgres-password}
  tables: <database>.<schema>.<table_pattern>
  tables.exclude: <database>.<schema>.<excluded_table_pattern>
  slot.name: <replication_slot_name>
  decoding.plugin.name: pgoutput
  schema-change.enabled: true
  scan.startup.mode: initial
  metadata.list: op_ts,table_name,database_name,schema_name
  heartbeat.interval: 30s

sink:
  type: values
  name: Values Sink

pipeline:
  name: PostgreSQL CDC Pipeline
  parallelism: 2
  local-time-zone: Asia/Shanghai
  schema.change.behavior: lenient

预期结果: 作业先输出匹配表的已有记录,然后持续输出 INSERT、UPDATE、DELETE 事件。快照记录的 op_ts 为 0,增量记录包含实际变更时间。

运行机制

快照与增量衔接

initial 模式将表拆分为多个 Chunk 并行读取。快照期间同时记录 WAL 位置;所有快照 Chunk 完成后,作业继续从对应位置消费增量变更,避免快照和增量之间出现缺口。

Replication Slot 与 LSN

Replication Slot 保存逻辑消费位置并阻止所需 WAL 被提前清理。scan.lsn-commit.checkpoints-num-delay 控制 Checkpoint 成功后延迟提交 LSN 的数量。Source 基于 Checkpoint 保存快照进度和 WAL 读取位置,可以在故障恢复后继续读取;端到端一致性仍取决于下游 Sink 的交付语义。
Slot 不存在且 Connector 用户具有 REPLICATION 等必要权限时,Connector 会自动创建;默认停止作业不会删除 Slot。多个作业不能共用同一个 Slot。
使用 pgoutput 时,Connector 可以根据 Debezium Publication 配置自动创建 Publication;若 Publication 已存在,则按现有定义使用。自动创建需要数据库 CREATE 权限以及目标表所需权限。生产环境可以提前创建 Slot 和 Publication,以便采用更严格的权限和生命周期管理。

Schema Change

schema-change.enabled: true 且解码插件为 pgoutput 时,Source 会比较 pgoutput Relation 消息与缓存 Schema,推断加列、删列、重命名列和修改列类型事件。Pipeline 默认使用 lenient 模式,以避免数据丢失的方式转换 Schema Change;实际能否在下游执行仍取决于 Sink 的 Schema Evolution 能力。TRUNCATE TABLE 和 DROP TABLE 事件会被忽略。

验证与排障

验证方法

  1. 验证 PostgreSQL wal_level、Replication Slot、Publication、用户权限和网络连通性。
  2. 提交作业并确认进入运行状态,观察快照相关指标逐步完成。
  3. 对测试表执行 INSERT、UPDATE、DELETE,确认下游收到对应事件。
  4. 在测试表执行加列、修改列类型等 Schema Change,确认下游行为符合 schema.change.behavior 和 Sink 能力。
  5. 等待成功 Checkpoint 后执行受控重启,检查快照或 WAL 读取位置是否正确恢复。
  6. 查询 pg_replication_slots,确认 Slot 处于预期状态,confirmed_flush_lsn 持续推进。
  7. 检查 PostgreSQL WAL 磁盘占用,确认作业停止或异常时没有持续无界增长。

常见问题

现象

可能原因

处理建议

无法创建或连接 Replication Slot

Slot 名称非法、已被其他消费者占用、权限不足或数量达到上限。

使用仅含小写字母、数字和下划线的唯一名称,并检查 pg_replication_slots、REPLICATION 权限和 Slot 容量。

pgoutput 无法开始读取

Publication 创建权限不足,或已有 Publication 未包含目标表。

检查 Publication、数据库 CREATE 权限、目标表权限及表范围。

快照读取缓慢

Chunk/FETCH 配置偏小、源表缺少合适索引或数据库负载较高。

检查快照指标、执行计划和数据库负载,再调整 Chunk 与 Fetch 参数。

WAL 磁盘持续增长

Slot 长期不消费、作业异常或 LSN 未推进。

检查作业状态、心跳、Checkpoint、Slot 的 restart_lsn 和 confirmed_flush_lsn。

UPDATE、DELETE 无法正确识别旧行

表缺少主键或 Replica Identity。

为表设置主键或合适的 REPLICA IDENTITY。

修改表结构后未产生 Schema Change

未开启推断、解码插件不是 pgoutput,或变更类型不在支持范围内。

检查 schema-change.enabled、decoding.plugin.name 和变更类型。

修改表结构后作业异常

当前 Schema Change 模式或下游 Sink 不支持该变更。

检查 schema.change.behavior、Sink 的 Schema Evolution 能力和作业异常信息。

时间字段出现偏移

server-time-zone 或 Pipeline 时区与源端不一致。

核对 PostgreSQL 会话时区、server-time-zone 和 pipeline.local-time-zone。

注意事项

  • 每个并行运行的作业使用独立 Replication Slot,避免 Slot 被多个消费者争用。
  • Slot 和 Publication 默认不会随作业停止自动删除。作业长期停止前应评估 Slot 对 WAL 保留和磁盘容量的影响;不要直接删除仍被使用或仍需用于状态恢复的 Slot。
  • latest-offset、committed-offset 会跳过快照,使用前确认历史数据已经同步。
  • 生产表变更前应评估 schema.change.behavior 和下游 Sink 的兼容性;类型转换在部分模式下可能改变字段结构或造成数据损失。
  • 开启 schema-change.enabled 时必须使用 pgoutput,并建议先在测试表验证目标 DDL 和下游 Sink 行为。
  • TRUNCATE TABLE 和 DROP TABLE 事件会被忽略,不会对下游执行清表或删表。
  • debezium.*、jdbc.properties.* 会改变类型、快照和连接行为,仅使用当前版本已验证的参数。
  • 不要在 YAML 中填写明文密码,应使用 Flink 加密变量。

相关文档

最近更新时间:2026.07.31 17:58:01
这个页面对您有帮助吗?
有用
有用
无用
无用