如何以避免从其变更日志主题重新创建状态存储的方式重新启动 KafkaStreams 消费者组

问题描述 投票:0回答:2

在多个节点托管具有持久状态存储的 KafkaStreams (0.10.2.1) 实例的部署中,重新启动所有节点同时避免重播整个状态存储变更日志主题的推荐方法是什么?这必须在不更改 application.id 的情况下完成,因为我不想丢失状态存储中已有的数据。

我增加了 session.timeout.ms ,以便在代理开始重新分配分区时所有节点都已启动,并避免调用 KafkaStreams.stop 以防止不必要的分区重新分配,因为我在部署期间重新启动所有节点。

当代理开始重新分配分区时(在所有节点都启动之后),KafkaStreams 实例似乎正在重播整个状态存储变更日志主题,而不是从它们在重新启动之前到达的偏移量开始。

我想为了从最新的偏移量中选择,必须满足这些条件:

1) 分区将被分配给包含其匹配持久存储的实例。

2) KafkaStreams 将从变更日志主题中的最新偏移量中获取,而不是重播整个变更日志。

有没有办法实现这个目标?

apache-kafka-streams
2个回答
2
投票

Kafka Streams 写入本地状态和本地检查点文件,用于跟踪状态存储的运行状况。如果检查点文件丢失,则表明状态存储已损坏,因此 Kafka Streams 会清除该存储并通过重播状态存储的更改日志主题从头开始重新创建它。

这些本地检查点文件仅在

0.10.2.1
中干净关闭时写入。因此,当您不调用
KafakStreams#close()
时,您不会得到干净的关闭(这也可能会破坏您的状态,因为某些写入可能尚未刷新到磁盘)。

在 Kafka

0.11.0.x
中,本地检查点文件会在每次提交时写入,从而允许更积极地重用本地状态存储。

我强烈建议升级到 0.11.0.1 或 1.0.0(即将发布)——它包含有关状态存储处理和重新平衡的许多改进。请注意,您不需要为此升级代理,因为 Kafka Streams 也与旧代理兼容(参见 https://docs.confluence.io/current/streams/upgrade-guide.html#compatibility )


0
投票

您可以使用静态会员资格。您可以使用 StreamsConfig 中的 group.instance.id 启用此功能。 另请确保配置合理的 session.timeout,以便实例有足够的时间重新启动。

© www.soinside.com 2019 - 2024. All rights reserved.