Kafka 消费者意外地重新平衡

Posted

技术标签:

【中文标题】Kafka 消费者意外地重新平衡【英文标题】:Kafka consumers rebalance unexpectedly 【发布时间】:2018-05-23 21:00:41 【问题描述】:

我们在 Java Kafka 消费者中看到了意想不到的重新平衡,如下所述。这些问题对任何人来说都很熟悉吗?有任何关于 API 或调试技术的提示来找出重新平衡的原因吗?

    两个进程正在读取一个主题。有时,主题上的所有分区都会重新平衡到单个读取器进程。重新启动这两个进程后,分区变得均衡。

    两个进程正在读取一个主题。有时,一长串的重新平衡会在阅读器之间反弹分区。我们在消费者上调用暂停/恢复来获得背压,这应该可以防止这种情况发生。

    两个进程正在读取一个主题。有时,当看起来两个进程都读取正常时,会发生重新平衡。之后,阅读工作正常,但在处理过程中出现了问题。

我们预计分区不会在没有看到某些原因或故障的情况下重新平衡。

有时poll() 会卡住(超过超时时间),我们使用wakeup()close(),然后创建新的消费者。有时协调器心跳线程在消费者关闭后继续运行(我们已经看到了数千个)。时间似乎与重新平衡无关,因此重新平衡似乎是一个单独的问题,但也许心跳遇到了未记录的网络问题。

我们使用ConsumerRebalanceListener 来记录和处理某些重新平衡,但 Kafka API 似乎没有公开有关重新平衡原因的数据。

重新平衡是间歇性的,难以重现。它们以每秒 10,000 到 80,000 条的消息速率发生。我们在日志中看不到明显的错误。

我们的读取循环很简单 - 基本上是“在运行时,通过超时和错误处理轮询,然后将接收到的消息排入队列”。

人们提出了很好的相关问题,但答案对我们没有帮助:

Conditions in which Kafka Consumer (Group) triggers a rebalance What exactly IS Kafka Rebalancing? Continuous consumer group rebalancing with more consumers than partitions

配置:

    Kafka 0.10.1.0(我们已经开始尝试 1.0.0,还没有测试结果) Java 8 代理和客户端 2 个代理,1 个 Zookeeper,稳定运行的进程,无需添加 5 个主题,其中 2 个有点忙。重新平衡发生在一个忙碌的人(主题“A”)。 主题 A 有 16 个分区和复制 2 个,并且在消费者开始之前创建。 一个进程写入主题 A;从主题 A 读取的两个进程。 每个读取器进程运行 16 个消费者。当 16 个分区均匀平衡时,部分消费者处于空闲状态。 消费者线程在轮询之间几乎不做任何工作。消息处理在与消费者不同的线程上异步进行。 主题 A 的所有消费者都在同一个消费者组中。 KafkaConsumer.poll() 的超时时间为 1000 毫秒。

    影响再平衡的配置是:

      max.poll.interval.ms=50000 max.poll.records=100 request.timeout.ms=40000

      session.timeout.ms=20000

      我们对这些使用默认值:

      heartbeat.interval.ms=3000 (经纪人)group.max.session.timeout.ms=300000 (经纪人)group.min.session.timeout.ms=6000

【问题讨论】:

我们也遇到了同样的问题。 Kafka 0.10.0.1,12 个主题,每个主题有 10 个分区。每个主题都有不同的CG。有时一些 CG 重新平衡超过 5 分钟。进程重新启动后,一些 CG 需要长达 10 分钟才能开始消耗。自过去 2 个月以来没有找到任何解决方案,没有任何帮助 重新平衡是否足够快?因为日志清理器问题,我遇到了小组协调员的问题。您是否考虑过升级到此次要版本 (0.10.2.3) 的最新版本? 【参考方案1】:

查看gc日志,确保没有频繁的full gc,否则会导致心跳线程无法正常工作。

【讨论】:

以上是关于Kafka 消费者意外地重新平衡的主要内容,如果未能解决你的问题,请参考以下文章

在Kafka重新平衡中是否撤销操作等消耗过程完成?

即使我暂停消费者,Spring Kafka 也总是在 5 分钟后重新平衡

由于消费者速度较慢,Kafka 重新平衡主题中的数据

消费者再平衡如何在 Kafka 中工作?

KafKa消费者组重平衡能避免吗

Kafka重平衡机制