首页 > 解决方案 > 由于代理关闭,流的更改日志和重新分区分区的子集不可用 - 流应该如何表现?

问题描述

我的设置包括 3 个 kafka 代理(2.11-1.1.1)、一个 ZK 和一个使用 Streams API 的 java 服务。

Java 服务从主题 A 消费,执行持久流操作(由更改日志和重新分区流主题备份)并写入主题 B。启用 EOS 语义。

鉴于更改日志和重新分区主题的复制因子为 1,如果我的一个代理关闭(例如,在我的 DEV 环境中,只有一个代理的磁盘已满),流 java 应用程序应该如何表现。即使无法访问 1/3 的更改日志和重新分区分区,流是否会继续消耗?

编辑:还考虑到主题 A、B 和 __consumer_offsets 的 RF=3。

在我的 java 服务日志中,我看到:

2019-01-04 09:14:38,787 UTC WARN kafka-producer-network-thread | trsb-app- 
nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-StreamThread-2-0_4- 
producer org.apache.kafka.clients.NetworkClient warn | [Producer 
clientId=trsb-app-nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7- 
StreamThread-2-0_4-producer, transactionalId=trsb-app-nonprod.snapshot-0_4] 
Connection to node 1 could not be established. Broker may not be available.
2019-01-04 09:14:38,797 UTC WARN kafka-producer-network-thread | trsb-app- 
nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7-StreamThread-2-1_10- 
producer org.apache.kafka.clients.NetworkClient warn | [Producer 
clientId=trsb-app-nonprod.snapshot-14fa12b2-ac15-4ecc-8729-8f6c4a0034a7- 
StreamThread-2-1_10-producer, transactionalId=trsb-app-nonprod.snapshot- 
1_10] Connection to node 1 could not be established. Broker may not be 
available.

并且没有消耗任何东西。

在两个工作代理日志中,我看到:

[2019-01-04 13:56:56,449] WARN Resetting first dirty offset of trsb-app- 
nonprod.snapshot-store.invoices-changelog-43 to log start offset 99 since 
the checkpointed offset 95 is invalid. (kafka.log.LogCleanerManager$)
[2019-01-04 13:56:56,449] WARN Resetting first dirty offset of trsb-app- 
nonprod.snapshot-store.invoices-changelog-40 to log start offset 103 since 
the checkpointed offset 100 is invalid. (kafka.log.LogCleanerManager$)

标签: apache-kafkaapache-kafka-streams

解决方案


由于您只使用一次语义,因此至少需要 3 个代理才能继续处理,因此如果其中一个代理出现故障,您的应用程序将不会继续处理。阅读此处(请参阅 processing.guarantee 部分)以获取有关此的更多信息:

https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id25


推荐阅读