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

流式计算 Flink版

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

功能概述

MongoDB CDC Pipeline Source Connector 用于从 MongoDB Collection 读取初始快照,并在快照完成后持续捕获 Change Streams 增量变更。Connector 会根据 BSON 文档推导 Pipeline Schema,并将数据变更发送给下游 Sink。

类别

详情

支持类型

Source

作业类型

Flink CDC Pipeline YAML

运行模式

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

支持的变更类型

INSERT、UPDATE、DELETE

数据格式

MongoDB BSON Document

组件形式

平台内置,无需上传额外 Connector JAR

交付语义

MongoDB CDC Source 基于 Checkpoint 保存快照进度和 Change Stream 读取位置,可提供 Exactly-Once 处理能力。端到端一致性还取决于下游 Sink 的交付语义;对于不支持事务或 Exactly-Once 的下游,建议使用业务主键实现幂等写入。

版本兼容性

组件

支持版本

说明

火山引擎流式计算 Flink 版

  • 1.16.0
  • 1.20.0

Connector 已由平台内置。

Flink CDC

3.4 版本及以上

创建 Pipeline 作业时选择 3.4 或以上版本。

MongoDB

3.6 版本及以上

必须使用副本集或分片集群、WiredTiger 存储引擎和 Replica Set Protocol v1;完整 Changelog 仅适用于 MongoDB 6.0 及以上。

特色功能

  • 支持先读取一致性快照,再无缝切换到 Change Streams 增量读取。
  • 支持从最新位点或指定毫秒时间戳开始消费增量事件。
  • 支持根据采样文档推导 Pipeline Schema。
  • 支持展开嵌套文档、合并数值类型,以及将原始 BSON 类型统一转换为字符串。
  • 支持读取 ts_ms 和 op_ts 元数据,并可选择忽略 Delete 或输出完整 Changelog。

前提条件

  1. 已开通火山引擎流式计算 Flink 版,并准备可用的 Pipeline Sink。
  2. MongoDB 版本为 3.6 或以上,使用副本集或分片集群、WiredTiger 存储引擎和 Replica Set Protocol v1;分片集群应通过 mongos 连接。
  3. Flink 资源池能够访问 MongoDB 地址和端口。
  4. 目标 Collection 中的文档包含非空 _id。
  5. MongoDB 用户至少具有读取目标数据库、Collection 和 Change Streams 的权限。同步多个库或集合、执行快照切分时,还需要列库、列集合、集合统计和读取分片元信息等权限。
  6. 已在 Flink 中创建 MongoDB 用户名、密码等加密变量,不在 YAML 中保存明文凭证。
  7. 使用完整 Changelog 时,MongoDB 版本必须为 6.0 及以上,并已开启数据库级 pre/post image 保留和 Collection 级 changeStreamPreAndPostImages。

使用限制

  • Connector 仅支持作为 Flink CDC Pipeline Source。
  • _id 固定作为 Pipeline 主键,必须非空,且统一转换为 STRING;不能指定其他字段作为主键。
  • Change Streams 不支持 MongoDB Standalone 部署。
  • 初始 Schema 来自有限数量的采样文档。生产使用前应确保采样数据能够覆盖下游需要的字段和主要类型。
  • 默认 Update 不包含完整变更前镜像;完整 Changelog 依赖 MongoDB pre-image。
  • 开启 scan.ignore-delete.enabled 后,下游不会收到 Delete,目标数据可能保留源端已删除记录。
  • latest-offset 不读取任务启动前的存量数据和历史变更;timestamp 只能读取 MongoDB oplog/Change Stream 历史保留范围内的事件。
  • 跳过快照 Backfill 可能使快照阶段发生的变更在切换到增量阶段后重复发送,应由下游幂等处理。
  • 展开嵌套字段时可能发生字段名冲突,应显式选择冲突策略。

语法结构

source:
  type: mongodb
  name: MongoDB Source
  hosts: <mongodb_host>:27017
  username: ${secret_values.mongodb-username}
  password: ${secret_values.mongodb-password}
  connection.options: replicaSet=<replica_set>&authSource=<auth_database>
  database: <database_name>
  collection: <collection_name>
  scan.startup.mode: initial

sink:
  type: values

pipeline:
  name: <pipeline_name>
  parallelism: 2

参数说明

连接与同步范围参数

参数

说明

数据类型

是否必填

默认值

备注

type

Pipeline Source 类型。

STRING

是

无

固定为 mongodb。

name

Source 名称。

STRING

否

无

用于标识 Pipeline 节点。

scheme

MongoDB 连接协议。

STRING

否

mongodb

支持 mongodb、mongodb+srv。

hosts

MongoDB 节点地址。

STRING

是

无

多个 host:port 使用英文逗号分隔;分片集群连接 mongos。

username

MongoDB 用户名。

STRING

条件必填

无

启用认证时与 password 同时配置,建议引用 Flink 加密变量。

password

MongoDB 密码。

STRING

条件必填

无

启用认证时与 username 同时配置,建议引用 Flink 加密变量。

connection.options

MongoDB 连接参数。

STRING

否

无

按 URI Query 格式填写,例如 replicaSet=rs0&authSource=admin。

database

需要同步的数据库。

STRING

是

无

支持正则表达式。

collection

需要同步的 Collection。

STRING

是

无

单集合填写集合名;正则场景需要匹配完全限定 Collection 标识。

启动与增量读取参数

参数

说明

数据类型

是否必填

默认值

备注

scan.startup.mode

Source 启动模式。

STRING

否

initial

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

scan.startup.timestamp-millis

增量读取起始时间。

LONG

条件必填

无

timestamp 模式必填,单位为毫秒且不得为负数。

batch.size

MongoDB Cursor 批次大小。

INTEGER

否

1024

应结合文档大小和内存调整。

poll.max.batch.size

单次轮询最多读取的变更文档数。

INTEGER

否

1024

过大可能增加单批处理延迟和内存占用。

poll.await.time.ms

Change Streams 等待新结果的时间。

LONG

否

1000

单位为毫秒。

heartbeat.interval.ms

心跳间隔。

LONG

否

30000

单位为毫秒;低频变更 Collection 建议保留心跳。

scan.cursor.no-timeout

是否禁用 MongoDB Cursor 超时。

BOOLEAN

否

true

长时间快照建议使用默认值。

scan.ignore-delete.enabled

是否忽略 Delete。

BOOLEAN

否

false

开启后不向下游发送删除事件。

Schema、快照与元数据参数

参数

说明

数据类型

是否必填

默认值

备注

scan.max.pre.fetch.records

初始 Schema 推导的最大采样记录数。

INTEGER

否

50

空 Collection 只生成 _id 主键列。

scan.flatten.nested-documents.enabled

是否展开嵌套文档。

BOOLEAN

否

false

开启后使用点号连接嵌套字段名。

scan.flatten.conflict-strategy

嵌套字段名冲突策略。

STRING

否

fail

支持 fail、overwrite、escape。

scan.all.primitives.as-string.enabled

是否将所有 BSON 原始类型推导为 STRING。

BOOLEAN

否

false

Document 和 Array 仍按复杂类型处理。

scan.local-time-zone

时间值转换使用的时区。

STRING

否

systemDefault

建议显式配置业务时区,例如 Asia/Shanghai。

scan.full-changelog

是否输出完整 Changelog。

BOOLEAN

否

false

仅支持 MongoDB 6.0 及以上;需开启数据库级和 Collection 级 pre/post image。

scan.incremental.snapshot.chunk.size.mb

增量快照 Chunk 大小。

INTEGER

否

64

单位为 MB。

scan.incremental.snapshot.chunk.samples

估算 Chunk 边界使用的采样数。

INTEGER

否

20

—

chunk-meta.group.size

Chunk 元信息分组大小。

INTEGER

否

1000

—

scan.incremental.close-idle-reader.enabled

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

BOOLEAN

否

false

—

scan.incremental.snapshot.backfill.skip

是否跳过快照 Backfill。

BOOLEAN

否

false

开启后可能产生重复事件,下游必须具备幂等能力。

scan.newly-added-table.enabled

是否扫描新增 Collection。

BOOLEAN

否

false

仅对匹配同步范围的新 Collection 生效。

scan.incremental.snapshot.unbounded-chunk-first.enabled

是否优先分配无界 Chunk。

BOOLEAN

否

false

用于降低最后一个 Chunk 同步时的内存压力。

metadata.list

需要读取的元数据字段。

STRING

否

无

多个字段用英文逗号分隔,支持 ts_ms、op_ts。

类型映射

_id 固定映射为 STRING。ObjectId 转换为十六进制字符串;复合文档形式的 _id 转换为字段名排序后的 JSON 字符串。

MongoDB / BSON 类型

Flink CDC 类型

说明

String、ObjectId、Symbol、RegularExpression、JavaScript

STRING

按各类型的字符串表示写入。

Int32

INT

32 位整数。

Int64

BIGINT

64 位整数。

Decimal128

DECIMAL(38, 18)

超出精度或标度范围的数据需要提前验证。

Double

DOUBLE

双精度浮点数。

Boolean

BOOLEAN

布尔值。

Timestamp

TIMESTAMP

按秒级时间和 scan.local-time-zone 转换。

DateTime

TIMESTAMP_LTZ

按 Epoch Milliseconds 转换。

Binary

BYTES

二进制字节数组。

Document

MAP<STRING, valueType>

value 类型由文档字段合并推导。

Array

ARRAY

元素类型由数组内容合并推导。

Null 或缺失字段

取决于上下文

已有字段保留类型;仅出现 Null 的新字段推导为 STRING。

其他 BSON 类型

STRING

使用字符串表示。

类型合并规则

  • 数值候选类型会向更宽类型合并,例如 INT 与 BIGINT 合并为 BIGINT。
  • 任一候选类型为 STRING 时,最终类型为 STRING。
  • Array 元素无法合并时退化为 ARRAY<STRING>。
  • Map Value 无法合并时退化为 MAP<STRING, STRING>。
  • 开启 scan.all.primitives.as-string.enabled 后,数值、布尔、时间和二进制等原始类型统一推导为 STRING。

使用示例

读取全量和增量数据

以下示例从 <database_name>.<collection_name> 读取存量数据,并持续消费 Change Streams。values Sink 用于验证 Source 产生的数据。

source:
  type: mongodb
  name: MongoDB Source
  hosts: <mongodb_host>:27017
  username: ${secret_values.mongodb-username}
  password: ${secret_values.mongodb-password}
  connection.options: replicaSet=<replica_set>&authSource=<auth_database>
  database: <database_name>
  collection: <collection_name>
  scan.startup.mode: initial
  scan.max.pre.fetch.records: 50
  scan.local-time-zone: Asia/Shanghai

sink:
  type: values

pipeline:
  name: MongoDB CDC Pipeline
  parallelism: 2

预期结果。 Source 先输出 Collection 已有文档,再持续输出新增、更新和删除事件;_id 作为字符串主键发送给下游。

从指定时间戳读取增量数据

source:
  type: mongodb
  hosts: <mongodb_host>:27017
  username: ${secret_values.mongodb-username}
  password: ${secret_values.mongodb-password}
  database: <database_name>
  collection: <collection_name>
  scan.startup.mode: timestamp
  scan.startup.timestamp-millis: <epoch_milliseconds>

该时间必须位于 MongoDB 仍可恢复的 Change Stream 历史范围内,否则作业无法从指定位点启动。

输出完整 Changelog

scan.full-changelog: true 会使用 MongoDB pre-image 和 post-image 生成 Insert、Update Before、Update After 和 Delete。按照 Apache Flink CDC 官方 MongoDB Connector 文档,需要完成以下配置。

  1. 使用 MongoDB 6.0 或以上版本。
  2. 在数据库级配置 pre/post image 保留时间。以下示例使用 MongoDB 默认保留策略:
db.runCommand({
  setClusterParameter: {
    changeStreamOptions: {
      preAndPostImages: {
        expireAfterSeconds: "off"
      }
    }
  }
})
  1. 为需要同步的 Collection 开启 pre/post image:
db.runCommand({
  collMod: "<collection_name>",
  changeStreamPreAndPostImages: {
    enabled: true
  }
})
  1. 在 Source 中开启完整 Changelog:
source:
  type: mongodb
  # 其他连接参数
  scan.full-changelog: true

pre/post image 的保留时间应覆盖作业可能的消费延迟和恢复时间。镜像已过期或未启用时,无法生成完整变更前数据。

运行机制

initial 模式首先按快照 Chunk 并行读取已有文档,快照完成后切换到 Change Streams。MongoDB CDC Source 基于 Checkpoint 保存快照进度和 Change Stream 读取位置,可提供 Exactly-Once 处理能力。端到端一致性还取决于下游 Sink 的交付语义;对于不支持事务或 Exactly-Once 的下游,建议使用业务主键实现幂等写入。
Connector 对采样文档执行初始 Schema 推导。生产使用前应使用具有代表性的文档验证字段和类型映射,并确保下游 Schema 与推导结果兼容。
默认 Update 主要输出更新后的文档。启用 scan.full-changelog 后,Connector 会尝试读取 Update/Delete 前的文档镜像;MongoDB 未返回 pre-image 时,变更前数据可能为空或仅包含文档键。

验证与排障

验证方法

  1. 启动作业并确认进入运行状态,日志中没有网络、鉴权、Change Streams 或 Schema 推导错误。
  2. 等待初始快照完成,核对下游主键数与 MongoDB Collection 文档数。
  3. 新增、更新和删除同一 _id 文档,确认下游收到对应变更。
  4. 等待成功 Checkpoint 后执行受控重启,确认作业从保存位点恢复且最终数据正确。
  5. 使用完整 Changelog 时,更新并删除测试文档,确认下游能够读取变更前镜像。

常见问题

现象

可能原因

处理建议

无法创建 Change Stream

MongoDB 为 Standalone、权限不足,或连接的节点不正确。

使用副本集或分片集群;分片集群连接 mongos,并检查用户权限。

指定时间戳启动失败

时间早于 oplog/Change Stream 可恢复范围。

选择仍在保留范围内的时间,或改用 initial 重新执行快照。

Update/Delete 没有变更前数据

未开启完整 Changelog,或 MongoDB 未启用/已清理 pre-image。

检查 scan.full-changelog、MongoDB 版本、Collection pre-image 和保留时间。

下游保留已删除文档

Source 开启了 scan.ignore-delete.enabled,或 Sink 不处理 Delete。

关闭忽略 Delete,并核对 Sink 的删除语义。

恢复时报 Resume Token 无效

Change Stream 历史或 Resume Token 已过期。

检查 oplog 保留窗口、心跳和作业停机时长,必要时重新执行快照。

注意事项

  • 不要在需要同步删除的链路中开启 scan.ignore-delete.enabled。
  • scan.incremental.snapshot.backfill.skip: true 可能产生重复事件,只适用于下游具备幂等能力的场景。
  • 初始 Schema 由采样文档推导,生产使用前应使用代表性数据验证字段覆盖和类型映射。
  • MongoDB 密码必须通过 Flink 加密变量引用,不要明文写入 Pipeline YAML。
  • timestamp 和 Checkpoint 恢复依赖 MongoDB Change Stream 历史保留,停机时间不得超过可恢复窗口。

相关文档

最近更新时间:2026.07.31 09:06:39
这个页面对您有帮助吗?
有用
有用
无用
无用