2016-10-29 53 views
6

我有兩個kafka代理在本地機器上有兩個分區,並使用以下工具將一個本地文件寫入kafka test2主題。爲什麼我的kafka在一個分區中有消息?

# create topic 
    ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 2 --topic test2 
    Created topic "test2". 
    # write 15MB file to kafka, very fast!! 
    kafka-console-producer.sh --broker-list localhost:9093,localhost:9094 --topic test2 < data.txt 
    # read data from kafka 
    ./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test2 --from-beginning 

然後我發現所有的消息都在一個分區,如何調試呢?

$ kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9093,localhost:9094 --topic test2 --time -1 
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
    SLF4J: Defaulting to no-operation (NOP) logger implementation 
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
    test2:0:68263 
    test2:1:0 

分區的狀態是:

$ kafka-topics.sh --describe --zookeeper localhost:2181 --topic test2 
Topic:test2 PartitionCount:2 ReplicationFactor:2 Configs: 
    Topic: test2 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2 
    Topic: test2 Partition: 1 Leader: 2 Replicas: 2,1 Isr: 2,1 
+0

您可以編寫一個Kafka Producer類,其中包含消息的不同消息密鑰,因此它可以將消息發佈到不同的分區中。 – Shankar

+0

您是否爲該消息指定了任何密鑰? – amethystic

+0

kafka-console-producer.sh不會爲我生成密鑰? –

回答

-1

如果我理解你正確地你想知道爲什麼該數據不會被複制到其他分區。 我想你可能會誤解卡夫卡如何複製。

按照Kafka Documentation只寫去一個分區的主題中:

生產者數據發佈到他們所選擇的主題。製作人負責選擇將哪個記錄分配給主題中的哪個分區。

因此,複製不會將數據從一個分區鏡像到另一個分區,而是將每個分區的副本保存到另一個服務器。

Kafka通過可配置數量的服務器複製每個主題分區的日誌(您可以在逐個主題的基礎上設置此複製因子)。這樣,當羣集中的服務器出現故障時,可以自動故障轉移到這些副本,以便在出現故障時保持消息可用。

因此,最終所有數據都寫入到一個分區,但是在這兩個服務器上都有該分區的副本。

+0

問題不是關於複製,數據不是平均分配給所有分配的分區。這將導致事件處理緩慢。 – Ajeesh

相關問題