4.4. 设置 MongoDB 以使用 Debezium 连接器
MongoDB 连接器使用 MongoDB 的更改流来捕获更改,因此连接器只适用于 MongoDB 副本集,或者每个分片都是一个单独的副本集的分片集群。有关设置 副本集或 分片集群,请参阅 MongoDB 文档。另外,请务必了解如何使用副本集启用 访问控制和身份验证。
您还必须有一个 MongoDB 用户,该用户具有适当的角色才能读取 oplog 的 admin
数据库。此外,用户还必须能够在分片集群的配置服务器中读取配置数据库,并且必须具有 listDatabases
特权操作。当使用更改流(默认)时,用户还必须具有集群范围的特权操作
查找和
changeStream
。
当您打算使用 pre-image 并填充 before
字段时,您需要首先为一个集合启用 changeStreamPreAndPostImages
,使用 db.createCollection()
, create
, 或 collMod
。
最佳 Oplog 配置
Debezium MongoDB 连接器读取 更改流,以获取副本集的 oplog 数据。因为 oplog 是一个固定的、大写的集合,如果超过其最大配置的大小,它开始覆盖其最旧的条目。如果出于某种原因停止连接器,在重启时,它会尝试从最后一个 oplog 流位置恢复流。但是,如果最后一个流位置从 oplog 中删除,具体取决于连接器的 snapshot.mode
属性中指定的值,则连接器可能无法启动,报告 无效的恢复令牌错误。如果失败,您必须创建一个新的连接器,以便 Debezium 继续从数据库捕获记录。如需更多信息,如果 snapshot.mode 设置为 initial,则 Connector 会在停止很长时间后失败。
为确保 oplog 保留 Debezium 恢复流所需的偏移值,您可以使用以下任一方法:
- 增加 oplog 的大小。根据您的典型工作负载,将 oplog 大小设置为大于每小时的峰值 oplog 条目数的值。
- 增加 oplog 条目保留的最小小时数(MongoDB 4.4 及更高版本)。此设置基于时间,因此即使 oplog 达到其最大配置的大小,可以保证最后一个 n 小时中的条目可用。虽然这通常是首选选择,但对于具有接近容量的高工作负载的集群,请指定最大 oplog 大小。
为了帮助防止与缺少 oplog 条目相关的失败,跟踪报告复制行为的指标非常重要,并优化 oplog 大小以支持 Debezium。特别是,您应该监控 Oplog GB/Hour 和 Replication Oplog Window 的值。如果 Debezium 离线,超过复制 oplog 窗口的值,并且主 oplog 比 Debezium 可以消耗条目的速度增长,则连接器失败可能会导致。
有关如何监控这些指标的详情,请参考 MongoDB 文档。
最好将最大 oplog 大小设置为基于 oplog 的每小时增长的值(Oplog GB/Hour),乘以处理 Debezium 失败所需的时间。
也就是说,
oplog GB/Hour
X average reaction time to Debezium 失败
例如,如果 oplog 大小限制为 1GB,并且 oplog 每小时增长 3GB,则 oplog 条目会每小时清除三次。如果 Debezium 在此期间失败,则其最后一个 oplog 位置可能会被删除。
如果 oplog 的增长率为 3GB/hour,并且 Debezium 在 2 小时内处于离线状态,您可以将 oplog 大小设置为 3GB/hour X 2 hours 或 6GB。