【发布时间】:2020-08-24 00:24:50
【问题描述】:
问题
我们使用 StatefulSet 在 Kubernetes 上部署 Scala Kafka Streams 应用程序。这些实例具有单独的applicationIds,因此它们每个都复制完整的输入主题以实现容错。它们本质上是只读服务,仅读取状态主题并将其写入状态存储,从该存储中通过 REST 服务客户请求。这意味着,在任何给定时间,消费者组始终只包含一个单个 Kafka Streams 实例。
我们现在的问题是,在触发滚动重启时,每个实例大约需要 5 分钟才能启动,其中大部分时间都花在等待 REBALANCING 状态。我读过here,Kafka Streams 不会发送LeaveGroup 请求,以便在容器重启后快速返回,无需重新平衡。为什么这对我们不起作用?为什么重新平衡需要这么长时间,即使 applicationId 是相同的?理想情况下,为了最大限度地减少停机时间,应用程序应立即从其重新启动时离开的位置接管。
配置
以下是我们从默认值更改的一些配置:
properties.put(StreamsConfig.consumerPrefix(ConsumerConfig.MAX_POLL_RECORDS_CONFIG), "1000")
properties.put(StreamsConfig.consumerPrefix(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG), "300000")
properties.put(StreamsConfig.consumerPrefix(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG), "earliest")
// RocksDB config, see https://docs.confluent.io/current/streams/developer-guide/memory-mgmt.html
properties.put(StreamsConfig.ROCKSDB_CONFIG_SETTER_CLASS_CONFIG, classOf[BoundedMemoryRocksDBConfig])
问题/相关配置
- 减少
session.timeout.ms会有所帮助吗?我们将其设置为相当大的值,因为 Kafka 代理位于不同的数据中心,并且网络连接有时不是超级可靠。 -
This answer 建议减少
max.poll.interval.ms,因为它与重新平衡超时有关。那是对的吗?我很犹豫是否要更改此设置,因为它可能会对我们应用的正常运行模式产生影响。 -
There is mention 配置
group.initial.rebalance.delay.ms在部署期间延迟重新平衡 - 但这也会在从崩溃中恢复后导致延迟,不是吗? - 我还偶然发现了KIP-345,它旨在完全通过
group.instance.id消除消费者对静态会员的重新平衡,这非常适合我们的用户案例,但它似乎还没有在我们的代理上可用。
我对大量配置以及如何使用它们在更新后启用快速恢复感到困惑。谁能解释一下他们是怎么一起玩的?
【问题讨论】:
标签: java kubernetes apache-kafka apache-kafka-streams