恢复Kakfa-MongoDB源连接器流中丢失的令牌

时间:2020-09-08 15:31:48

标签: mongodb apache-kafka apache-kafka-connect confluent-platform mongodb-kafka-connector

我正在使用Confluent Platform v5.4,Mongo DB 3.6版和Kafka Mongo DB连接器。我已经配置了Kafka Mongo DB源连接器,以便在Mongo DB Collection中创建新记录时将数据从Mongo DB推送到Kafka主题。我已将我的Kafka代理配置为将数据日志保留1天,之前已将其设置为默认配置7天。现在我的问题是,我在Mongo DB日志中反复遇到这样的错误-

2020-09-08T14:58:34.500+0000 I COMMAND  [conn66] command local.oplog.rs command: aggregate { aggregate: "topic_1", pipeline: [ { $changeStream: { fullDocument: "default", resumeAfter: { _data: BinData(0, 825F50DCCE00000008463C5F6964003C35363962633732642D386430352D343034622D616262362D64363632656136663464303000005A1004B31FA99AA5C141CB9EE9AA845877B80D04) } } } ], cursor: {}, $db: "ctc", $clusterTime: { clusterTime: Timestamp(1599577091, 6), signature: { hash: BinData(0, 6550821FD90928ABC3A2DFE066FC34E824A83762), keyId: 6847473605622628353 } }, lsid: { id: UUID("2a2e5878-4743-4e83-a4fd-eed68b5efe02") }, $readPreference: { mode: "primaryPreferred" } } planSummary: COLLSCAN exception: resume of change stream was not possible, as the resume token was not found. {_data: BinData(0, "825F579ACE00000008463C5F6964003C31313632333863352D316561612D343961652D613437632D30366263336131333436313900005A1004B31FA99AA5C141CB9EE9AA845877B80D04")} code:ChangeStreamFatalError numYields:8932 reslen:455 locks:{ Global: { acquireCount: { r: 17872 }, acquireWaitCount: { r: 97 }, timeAcquiringMicros: { r: 350686 } }, Database: { acquireCount: { r: 8936 } }, Collection: { acquireCount: { r: 1 } }, oplog: { acquireCount: { r: 8935 } } } protocol:op_msg 22198ms

我了解到,在Kafka主题和Mongo DB的Oplog之间,有一个恢复令牌,该令牌被共享以保持数据流正常运行。但是有时Oplog会被清空(因为Oplog的大小只能占分配给Mongo DB的内存的一部分),或者会删除与Kafka主题相对应的数据,从而导致流破裂。

我的问题是-如何避免溪流破裂?如何确定Oplog和Kafka主题中始终存在恢复令牌?有什么方法可以从可用位置手动获取恢复令牌并在丢失的地方更新恢复令牌?

1 个答案:

答案 0 :(得分:0)

与4.4兼容的驱动程序进行了更改,以处理很长一段时间没有任何更改的更改流恢复令牌,这些令牌从oplog的末尾掉落。 here的用户端是针对Ruby驱动程序的;根据需要适应Java。关键是您需要使用tryNext并从更改流中而不是从返回的更改文档中读取恢复令牌。

如果您要执行上述所有操作,则需要:

  • 增加操作日志窗口并保留更多操作日志,或者
  • 更快地处理更改以保留在操作日志窗口中。