amazon-web-services - AWS 上的 Kafka 消费问题

标签 amazon-web-services ssl apache-kafka apache-zookeeper

Kafka 在 2 个代理设置和 1 个 Zookeeper 实例中的奇怪问题,全部在 AWS 上。每个代理都位于单独的可用区 (AZ) 中。单独的 Zookeeper 实例与其中一个代理共享 AZ。 我正在尝试模拟一个滚动重启的情况,在这种情况下,即使代理关闭,我们也希望数据流向 Kafka。

当另一个 AZ 代理被关闭时,我能够看到平稳过渡到与 Zookeeper 共享 AZ 的代理。但是,当我关闭与 Zookeeper 共享的 AZ 上的 Kafka 代理时,另一个 AZ 代理将不会使用数据。不过,我看到领导者分配按照预期的方式进行。我不确定这是否是我们的设置、Kafka 或 Zookeeper 的问题。

我们为代理间通信启用了 SSL,生产者也使用 SSL 与 Kafka 对话。 Here is the server.properties除了 broker-id 之外,这在两个经纪人上都是相同的。 还有 here is our Kafka setup .

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

Broker-1 与 Zookeeper 共享 AZ。 Broker-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

领导者是 Broker-0。可以在 Broker-1 上消费数据 停止 Broker-0 上的 Kafka 服务。 仍然可以在 Broker-1 上消费/读取数据。 Leader 从 Broker-0 变为 Broker-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

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

在 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: 1       Replicas: 0,1   Isr: 1,0

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

在 Broker-0 上运行消费者

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

领导者是 Broker-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

有什么见解吗?

最佳答案

经过令人沮丧的长时间调查,问题似乎源于 Kafka > 0.9 现在将消费者偏移量存储在 Kafka 而不是 Zookeeper 中。不再有将其更改为 Zookeeper(ala Kafka 0.8)的选项。

Kafka 将消费者偏移量存储在一个名为“__consumer_offsets”的主题中。默认情况下,Kafka 以 0 的复制因子创建此主题。因此,此主题仅驻留在一个代理上,并且仅驻留在一个代理上。那么,当这个经纪人倒闭时,你猜怎么着?数据仍将进入 Kafka,但消费者无法再读取数据,因为它无法到达消费者偏移量。

所以,这就是我所做的。我逐个手动更改了该主题的 50 个分区中每个分区的复制因子,然后再次运行我的测试。你知道上面的例程 - 杀死 broker-0,将其恢复,杀死 broker-1,yada yada。你猜怎么着?一切都按预期进行。现在我们知道问题出在哪里了!

为了让这个主题创建的复制因子大于 1,我们需要将这个属性添加到 Kafka conf 中:

offsets.topic.replication.factor=2

并为该主题设置更合理数量的分区:

offsets.topic.num.partitions=5

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

现在,这是错误还是功能?我不知道。无论哪种方式,这对我们来说都很糟糕。

关于amazon-web-services - AWS 上的 Kafka 消费问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840817/

相关文章:

java - 根据时间戳检索kafka主题中的偏移量

reactjs - 是否可以在 React 应用程序中单独使用 Amplify Auth?

amazon-web-services - CloudFormation YAML - 带有条件语句的 IAM 策略

java - Mongo Java 客户端 : How can I connect with SSL enabled but no certificate?

java - 使用 OkHttp 连接到 HTTPS 代理

java - 当我只想并发读取ConsumerRecords时,是否必须同步ConsumerRecords?

java - 与 Kafka 消费者匹配的扩展模式

python - Flask & Boto3 `ValueError: Required parameter name not set` 访问资源

mysql - Jmeter未连接到AWS RDS

ssl - 使用具有自定义域的 github 页面时出现混合内容错误