MongoDB CDC Pipeline Source Connector 用于从 MongoDB Collection 读取初始快照,并在快照完成后持续捕获 Change Streams 增量变更。Connector 会根据 BSON 文档推导 Pipeline Schema,并将数据变更发送给下游 Sink。
类别 | 详情 |
|---|---|
支持类型 | Source |
作业类型 | Flink CDC Pipeline YAML |
运行模式 | 流模式; |
支持的变更类型 | INSERT、UPDATE、DELETE |
数据格式 | MongoDB BSON Document |
组件形式 | 平台内置,无需上传额外 Connector JAR |
交付语义 | MongoDB CDC Source 基于 Checkpoint 保存快照进度和 Change Stream 读取位置,可提供 Exactly-Once 处理能力。端到端一致性还取决于下游 Sink 的交付语义;对于不支持事务或 Exactly-Once 的下游,建议使用业务主键实现幂等写入。 |
组件 | 支持版本 | 说明 |
|---|---|---|
火山引擎流式计算 Flink 版 |
| Connector 已由平台内置。 |
Flink CDC | 3.4 版本及以上 | 创建 Pipeline 作业时选择 3.4 或以上版本。 |
MongoDB | 3.6 版本及以上 | 必须使用副本集或分片集群、WiredTiger 存储引擎和 Replica Set Protocol v1;完整 Changelog 仅适用于 MongoDB 6.0 及以上。 |
ts_ms 和 op_ts 元数据,并可选择忽略 Delete 或输出完整 Changelog。mongos 连接。_id。changeStreamPreAndPostImages。_id 固定作为 Pipeline 主键,必须非空,且统一转换为 STRING;不能指定其他字段作为主键。scan.ignore-delete.enabled 后,下游不会收到 Delete,目标数据可能保留源端已删除记录。latest-offset 不读取任务启动前的存量数据和历史变更;timestamp 只能读取 MongoDB oplog/Change Stream 历史保留范围内的事件。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
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Pipeline Source 类型。 | STRING | 是 | 无 | 固定为 |
| Source 名称。 | STRING | 否 | 无 | 用于标识 Pipeline 节点。 |
| MongoDB 连接协议。 | STRING | 否 |
| 支持 |
| MongoDB 节点地址。 | STRING | 是 | 无 | 多个 |
| MongoDB 用户名。 | STRING | 条件必填 | 无 | 启用认证时与 |
| MongoDB 密码。 | STRING | 条件必填 | 无 | 启用认证时与 |
| MongoDB 连接参数。 | STRING | 否 | 无 | 按 URI Query 格式填写,例如 |
| 需要同步的数据库。 | STRING | 是 | 无 | 支持正则表达式。 |
| 需要同步的 Collection。 | STRING | 是 | 无 | 单集合填写集合名;正则场景需要匹配完全限定 Collection 标识。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| Source 启动模式。 | STRING | 否 |
| 支持 |
| 增量读取起始时间。 | LONG | 条件必填 | 无 |
|
| MongoDB Cursor 批次大小。 | INTEGER | 否 |
| 应结合文档大小和内存调整。 |
| 单次轮询最多读取的变更文档数。 | INTEGER | 否 |
| 过大可能增加单批处理延迟和内存占用。 |
| Change Streams 等待新结果的时间。 | LONG | 否 |
| 单位为毫秒。 |
| 心跳间隔。 | LONG | 否 |
| 单位为毫秒;低频变更 Collection 建议保留心跳。 |
| 是否禁用 MongoDB Cursor 超时。 | BOOLEAN | 否 |
| 长时间快照建议使用默认值。 |
| 是否忽略 Delete。 | BOOLEAN | 否 |
| 开启后不向下游发送删除事件。 |
参数 | 说明 | 数据类型 | 是否必填 | 默认值 | 备注 |
|---|---|---|---|---|---|
| 初始 Schema 推导的最大采样记录数。 | INTEGER | 否 |
| 空 Collection 只生成 |
| 是否展开嵌套文档。 | BOOLEAN | 否 |
| 开启后使用点号连接嵌套字段名。 |
| 嵌套字段名冲突策略。 | STRING | 否 |
| 支持 |
| 是否将所有 BSON 原始类型推导为 STRING。 | BOOLEAN | 否 |
| Document 和 Array 仍按复杂类型处理。 |
| 时间值转换使用的时区。 | STRING | 否 |
| 建议显式配置业务时区,例如 |
| 是否输出完整 Changelog。 | BOOLEAN | 否 |
| 仅支持 MongoDB 6.0 及以上;需开启数据库级和 Collection 级 pre/post image。 |
| 增量快照 Chunk 大小。 | INTEGER | 否 |
| 单位为 MB。 |
| 估算 Chunk 边界使用的采样数。 | INTEGER | 否 |
| — |
| Chunk 元信息分组大小。 | INTEGER | 否 |
| — |
| 快照结束后是否关闭空闲 Reader。 | BOOLEAN | 否 |
| — |
| 是否跳过快照 Backfill。 | BOOLEAN | 否 |
| 开启后可能产生重复事件,下游必须具备幂等能力。 |
| 是否扫描新增 Collection。 | BOOLEAN | 否 |
| 仅对匹配同步范围的新 Collection 生效。 |
| 是否优先分配无界 Chunk。 | BOOLEAN | 否 |
| 用于降低最后一个 Chunk 同步时的内存压力。 |
| 需要读取的元数据字段。 | STRING | 否 | 无 | 多个字段用英文逗号分隔,支持 |
_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 | 按秒级时间和 |
DateTime | TIMESTAMP_LTZ | 按 Epoch Milliseconds 转换。 |
Binary | BYTES | 二进制字节数组。 |
Document | MAP<STRING, valueType> | value 类型由文档字段合并推导。 |
Array | ARRAY | 元素类型由数组内容合并推导。 |
Null 或缺失字段 | 取决于上下文 | 已有字段保留类型;仅出现 Null 的新字段推导为 STRING。 |
其他 BSON 类型 | STRING | 使用字符串表示。 |
ARRAY<STRING>。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 历史范围内,否则作业无法从指定位点启动。
scan.full-changelog: true 会使用 MongoDB pre-image 和 post-image 生成 Insert、Update Before、Update After 和 Delete。按照 Apache Flink CDC 官方 MongoDB Connector 文档,需要完成以下配置。
db.runCommand({ setClusterParameter: { changeStreamOptions: { preAndPostImages: { expireAfterSeconds: "off" } } } })
db.runCommand({ collMod: "<collection_name>", changeStreamPreAndPostImages: { enabled: true } })
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 时,变更前数据可能为空或仅包含文档键。
_id 文档,确认下游收到对应变更。现象 | 可能原因 | 处理建议 |
|---|---|---|
无法创建 Change Stream | MongoDB 为 Standalone、权限不足,或连接的节点不正确。 | 使用副本集或分片集群;分片集群连接 |
指定时间戳启动失败 | 时间早于 oplog/Change Stream 可恢复范围。 | 选择仍在保留范围内的时间,或改用 |
Update/Delete 没有变更前数据 | 未开启完整 Changelog,或 MongoDB 未启用/已清理 pre-image。 | 检查 |
下游保留已删除文档 | Source 开启了 | 关闭忽略 Delete,并核对 Sink 的删除语义。 |
恢复时报 Resume Token 无效 | Change Stream 历史或 Resume Token 已过期。 | 检查 oplog 保留窗口、心跳和作业停机时长,必要时重新执行快照。 |
scan.ignore-delete.enabled。scan.incremental.snapshot.backfill.skip: true 可能产生重复事件,只适用于下游具备幂等能力的场景。timestamp 和 Checkpoint 恢复依赖 MongoDB Change Stream 历史保留,停机时间不得超过可恢复窗口。