gpt4 book ai didi

apache-kafka - Kafka 未提交的消息

转载 作者:行者123 更新时间:2023-12-04 04:36:52 26 4
gpt4 key购买 nike

假设分区有 4 个副本(1 个领导者,3 个追随者),并且所有副本当前都处于同步状态。 min.insync.replicas设置为 3 和 request.required.acks设置为 all 或 -1。

生产者向领导者发送消息,领导者将其附加到其日志中。之后,其中两个副本在获取此消息之前就崩溃了。剩下的一个副本成功获取了消息并附加到它自己的日志中。

由于不满足 min.insync.replicas 条件,领导者在一定超时后将向生产者发送错误(我认为是 NotEnoughReplicas)。

我的问题是:附加到领导者和副本日志之一的消息会发生什么?

当崩溃的副本重新上线并且代理开始接受和提交新消息(即在日志中转发高水印)时,它是否会交付给消费者?

最佳答案

如果没有可用的 min.insync.replicas 并且生产者使用 ack=all,则消息不会提交并且消费者不会收到该消息,即使在崩溃的副本回来并再次添加到 ISR 列表之后也是如此。您可以通过以下方式进行测试。

使用 min.insync.replicas = 2 启动两个代理

$ ./bin/kafka-server-start.sh ./config/server-1.properties
$ ./bin/kafka-server-start.sh ./config/server-2.properties

创建一个有 1 个分区且 RF=2 的主题。确保两个代理都在 ISR 列表中。
$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --create --topic topic1 --partitions 1 --replication-factor 2
Created topic "topic1".
$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --describe --topic topic1
Topic:topic1 PartitionCount:1 ReplicationFactor:2 Configs:
Topic: topic1 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2

运行控制台使用者和控制台生产者。确保生产使用 ack=-1
$ ./bin/kafka-console-consumer.sh --new-consumer --bootstrap-server kafka-1:9092,kafka-2:9092 --topic topic1
$ ./bin/kafka-console-producer.sh --broker-list kafka-1:9092,kafka-2:9092 --topic topic1 --request-required-acks -1

产生一些消息。消费者应该收到它们。

杀死其中一个经纪人(我杀死了 id=2 的经纪人)。检查 ISR 列表是否减少到一个代理。
$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --describe --topic topic1
Topic:topic1 PartitionCount:1 ReplicationFactor:2 Configs:
Topic: topic1 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1

尝试再次生产。在生产者你应该得到一些
Error: NOT_ENOUGH_REPLICAS

(每次重试一次)最后
Messages are rejected since there are fewer in-sync replicas than required.

消费者不会收到这些消息。

重新启动被杀死的代理并尝试再次生产。
消费者将收到这些消息,但不会收到您在其中一个副本停机时发送的消息。

关于apache-kafka - Kafka 未提交的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38141163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com