2015-08-03 51 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

相關問題