当前位置: 首页 > 知识库问答 >
问题:

AWS 上的Kafka消费问题

邵星河
2023-03-14

Kafka在2个代理和1个Zookeeper实例中的奇怪问题,都在AWS上。每个代理都位于一个单独的可用性区域(AZ)。孤独的动物园管理员实例与其中一个代理共享AZ。我正试图模拟一种滚动重启的情况,在这种情况下,即使一个代理出现故障,我们也希望数据流向Kafka。

当另一个 AZ 代理被移除时,我能够看到向与 Zookeeper 共享 AZ 的代理平稳过渡。但是,当我删除与 Zookeeper 共享的可用区上的 Kafka 代理时,其他 AZ 代理将不会消耗数据。不过,我看到领导者分配以应有的方式发生。我不确定这是否是我们的设置,Kafka或动物园管理员的问题。

我们为代理间通信启用了SSL,生产者也使用SSL与Kafka对话。这是server.properties,除了broker-id之外,它在两个代理上都是相同的。这也是我们的Kafka装置。

编辑:我对不同的消费者有相同的结果(使用Logstash)。

Broker-1与Zookeeper共享AZ。经纪-0是另一个AZ的唯一成员。

第1部分:在Broker-0上停止Kafka

/opt/kafka/bin/kafka-topics.sh --zookeeper 10.0.1.x:2181 --describe
Topic:test  PartitionCount:1        ReplicationFactor:2     Configs:
    Topic: test Partition: 0    Leader: 0       Replicas: 0,1   Isr: 1,0

在 Broker-1 上运行使用者。

/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9093 --topic test --new-consumer --consumer.config client.ssl

领导是经纪人-0。可以使用Broker-1上的数据停止Broker-0上的Kafka服务。仍然可以使用/读取Broker-1上的数据。领导者从代理-0更改为代理-1

/opt/kafka/bin/kafka-topics.sh --zookeeper 10.0.1.x:2181 --describe
Topic:test  PartitionCount:1        ReplicationFactor:2     Configs:
    Topic: test Partition: 0    Leader: 1       Replicas: 0,1   Isr: 1

第二部分:让两个经纪人同时运作

在经纪人-0上启动Kafka

/opt/kafka/bin/kafka-topics.sh --zookeeper 10.0.1.x:2181 --describe
Topic:test  PartitionCount:1        ReplicationFactor:2     Configs:
    Topic: test Partition: 0    Leader: 1       Replicas: 0,1   Isr: 1,0

第三部分:阻止经纪人Kafka

在Broker-0上运行消费者

/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9093 --topic test --new-consumer --consumer.config client.ssl

领导是经纪人-1。可以使用Broker-0上的数据停止Broker-1上的Kafka服务不能使用/读取Broker-0上的数据。

/opt/kafka/bin/kafka-topics.sh --zookeeper 10.0.1.x:2181 --describe
Topic:test  PartitionCount:1        ReplicationFactor:2     Configs:
    Topic: test Partition: 0    Leader: 0       Replicas: 0,1   Isr: 0

第 4 部分:让两个代理都运行

在Broker-1上启动Kafka备份将立即恢复数据消耗。奇怪的是,一旦Broker-1 Kafka恢复在线,在明显的“非消费”阶段发送的消息也会出现。

/opt/kafka/bin/kafka-topics.sh --zookeeper 10.0.1.x:2181 --describe
Topic:test  PartitionCount:1        ReplicationFactor:2     Configs:
    Topic: test Partition: 0    Leader: 0       Replicas: 0,1   Isr: 0,1

有什么见解吗?

共有1个答案

索嘉胜
2023-03-14

经过令人沮丧的长期调查,问题似乎源于Kafka

Kafka将消费者偏移量存储在一个名为“__consumer_offsets”的主题中。默认情况下,Kafka创建这个主题的复制因子为0。因此,这个主题只驻留在一个代理上,而且只有一个代理。所以,当这个代理关闭时,猜猜看会发生什么?数据仍然会进入Kafka,但是没有消费者可以再读取数据了,因为它无法访问消费者偏移量。

所以,这就是我所做的。我手动更改了本主题的 50 个分区中每个分区的复制因子,并再次运行了我的测试。你知道上面的例行公事 - 杀死经纪人-0,把它带回来,杀死经纪人-1,亚达亚达。你猜怎么着?一切都如预期的那样工作。现在我们知道问题是什么了!

要创建复制因子大于1的主题,我们需要将此属性添加到Kafka conf:

offsets.topic.replication.factor=2

并为此主题提供更合理数量的分区:

偏移量.主题.num.分区 = 5

然而,可怕的是,一旦创建了这个内部主题,就无法更改复制因子或分区计数,除非您拆除整个基础架构(Kafka Zookeeper)并重新开始。很坏的(我希望我错了)

现在,这是一个bug还是一个特性?我不知道。不管怎样,对我们来说都很糟糕。

 类似资料:
  • Flink kafka消费者有两种类型的消费者,例如: 这两个消费者层次结构扩展了相同的类。我想知道维护编号类背后的设计决策是什么?我们什么时候应该使用其中一种? 我注意到带有数字后缀的类有更多的特性(例如ratelimiting)。 https://github.com/apache/flink/blob/master/flink-connectors/flink-connector-kafka

  • 我刚接触Kafka,很少阅读教程。我无法理解使用者和分区之间的关系。 请回答我下面的问题。 > 消费者是否由ZK分配到单个分区,如果是,如果生产者将消息发送到不同的分区,那么其他分区的消费者将如何使用该消息? 我有一个主题,它有3个分区。我发布消息,它会转到P0。我有5个消费者(不同的消费者群体)。所有消费者都会阅读P0的信息吗?若我增加了许多消费者,他们会从相同的P0中阅读信息吗?如果所有消费者

  • 我是Kafka的新手。我看了一眼Kafka文档。似乎分派给订阅消费者组的消息是通过将分区与消费者实例绑定来实现的。 在使用Apache Kafka时,我们应该记住一件重要的事情,即同一消费者组中的消费者数量应该小于或等于所使用主题中的分区数量。否则,将不会收到来自主题的任何消息。 在非prod环境中,我没有配置主题分区。在这种情况下,Kafka是否只有一个分区。如果我启动共享同一组的多个消费者并向

  • 我正在尝试让 kafka 消费者获取在 Java 中生成并发布到主题的消息。我的消费者如下。 consumer.java 当我运行上面的代码时,我在控制台中什么也看不到,屏幕后面的java producer程序正在‘AATest’主题下不断地发布数据。另外,在动物园管理员控制台中,当我尝试运行上面的consumer.java时,我得到了以下行 此外,当我运行指向 AATest 主题的单独控制台使用

  • 我有一个简单的Kafka设置。生成器正在以较高的速率向单个分区生成具有单个主题的消息。单个使用者正在使用来自此分区的消息。在此过程中,使用者可能会多次暂停处理消息。停顿可以持续几分钟。生产者停止产生消息后,所有排队的消息都将由使用者处理。生产者产生的消息似乎不会立即被消费者看到。我使用的是Kafka0.10.1.0。这里会发生什么?下面是使用消息的代码部分: 代理上的所有配置都保留为kafka默认

  • 是否有一种方法以编程方式访问和打印使用者滞后偏移,或者说使用者读取的最后一条记录的偏移与某个生产者写入该使用者分区的最后一条记录的偏移之间的位置差。 要知道我的最终目标是将这个值发送到prometheus进行监视,我应该在上面添加哪些语句来得到滞后偏移值?