无法从外部机器连接到kafka
cant connect to kafka from external machine
我从 Apache Kafka 开始,当我尝试从外部机器连接时遇到问题。
使用下面的配置,如果应用程序和 docker 运行 在同一台机器上,一切正常。
但是当我将应用程序放在机器 A 和 docker 机器 B 时,应用程序无法连接。
我的 spring Kafka @Configuration 有这条线到 @Bean consumerFactory 和 producerFactory(假设我的机器 docker ip = 10.10.10.10)
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");
我的 docker 文件是这样的:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_HOST_NAME: 0.0.0.0
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "topic-jhipster:1:1,PROCESS_ORDER:1:1, PROCESS_CHANNEL:1:1"
JMX_PORT: 9999
KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=9999"
ports:
- 9092:9092
- 9999:9999
kafka-manager:
image: sheepkiller/kafka-manager
ports:
- 9000:9000
links:
- zookeeper
environment:
ZK_HOSTS: zookeeper:2181
我收到这个错误:
org.springframework.kafka.core.KafkaProducerException: Failed to send;
nested exception is org.apache.kafka.common.errors.TimeoutException:
Expiring 1 record(s) for
编辑,添加一些信息..
我认为我缺少关于动物园管理员的任何配置..因为如果我只有动物园管理员在我的机器 A 上启动..和机器 B 中的 kafka.. 工作..我只是不知道怎么做:(
您需要指定java.rmi.server.hostname=0.0.0.0
将 advertised.listeners
设置为 docker 容器主机的主机名或 ip。
environment:
KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"
发生的事情是客户端连接到 bootstrap 服务器,执行元数据请求以发现集群中的哪个 Kafka 代理要连接到特定主题分区,并获取通告的主机返回名称作为响应(在您的情况下为 0.0.0.0),只有当所有内容都在同一台机器上时才有效。
您需要公布一个可以在远程机器上使用的 ip 或主机名,而不是 localhost、127.0.0.1 或 0.0.0.0。也不是 docker 容器的私有内部 IP 或主机名。它必须是 external/public IP 或主机名。
此外,advertised.host.name
和 advertised.port
是 Kafka 0 中不推荐使用的参数。10.x 所以即使你使用它们(它们用于向后兼容),你也需要设置 advertised.host.name
成为生产者可以解析和连接的东西。我建议使用 docker 主机的完全限定主机名或 IP(即 10.10.10.10)。
来自http://kafka.apache.org/0101/documentation.html#brokerconfigs
DEPRECATED: only used when advertised.listeners
or listeners
are
not set. Use advertised.listeners
instead. Hostname to publish to
ZooKeeper for clients to use. In IaaS environments, this may need to
be different from the interface to which the broker binds. If this is
not set, it will use the value for host.name
if configured.
Otherwise it will use the value returned from
java.net.InetAddress.getCanonicalHostName().
尝试设置监听器,
eg: listeners = PLAINTEXT://your.host.name:9092
假设您可以在 kafka 端口上的机器之间进行 telnet。
@Krishas 和@Hans Jespersen 的一些组合
这是我的 docker yml 的代码:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.10:9092
KAFKA_ADVERTISED_HOST_NAME: 10.10.10.10
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
那需要 "PLAINTEXT:// 前缀!
并配置 "host_name" + "port" 或 "listeners"
下一步是了解我将如何配置另一个节点
我从 Apache Kafka 开始,当我尝试从外部机器连接时遇到问题。
使用下面的配置,如果应用程序和 docker 运行 在同一台机器上,一切正常。
但是当我将应用程序放在机器 A 和 docker 机器 B 时,应用程序无法连接。
我的 spring Kafka @Configuration 有这条线到 @Bean consumerFactory 和 producerFactory(假设我的机器 docker ip = 10.10.10.10)
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");
我的 docker 文件是这样的:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_HOST_NAME: 0.0.0.0
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "topic-jhipster:1:1,PROCESS_ORDER:1:1, PROCESS_CHANNEL:1:1"
JMX_PORT: 9999
KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=9999"
ports:
- 9092:9092
- 9999:9999
kafka-manager:
image: sheepkiller/kafka-manager
ports:
- 9000:9000
links:
- zookeeper
environment:
ZK_HOSTS: zookeeper:2181
我收到这个错误:
org.springframework.kafka.core.KafkaProducerException: Failed to send;
nested exception is org.apache.kafka.common.errors.TimeoutException:
Expiring 1 record(s) for
编辑,添加一些信息..
我认为我缺少关于动物园管理员的任何配置..因为如果我只有动物园管理员在我的机器 A 上启动..和机器 B 中的 kafka.. 工作..我只是不知道怎么做:(
您需要指定java.rmi.server.hostname=0.0.0.0
将 advertised.listeners
设置为 docker 容器主机的主机名或 ip。
environment:
KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"
发生的事情是客户端连接到 bootstrap 服务器,执行元数据请求以发现集群中的哪个 Kafka 代理要连接到特定主题分区,并获取通告的主机返回名称作为响应(在您的情况下为 0.0.0.0),只有当所有内容都在同一台机器上时才有效。
您需要公布一个可以在远程机器上使用的 ip 或主机名,而不是 localhost、127.0.0.1 或 0.0.0.0。也不是 docker 容器的私有内部 IP 或主机名。它必须是 external/public IP 或主机名。
此外,advertised.host.name
和 advertised.port
是 Kafka 0 中不推荐使用的参数。10.x 所以即使你使用它们(它们用于向后兼容),你也需要设置 advertised.host.name
成为生产者可以解析和连接的东西。我建议使用 docker 主机的完全限定主机名或 IP(即 10.10.10.10)。
来自http://kafka.apache.org/0101/documentation.html#brokerconfigs
DEPRECATED: only used when
advertised.listeners
orlisteners
are not set. Useadvertised.listeners
instead. Hostname to publish to ZooKeeper for clients to use. In IaaS environments, this may need to be different from the interface to which the broker binds. If this is not set, it will use the value forhost.name
if configured. Otherwise it will use the value returned from java.net.InetAddress.getCanonicalHostName().
尝试设置监听器,
eg: listeners = PLAINTEXT://your.host.name:9092
假设您可以在 kafka 端口上的机器之间进行 telnet。
@Krishas 和@Hans Jespersen 的一些组合
这是我的 docker yml 的代码:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.10:9092
KAFKA_ADVERTISED_HOST_NAME: 10.10.10.10
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
那需要 "PLAINTEXT:// 前缀! 并配置 "host_name" + "port" 或 "listeners"
下一步是了解我将如何配置另一个节点