ApacheKafka—流的changelog和重分区的子集在代理关闭时不可用—流应该如何运行?

whhtz7ly  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(376)

我的设置由3个kafka代理(2.11-1.1.1)、一个zk和一个使用streamsapi的java服务组成。
java服务从主题a消费,执行持久流操作(由changelog和repartitionstreams主题备份)并写入主题b。eos语义已启用。
假设changelog和repartition主题的复制因子为1,那么在我的一个代理关闭的情况下,streams java应用程序应该如何运行(例如,在我的dev env中,只有一个代理的磁盘已满)。即使1/3的changelog和重分区分区不可访问,流是否仍会继续使用?
编辑:同时考虑到主题a、b和消费偏移量的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$)
vfhzx4xs

vfhzx4xs1#

由于您只使用了一次语义,因此至少需要3个代理才能继续处理,因此如果其中一个代理宕机,您的应用程序将无法继续处理。请阅读此处(请参阅processing.guaranty部分)了解有关此项的更多信息:
https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id25

af7jpaap

af7jpaap2#

流继续使用,但由于状态存储(取决于消息键)可能无法推送到其相应的changelog分区,因此某些键可能会失败,这些事务将失败并回滚。因此,主题a上的第一个键一旦被使用就会导致状态存储推送失败,它将阻塞其分区,直到代理再次启动。这是因为状态存储推送是eos事务的一部分。

相关问题