如何以避免从其changelog主题重新创建状态存储的方式重新启动KafkaStreams使用者组

时间:2017-10-28 15:22:47

标签: apache-kafka-streams

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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.confluent.io/current/streams/upgrade-guide.html#compatibility