PostgreSQL CDC Pipeline Source Connector 用于读取 PostgreSQL 表的初始快照和后续 WAL 增量变更,并将变更事件传递给 Flink CDC Pipeline 下游。
类别 | 详情 |
|---|---|
支持类型 | Source |
作业类型 | Flink CDC Pipeline YAML |
运行模式 | 流模式; |
读取阶段 | 初始快照、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。database.schema.table 和正则表达式选择或排除表。pgoutput 时,可以根据 Relation 消息与缓存 Schema 的差异推断加列、删列、重命名列和修改列类型事件。wal_level 设置为 logical,并为 max_replication_slots、max_wal_senders 保留足够容量。pg_hba.conf 或云数据库白名单连接。pgoutput 时已确认 Connector 用户能够使用或创建 Publication。tables 中的 database 必须相同。pipeline.schema.change.behavior 和下游 Sink 能力影响。schema-change.enabled 默认关闭,且仅支持与 pgoutput 配合使用。pgoutput 时,Connector 可以在权限充足时自动创建 Publication;已有 Publication 会按其现有定义复用,作业停止时不会自动删除。latest-offset 和 committed-offset 跳过初始快照,启动位置之前的数据不会补读。snapshot 只读取快照,完成后退出,不持续读取 WAL。TIME 固定映射为 TIME(3);高精度时间和 Decimal 模式变更可能影响下游类型。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
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Source 类型。 | STRING | 是 | 无 | 固定为 |
| Source 名称。 | STRING | 否 | 无 | 用于作业拓扑和日志识别。 |
| PostgreSQL 地址。 | STRING | 是 | 无 | 使用可由 Flink 资源池访问的地址。 |
| PostgreSQL 端口。 | INTEGER | 否 |
| 必须与实例实际端口一致。 |
| PostgreSQL 用户名。 | STRING | 是 | 无 | 建议引用 Flink 加密变量。 |
| PostgreSQL 密码。 | STRING | 是 | 无 | 建议引用 Flink 加密变量。 |
| 需要捕获的表。 | STRING | 是 | 无 | 使用 |
| 排除的表。 | STRING | 否 | 无 | 在 |
| 逻辑复制槽名称。 | STRING | 是 | 无 | 仅允许小写字母、数字和下划线;不同运行实例使用不同 Slot。 |
| 逻辑解码插件。 | STRING | 否 | 无 | 支持 |
| PostgreSQL Server 会话时区。 | STRING | 否 | 系统默认时区 | 影响不带时区的 |
| 首次启动的读取位置。 | STRING | 否 |
| 支持 |
| 快照 Chunk 行数。 | INTEGER | 否 |
| 调大可能提高吞吐,也会增大单个 Chunk 的恢复成本。 |
| 快照每次读取的最大行数。 | INTEGER | 否 |
| 影响数据库读取批次和客户端内存。 |
| 快照结束后是否关闭空闲 Reader。 | BOOLEAN | 否 |
| 使用前确认 Flink 版本兼容性。 |
| 延迟提交 LSN 的 Checkpoint 数。 | INTEGER | 否 |
| 按 Checkpoint 顺序滚动提交较早的 LSN。 |
| 建立连接的最长等待时间。 | DURATION | 否 |
| 不能小于 |
| 建立连接的最大重试次数。 | INTEGER | 否 |
| 仅影响连接建立。 |
| 数据库连接池大小。 | INTEGER | 否 |
| 增大时评估 PostgreSQL 最大连接数。 |
| 心跳间隔。 | DURATION | 否 |
| 用于推进可用 WAL Offset,避免低流量表长期保留 WAL。 |
| Chunk 元数据分组大小。 | INTEGER | 否 |
| 元数据量较大时分组保存。 |
| 输出的元数据字段。 | STRING | 否 | 无 | 支持 |
| Table ID 是否包含 database。 | BOOLEAN | 否 |
| 开启后 Table ID 为 |
| 透传 JDBC URL 属性。 | STRING | 否 | 无 | 例如 SSL 相关 JDBC 参数。 |
| 透传 Debezium PostgreSQL Connector 属性。 | STRING | 否 | 无 | 仅配置当前 Connector 版本支持的 Debezium 参数。 |
以下是与 Slot、Publication 生命周期相关的常用 Debezium 透传参数。
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 作业正常停止时是否删除 Replication Slot。 | BOOLEAN | 否 |
| 建议保持默认值,以支持状态恢复;不再使用的 Slot 需要由管理员确认后清理。 |
| 使用 | STRING | 否 |
| 多个 Connector 捕获同一数据库时应使用不同 Publication。 |
| Publication 自动创建方式。 | STRING | 否 |
| 自动创建需要足够权限;生产环境可以提前创建 Publication,或按权限模型选择社区支持的模式。 |
PostgreSQL 类型 | Flink CDC 类型 | 说明 |
|---|---|---|
|
| 多位 |
|
| 整数。 |
|
| 整数。 |
|
| 整数。 |
|
| 浮点数。 |
|
| 浮点数。 |
|
| 无精度 NUMERIC 默认 |
字符类型、 |
| 字符串。 |
|
| 原始文本或 JSON 字符串。 |
|
| 可通过 Debezium 参数改为 Base64、Hex 等字符串。 |
|
| 日期。 |
|
| 当前固定为毫秒精度。 |
|
| 取决于 |
| 带时区时间类型 | 保留时区语义。 |
一维 ARRAY |
| 不支持多维数组。 |
|
| 取决于 |
网络地址类型 |
| 包括 |
PostGIS Geometry/Geography |
| 转换为包含坐标、类型和 SRID 的 JSON 字符串。 |
以下示例读取一个 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 保存逻辑消费位置并阻止所需 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.enabled: true 且解码插件为 pgoutput 时,Source 会比较 pgoutput Relation 消息与缓存 Schema,推断加列、删列、重命名列和修改列类型事件。Pipeline 默认使用 lenient 模式,以避免数据丢失的方式转换 Schema Change;实际能否在下游执行仍取决于 Sink 的 Schema Evolution 能力。TRUNCATE TABLE 和 DROP TABLE 事件会被忽略。
wal_level、Replication Slot、Publication、用户权限和网络连通性。schema.change.behavior 和 Sink 能力。pg_replication_slots,确认 Slot 处于预期状态,confirmed_flush_lsn 持续推进。现象 | 可能原因 | 处理建议 |
|---|---|---|
无法创建或连接 Replication Slot | Slot 名称非法、已被其他消费者占用、权限不足或数量达到上限。 | 使用仅含小写字母、数字和下划线的唯一名称,并检查 |
| Publication 创建权限不足,或已有 Publication 未包含目标表。 | 检查 Publication、数据库 |
快照读取缓慢 | Chunk/FETCH 配置偏小、源表缺少合适索引或数据库负载较高。 | 检查快照指标、执行计划和数据库负载,再调整 Chunk 与 Fetch 参数。 |
WAL 磁盘持续增长 | Slot 长期不消费、作业异常或 LSN 未推进。 | 检查作业状态、心跳、Checkpoint、Slot 的 |
UPDATE、DELETE 无法正确识别旧行 | 表缺少主键或 Replica Identity。 | 为表设置主键或合适的 |
修改表结构后未产生 Schema Change | 未开启推断、解码插件不是 | 检查 |
修改表结构后作业异常 | 当前 Schema Change 模式或下游 Sink 不支持该变更。 | 检查 |
时间字段出现偏移 |
| 核对 PostgreSQL 会话时区、 |
latest-offset、committed-offset 会跳过快照,使用前确认历史数据已经同步。schema.change.behavior 和下游 Sink 的兼容性;类型转换在部分模式下可能改变字段结构或造成数据损失。schema-change.enabled 时必须使用 pgoutput,并建议先在测试表验证目标 DDL 和下游 Sink 行为。debezium.*、jdbc.properties.* 会改变类型、快照和连接行为,仅使用当前版本已验证的参数。