2017-06-05 145 views
2

有許多相似類型的查詢上的計算器,但沒有完全匹配,我看到了問題的時候。集裝箱卡夫卡客戶端產生的錯誤信息給主機服務器卡夫卡

我在我的服務器上有一個zookeeper/kafka安裝程序,它可以很好地工作。人們可以產生

bin/kafka-console-producer.sh --broker-list 192.168.2.80:9092 --topic test 

和消費

bin/kafka-console-consumer.sh --bootstrap-server 192.168.2.80:9092 --topic test --from-beginning 

本地的Linux操作系統Ubuntu 16.04服務器上。

從Docker容器 - 也運行Ubuntu 16.04 - 我想生產和消費。容器的Kafka代碼是從服務器上覆制的。 首先,我可以從容器中創建一個新的話題

bin/kafka-topics.sh --create --zookeeper 192.168.2.80:2181 --replication-factor 1 --partitions 1 --topic test2 

,然後再列出它

bin/kafka-topics.sh --list --zookeeper 192.168.2.80:2181 

然而,當我試圖產生新的消息,使用上述(kafka-console-producer.sh )命令失敗,並顯示以下消息:

[2017-06-05 13:59:05,317] ERROR Error when sending message to topic test2 with key: null, value: 2 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for test2-0: 1526 ms has passed since batch creation plus linger time 

緊接在輸入消息文本後按回車。

在同一個主機上運行Docker容器似乎有點奇怪,但是一旦這個工作正常,我將把容器移動到一個單獨的主機進行生產。

我卡夫卡server.properties文件:

listeners=PLAINTEXT://0.0.0.0:9092 

卡夫卡版本:

2.12-0.10.2.1 

泊塢版本:

Docker version 1.12.6, build 78d1802 
+0

如果您在主機上使用mac和docker-machine,您必須執行端口轉發: docker-machine ssh default -L 9092:localhost:9092 -L 2181:localhost:2181 – Andy

+0

以及Kafka的圖像你用?這個爲我工作:https://hub.docker.com/r/wurstmeister/kafka/ – Andy

+0

謝謝安迪, 我想保持簡單的事情。所以我剛剛使用此鏈接下載它: wget ftp://apache.cs.utah.edu/apache.org/kafka/0.10.2.1/kafka_2.12-0.10.2.1.tgz 使用焦油它然後一次性解包動物園管理員和卡夫卡。它似乎在我的主Ubuntu服務器上運行良好。 然後我在我的Ubuntu裏做了同樣的事情:最新的docker鏡像。但是,我在容器中運行的所有內容都是kafka bin目錄中的命令。我還沒有開始動物園管理員或卡夫卡的守護進程。 –

回答

0

你的生產商(容器)無法解析您的Linux客戶操作系統的主機名,它在Kafka生產者對引導程序服務器的初始元數據請求中返回。您可以手動將其添加到容器內的/ etc/hosts文件中,或將「--add-host」參數添加到啓動運行製作者的映像的docker run命令中。

+0

謝謝漢斯。 我需要澄清一下,Ubuntu服務器在容器內運行zookeeper和kafka。從容器內部運行kafka bin腳本,容器內沒有kafka服務器。 我已經進行了建議的更改: 將192.168.2.80添加到容器的/ etc/host文件中,並使用從echo $ HOSTNAME獲得的服務器的名稱。我已經使用'ping server_name'測試了它在容器內的作用。 但我仍然收到上面的消息中描述的相同的錯誤消息。 –

+0

如果我從另一臺服務器運行生產者腳本,而不是在一個容器內運行,它按預期正常工作。該服務器在其/ etc/hosts文件中沒有針對kakfa服務器主機的條目。 –

0

Aha! 經過進一步閱讀和解決方案上面給出的答案來了。通常情況下,這是一件容易的事情。 卡夫卡server.properties文件的簡單編輯:

advertised.listeners=PLAINTEXT://192.168.2.80:9092 

還要注意,在參數「聽衆」是不是在這個文件中設置。

+0

很可能這不起作用,例如您可能能夠從您的主機(例如Mac筆記本電腦)與您的集裝箱代理進行通話,但其他容器可能無法與代理進行通話。使用它的「技巧」是開箱即用,適用於您的主機以及依賴於Kafka的其他集裝箱服務,這是我在上面的答案中解釋的。 –

4

由Kafka的協議如何工作引起的問題(略爲簡化)。給定一個「引導程序服務器」列表(例如localhost:9092),Kafka客戶端將聯繫那些引導程序服務器,但隨後使用由引導程序服務器(代理程序的advertised.listeners配置返回的實際Kafka代理的主機名,具體取決於您的Kafka/Docker設置,可能會設置爲例如kafka:9092)。因此,在這裏,客戶端會與localhost:9092進行自助交談(這將工作),但隨後切換到kafka:9092(這將不起作用,「感謝」網絡設置)。

幸運的是,有一種方法可以用「正常工作」的方式來配置Kafka + Docker,並且它不需要惡意軟件,如擺弄主機的/etc/hosts文件等。作爲其中的一部分,您需要設置一些(新)Kafka設置,但這些設置已添加到kafka的KIP-103: Separation of Internal and External traffic中。

這裏有一個碼頭工人撰寫(docker-compose.yml)一個片段演示瞭如何做到這一點:

--- 
version: '2' 
services: 
    zookeeper: 
    image: confluentinc/cp-zookeeper:3.2.1 
    hostname: zookeeper 
    ports: 
     - '32181:32181' 
    environment: 
     ZOOKEEPER_CLIENT_PORT: 32181 

    kafka: 
    image: confluentinc/cp-kafka:3.2.1 
    hostname: kafka 
    ports: 
     - '9092:9092' 
     - '29092:29092' 
    depends_on: 
     - zookeeper 
    environment: 
     KAFKA_BROKER_ID: 1 
     KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181 
     KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT 
     KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT 
     KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 
     # Following line is needed for Kafka versions 0.11+ 
     # in case you run less than 3 Kafka brokers in your 
     # cluster because the broker config 
     # `offsets.topic.replication.factor` (default: 3) 
     # is now enforced upon topic creation 
     KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 

這裏,關鍵的設置是:

  • listener.security.protocol.map(其正在通過KAFKA_LISTENER_SECURITY_PROTOCOL_MAP設置)
  • inter.broker.listener.name
  • advertised.listeners

在上面的設置中,集裝箱化的Kafka代理在localhost:9092上偵聽來自主機的訪問權限(例如,您的Mac筆記本電腦)和kafka:29092從其他容器訪問。

完整的端到端示例可在以下網址獲得: https://github.com/confluentinc/cp-docker-images/blob/v3.2.1/examples/kafka-streams-examples/docker-compose.yml(文檔位於http://docs.confluent.io/3.2.1/cp-docker-images/docs/tutorials/kafka-streams-examples.html)。

+0

謝謝邁克爾, 我認爲這篇文章將是非常有用的,當我開始下一個階段,這將需要使用docker-compose來啓動和運行我的配置。 –

+0

是否有必要爲主機和容器使用兩個單獨的端口?我的容器仍然說它無法連接 – crazyglasses

+0

是的,你需要使用兩個獨立的端口。 –