【问题标题】:Kafka uncommitted messages卡夫卡未提交的消息
【发布时间】:2016-11-03 14:45:39
【问题描述】:

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

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

leader,在一定的超时时间后,会向生产者发送一个错误(NotEnoughReplicas,我​​认为),因为 min.insync.replicas 条件不满足。

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

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

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    如果没有可用的 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.
    

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

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

    【讨论】:

      【解决方案2】:

      据我了解,水印在两者都失败之前不会前进 后续经纪人恢复并赶上了。

      查看这篇博文了解更多详情:http://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/

      【讨论】:

      • 因此消息最终将传递给消费者,即使代理没有向生产者确认相同的消息。
      • 在这种情况下,是的。
      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多