奇怪的问题是,kafka在一个2代理设置中有一个zookeeper示例,都在aws上。每个代理都位于一个单独的可用性区域(az)。一个zookeeper示例与一个代理共享az。我试图模拟一种滚动重启的情况,在这种情况下,我们希望数据流到kafka,即使在代理关闭的情况下。
我能够看到一个平稳过渡到经纪人,与zookeeper共享的az,当另一个az经纪人被拿下。但是,当我取下与zookeeper共享的az上的kafka代理时,另一个az代理将不会使用数据。不过,我看到了领导者分配按预期的方式进行。我不确定这是否是一个问题,我们的设置,Kafka,或Zookeeper。
我们为代理间通信启用了ssl,并且生产者还使用ssl与kafka通信。这是除broker-id之外两个代理上相同的server.properties。这也是我们的kafka设置。
编辑:我有一个不同的消费者(使用logstash)相同的结果。
broker-1与zookeeper共享az。broker-0单独在另一个az上。
第一部分:在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上的数据。领导者从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
第二部分:让两个经纪人都运作
在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
第三部分:在broker-1上阻止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
第四部分:让两个经纪人都运作
在broker-1上启动kafka备份将立即恢复数据消耗。奇怪的是,一旦broker-1kafka重新上线,在明显的“非消费”阶段发送的消息也会出现。
/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条答案
按热度按时间a2mppw5e1#
经过令人沮丧的长时间调查后,问题似乎源于这样一个事实:Kafka>0.9现在在Kafka存储消费者补偿,而不是zookeeper了。再也没有选项将其更改为zookeeper(ala kafka 0.8)。
Kafka将消费者补偿存储在一个叫做“消费者补偿”的主题中。默认情况下,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)并重新开始。糟透了(我希望我错了)
现在,这是一个bug还是一个特性?我不知道。不管怎样,对我们来说都很糟糕。