2017-06-05 147 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

是的,你需要使用两个独立的端口。 –