2015-08-03 57 views
4

我的印象是,在开启同步的两个经纪商的情况下,即使一家经纪商失败,我的卡夫卡设置也应该继续工作。为什么卡夫卡不能继续在一个经纪人的失败中工作?

为了测试它,我做了一个名为topicname的新主题。它的描述如下:

Topic:topicname PartitionCount:1 ReplicationFactor:1 Configs: 
Topic: topicname Partition: 0 Leader: 0 Replicas: 0 Isr: 0 

然后我跑了以下列方式producer.sh和consumer.sh:

bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9095 sync --topic topicname 

bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topicname --from-beginning 

直到双方经纪正在努力,我看到了正在通过正确接收的消息消费者,但是当我通过kill命令杀死了经纪人的一个实例时,消费者停止向我展示任何新消息。相反,它向我显示了以下错误消息:

WARN [ConsumerFetcherThread-console-consumer-57116_ip-<internalipvalue>-1438604886831-603de65b-0-0], Error in fetch Name: FetchRequest; Version: 0; CorrelationId: 865; ClientId: console-consumer-57116; ReplicaId: -1; MaxWait: 100 ms; MinBytes: 1 bytes; RequestInfo: [topicname,0] -> PartitionFetchInfo(9,1048576). Possible cause: java.nio.channels.ClosedChannelException (kafka.consumer.ConsumerFetcherThread) 
[2015-08-03 12:29:36,341] WARN Fetching topic metadata with correlation id 1 for topics [Set(topicname)] from broker [id:0,host:<hostname>,port:9092] failed (kafka.client.ClientUtils$) 
java.nio.channels.ClosedChannelException 
at kafka.network.BlockingChannel.send(BlockingChannel.scala:100) 
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:73) 
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) 
+0

您将复制因子设置为1,这意味着您的数据将保存在一个节点上。要复制数据集复制因子2(不能将其设置为高于可用集群中的代理数)。然后再试一次 – serejja

+0

@serejja我试着将复制设置为2.当我杀了一个经纪人时,我得到了以下错误:kafka.common.FailedToSendMessageException:3次尝试后未能发送消息。' –

回答

0

对于具有复制因子N的主题,Kafka容忍多达N-1个服务器故障。例如。具有复制因子3将允许您处理多达2个服务器故障。

+0

这样做后,我甚至不能发送即使所有的经纪人都活着。 'kafka.common.FailedToSendMessageException:3次尝试后发送消息失败。' –

+0

你究竟做了什么?你能够使用控制台脚本列出主题吗?你能够创建一个新的话题并发布记录吗?你得到什么细节异常? – user2720864

3

您可以在主题描述中看到您发布的主题只有一个副本。 对于单个副本,没有容错功能,并且如果代理0(包含副本的代理)消失,该主题将不可用。

创建一个包含更多副本的主题(使用--replication-factor 3)以在发生崩溃时具有容错功能。

3

我有这个类似的问题,将生产者配置“topic.metadata.refresh.interval.ms”设置为-1(或任何适合您的值)解决了我的问题。 所以在我的情况,我有3个代理(多券商集合了我的本地计算机上),并与3个分区和复制因子2

测试设置创建的主题:

生产者配置之前:

尝试了3个经纪人的运行,在生产者开始后杀死了其中一个经纪人,当地Zookeeper更新了ISR和主题元数据信息(作为领导者删除了经纪人),但制片人没有选择它(可能由于默认10分钟刷新时间)。所以消息最终失败。我发送异常。

生产者配置(-1在我的情况)后:

试过3个中间商运行,杀死了经纪人的一个生产开始后,当地动物园管理员更新ISR信息(向下去除代理作为领导者),在生产者刷新了新的ISR /主题元数据信息和消息发送没有失败。

-1使它刷新每次失败尝试的主题元数据,因此可能您希望将刷新时间缩短为合理的值。

1

使用主题即使与复制因子的2 设置以下属性的制片工作对我来说我已经遇到了同样的问题。 “metadata.max.age.ms”。 (卡夫卡0.8.2。1)

否则,我的制片人被默认等待1分钟,以获取新的领导者,并开始接触它

1

我认为有两件事情可以做一个经纪人下来卡夫卡HA集群后,您的消费无法正常工作:

  1. - 您的主题的复制因子应大于1。所以每个主题分区至少可以有一个备份。用于卡夫卡配置内部主题

  2. 复制因子也应大于1:

    offsets.topic.replication.factor = 3

    transaction.state.log.replication.factor = 3

    transaction.state.log.min.isr = 2

这两修改使我的生产者和消费者的经纪人舒后仍能正常工作tdown(5家经纪商和每家经纪商都下跌一次)。

+0

这对我使用kafka 0.11,但我不得不重新创建我的话题。我正在使用'ruby-kafka'红宝石宝石进行测试。其他客户可能更聪明。 – Derek

相关问题