Kafka 消费者意外重新平衡

9
我们发现Java Kafka消费者出现了意外的重新平衡,如下所述。这些问题是否有人熟悉?有没有关于API或调试技术的提示来确定重新平衡的原因?
  1. 两个进程正在读取一个主题。有时主题上的所有分区都会重新平衡到单个读取进程。重新启动两个进程后,分区会平均分配。
  2. 两个进程正在读取一个主题。有时一长串的重新平衡会将分区从读取者反弹到读取者。我们对消费者进行暂停/恢复以进行背压,应该可以防止这种情况。
  3. 两个进程正在读取一个主题。有时候当看起来两个进程都在正常读取时会发生重新平衡。之后,读取工作正常,但处理中出现了小问题。
我们希望分区不会重新平衡而没有任何原因或故障。
有时候poll()会卡住(超过超时时间),我们使用wakeup()close(),然后创建新的消费者。有时协调器心跳线程在消费者关闭后仍然运行(我们见过成千上万次)。时间似乎与重新平衡无关,因此重新平衡似乎是一个单独的问题,但也许心跳正在遇到未记录的网络问题。
我们使用ConsumerRebalanceListener来记录和处理某些重新平衡,但Kafka API似乎不会公开有关重新平衡原因的数据。
重新平衡是间歇性的,很难复现。它们发生在每秒10,000到80,000个消息的速率下。我们在日志中没有看到明显的错误。
我们的读取循环非常简单 - 基本上是“当运行时,使用超时和错误处理进行轮询,然后将接收到的消息加入队列”。
人们问了一些相关的好问题,但答案并没有帮助我们: 配置:
  1. Kafka 0.10.1.0 (我们已经开始尝试1.0.0,但还没有测试结果)
  2. Java 8代理和客户端
  3. 2个代理,1个Zookeeper,稳定运行的进程并且没有增加
  4. 5个主题,其中2个主题有一定的活动量。重新平衡发生在繁忙的主题(主题“ A”)上。
  5. 主题A有16个分区和复制2,并且是在消费者启动之前创建的。
  6. 一个进程写入主题A; 两个进程从主题A读取。
  7. 每个读取进程运行16个消费者。当16个分区平均平衡时,一些消费者处于空闲状态。
  8. 消费者线程在轮询之间做很少的工作。消息处理在与消费者不同的线程上异步进行。
  9. 所有主题A的消费者都在同一个消费者组中。
  10. KafkaConsumer.poll()的超时时间为1000毫秒。
  11. 影响重新平衡的配置是:

    1. max.poll.interval.ms = 50000
    2. max.poll.records = 100
    3. request.timeout.ms = 40000
    4. session.timeout.ms = 20000

      我们对这些使用默认值:

    5. heartbeat.interval.ms = 3000
    6. (broker) group.max.session.timeout.ms = 300000
    7. (broker) group.min.session.timeout.ms = 6000

我们也遇到了同样的问题。Kafka 0.10.0.1,每个主题有12个分区。每个主题都有不同的CG。有时候一些CG会重新平衡超过5分钟。在进程重新启动后,有些CG需要最多10分钟才能开始消费。自从两个月前以来一直没有找到任何解决方案,也没有得到任何帮助。 - Shades88
重平衡速度快吗?我问这个问题是因为我曾经因日志清理问题而遇到了组协调器的问题。 你考虑过升级到此次小版本(0.10.2.3)的最新版本吗? - Lior Chaga
1个回答

0

检查gc日志,确保没有频繁的full gc,这会阻止心跳线程的工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接