我的设置由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$)
2条答案
按热度按时间vfhzx4xs1#
由于您只使用了一次语义,因此至少需要3个代理才能继续处理,因此如果其中一个代理宕机,您的应用程序将无法继续处理。请阅读此处(请参阅processing.guaranty部分)了解有关此项的更多信息:
https://kafka.apache.org/10/documentation/streams/developer-guide/config-streams.html#id25
af7jpaap2#
流继续使用,但由于状态存储(取决于消息键)可能无法推送到其相应的changelog分区,因此某些键可能会失败,这些事务将失败并回滚。因此,主题a上的第一个键一旦被使用就会导致状态存储推送失败,它将阻塞其分区,直到代理再次启动。这是因为状态存储推送是eos事务的一部分。