Apache kafka Kafka Connect将同一任务分配给多个工作人员

Apache kafka Kafka Connect将同一任务分配给多个工作人员,apache-kafka,apache-kafka-connect,Apache Kafka,Apache Kafka Connect,我正在分布式模式下使用Kafka Connect。我现在多次观察到的一个奇怪行为是,经过一段时间(可能是几个小时,也可能是几天),似乎出现了一个平衡错误:相同的任务分配给多个工作人员。因此,它们会并发运行,并且根据连接器的性质,会出现故障或产生“不可预测”的输出 我能够用来重现该行为的最简单配置是:两个Kafka Connect Worker、两个连接器,每个连接器仅具有一个任务。卡夫卡连接被部署到Kubernetes。卡夫卡本身就处在一片云雾之中。卡夫卡连接和卡夫卡都是同一版本(5.3.1)

我正在分布式模式下使用Kafka Connect。我现在多次观察到的一个奇怪行为是,经过一段时间(可能是几个小时,也可能是几天),似乎出现了一个平衡错误:相同的任务分配给多个工作人员。因此,它们会并发运行,并且根据连接器的性质,会出现故障或产生“不可预测”的输出

我能够用来重现该行为的最简单配置是:两个Kafka Connect Worker、两个连接器,每个连接器仅具有一个任务。卡夫卡连接被部署到Kubernetes。卡夫卡本身就处在一片云雾之中。卡夫卡连接和卡夫卡都是同一版本(5.3.1)

日志中的相关消息:

工人A:

[2019-10-30 12:44:23,925] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Successfully joined group with generation 488 (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:469)
[2019-10-30 12:44:23,926] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Joined group at generation 488 and got assignment: Assignment{error=0, leader='connect-1-d5c19893-b33c-4f07-85fb-db9736795759', leaderUrl='http://10.16.0.15:8083/', offset=250, connectorIds=[some-hdfs-sink, some-mqtt-source], taskIds=[some-hdfs-sink-0, some-mqtt-source-0], revokedConnectorIds=[], revokedTaskIds=[], delay=0} (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1397)
工人B:

[2019-10-30 12:44:23,930] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Successfully joined group with generation 488 (org.apache.kafka.clients.consumer.internals.AbstractCoordinator:469)
[2019-10-30 12:44:23,936] INFO [Worker clientId=connect-1, groupId=some-kafka-connect-cluster] Joined group at generation 488 and got assignment: Assignment{error=0, leader='connect-1-d5c19893-b33c-4f07-85fb-db9736795759', leaderUrl='http://10.16.0.15:8083/', offset=250, connectorIds=[some-mqtt-source], taskIds=[some-mqtt-source-0], revokedConnectorIds=[], revokedTaskIds=[], delay=0} (org.apache.kafka.connect.runtime.distributed.DistributedHerder:1397)
在上面的日志提取中,您可以观察到相同的任务(
some-mqtt-source-0
)被分配给了两个工人。在该消息之后,我还可以通过两个worker上的任务实例查看日志消息

这种行为不依赖于连接器(我在其他任务中也观察到)。它也不会在工人开始工作后立即发生,但只会在一段时间后发生

我的问题是这种行为的原因是什么

编辑1: 我试着让3名员工,而不是两名员工,认为这可能是一个分布式共识问题。事实似乎并非如此,拥有3名员工并不能解决问题

编辑2: 我注意到,就在工作人员a被分配最初在工作人员B上运行的任务之前,该工作人员(B)观察到加入组时出错。例如,如果任务在第N代中“重复”,则工人B将不会在日志中显示“成功加入N代组”消息。更重要的是,在N-1代和N+1代之间,工人B通常会记录一些错误,例如,由于成员id和
组协调员bx-xxx-xxxxx.europe-west1.gcp.confluent.cloud:9092(id:1234567890 rack:null)不可用或无效
。工人B通常在N代之后不久加入N+1代(有时仅在大约3秒钟之后)。现在很清楚是什么触发了这种行为。然而:

  • 虽然我了解到可能会出现这样的暂时性问题,而且在一般情况下可能是正常的,为什么在所有服务器成功加入下一代后,不重新平衡解决这个问题呢?尽管随后会有更多的重新平衡,但它不会正确地分配任务,并永远保留“重复项”(直到我重新启动workers)

  • 在某些时期,再平衡几乎每几个小时发生一次,在其他时期,每5分钟发生一次(精确到几秒钟);原因可能是什么?什么是正常的

  • 鉴于我使用合流云,出现“组协调器不可用或无效”错误的原因可能是什么?Kafka Connect中是否有任何配置参数可以调整,以使其更能适应此错误?我知道有
    session.timeout.ms
    heartbeat.interval.ms
    ,但是,将这些参数更改为更小或更大的值会产生什么样的实际影响,这是非常简单的

编辑3: 我观察到,这个问题对于接收器任务来说并不重要:虽然相同的接收器任务被分配给多个工作者,但相应的使用者被分配到不同的分区,就像他们通常应该的那样,并且一切都几乎正常工作——我只是得到了比我最初要求的更多的任务。但是,对于源任务,行为是破坏的-任务同时运行并在源端争夺资源

编辑4
与此同时,我将Kafka Connect降级为2.2版(Confluent Platform 5.2.3)——一个预版本。它在过去的两天内工作正常。因此,我假设这种行为与新的再平衡机制有关

如评论中所述,是为了解决这个问题而提出的,并且已经解决了

该修复程序在2.3.2及更高版本中可用


因此,现在的答案是:升级到最新版本应该可以防止出现此问题。

根据Apache Kafka Jira ticket: