如果经纪人去世,卡夫卡将无法恢复

时间:2015-07-01 18:27:42

标签: apache-zookeeper apache-kafka

我们有一个带有三个代理的kafka集群(节点ID为0,1,2)和一个带有三个节点的zookeeper设置。

我们在此群集上创建了一个主题“test”,其中包含20个分区和复制因子2.我们使用Java生成器API向此主题发送消息。其中一名卡夫卡经纪人间歇性地倒下,之后无法收回。为了模拟这种情况,我们手动杀死了一个代理。根据卡夫卡拱门,它应该自我恢复,但这不会发生。当我在控制台上描述这个主题时,我发现作为一个经纪人被杀死,几个分区的ISR数量减少到一个。现在,每当我们尝试通过生产者API(Java客户端或控制台生产者)推送消息时,我们都遇到SocketTimeoutException。快速查看日志说“无法获取元数据”

 WARN [2015-07-01 22:55:07,590] [ReplicaFetcherThread-0-3][] kafka.server.ReplicaFetcherThread - [ReplicaFetcherThread-0-3],
 Error in fetch Name: FetchRequest; Version: 0; CorrelationId: 23711; ClientId: ReplicaFetcherThread-0-3; 
 ReplicaId: 0; MaxWait: 500 ms; MinBytes: 1 bytes; RequestInfo: [zuluDelta,2] -> PartitionFetchInfo(11409,1048576),[zuluDelta,14] -> PartitionFetchInfo(11483,1048576). 
 Possible cause: java.nio.channels.ClosedChannelException


[2015-07-01 23:37:40,426] WARN Fetching topic metadata with correlation id 0 for topics [Set(test)] from broker [id:1,host:abc-0042.yy.xxx.com,port:9092] failed (kafka.client.ClientUtils$)
java.net.SocketTimeoutException
at sun.nio.ch.SocketAdaptor$SocketInputStream.read(SocketAdaptor.java:201)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:86)
at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:221)
at kafka.utils.Utils$.read(Utils.scala:380)
at kafka.network.BoundedByteBufferReceive.readFrom(BoundedByteBufferReceive.scala:54)
at kafka.network.Receive$class.readCompletely(Transmission.scala:56)
at kafka.network.BoundedByteBufferReceive.readCompletely(BoundedByteBufferReceive.scala:29)
at kafka.network.BlockingChannel.receive(BlockingChannel.scala:111)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:72)
at kafka.producer.SyncProducer.send(SyncProducer.scala:113)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:58)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:93)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)

任何线索都将受到赞赏......

1 个答案:

答案 0 :(得分:0)

由于您的错误无法获取元数据,主要是因为您可以将生产者中的bootstrap.servers设置为已死亡的经纪人。

理想情况下,bootstrap.servers列表中必须有多个代理,因为如果其中一个代理发生故障(或无法访问),则另一个可以为您提供元数据。

仅供参考:元数据是有关特定主题的信息,可告诉它具有多少个分区,其领导者经纪人,关注者经纪人等。

因此,当将密钥生成到分区时,其相应的领导者代理将是向其发送消息的代理。

从您的问题来看,您的ISR集只有一个经纪人。您可以尝试将bootstrap.server设置为此经纪人。