无法从网络设备正确发送到 kafka-docker
Can't correctly send to kafka-docker from network device
我正在尝试在我的主机上设置 Kafka / Docker 设置并从网络设备连接到它。我正在使用 bitnami/kafka。这是我的 docker-compose 文件:
version: '2'
services:
zookeeper:
image: 'bitnami/zookeeper:3'
ports:
- '2181:2181'
volumes:
- 'zookeeper_data:/bitnami'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:2'
ports:
- '9092:9092'
- '29092:29092'
volumes:
- 'kafka_data:/bitnami'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
当我 运行 我的 python 脚本在我的主机上(不在 docker 内)并且 mercury 作为我主机的名字时它工作得很好:
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['mercury:29092'])
print("Connected")
producer.send('topic', b'It works!')
print('Theoretically send')
producer.close()
print('Closed')
当我尝试从另一个网络设备运行 相同的脚本时,它不起作用。我什至没有收到错误。该脚本也 运行 很好,因此在尝试连接或发送时没有延迟。只有当我 f.e 时才会发生这种情况。使用错误的端口或不存在的主题。特别是最后一部分让我相信脚本可以连接但不能正确发送消息。我不确定为什么会这样。我的端口设置是否正确,或者我是否需要一些额外的 kafka 环境设置?
在此先感谢您的帮助
问题出在Kafka广播监听器的配置上。
TL/DR; 在 KAFKA_CFG_ADVERTISED_LISTENERS
中将 PLAINTEXT_HOST://localhost:29092
更改为 PLAINTEXT_HOST://mercury:29092
并且您的 Kafka 集群应该可以从其他机器访问。
在更复杂的网络中,可能需要有一个内部网络和一个外部网络,例如由于不同的安全要求。 Kafka 允许通过分别设置 listeners
和 advertised.listeners
来区分它们。
advertised.listeners 的条目应该表示可以从集群外部的客户端访问 Kafka 集群的 URL。如果这被限制为 localhost
,除了您的主机之外没有任何机器可以连接到集群。
我正在尝试在我的主机上设置 Kafka / Docker 设置并从网络设备连接到它。我正在使用 bitnami/kafka。这是我的 docker-compose 文件:
version: '2'
services:
zookeeper:
image: 'bitnami/zookeeper:3'
ports:
- '2181:2181'
volumes:
- 'zookeeper_data:/bitnami'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:2'
ports:
- '9092:9092'
- '29092:29092'
volumes:
- 'kafka_data:/bitnami'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
depends_on:
- zookeeper
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
当我 运行 我的 python 脚本在我的主机上(不在 docker 内)并且 mercury 作为我主机的名字时它工作得很好:
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers=['mercury:29092'])
print("Connected")
producer.send('topic', b'It works!')
print('Theoretically send')
producer.close()
print('Closed')
当我尝试从另一个网络设备运行 相同的脚本时,它不起作用。我什至没有收到错误。该脚本也 运行 很好,因此在尝试连接或发送时没有延迟。只有当我 f.e 时才会发生这种情况。使用错误的端口或不存在的主题。特别是最后一部分让我相信脚本可以连接但不能正确发送消息。我不确定为什么会这样。我的端口设置是否正确,或者我是否需要一些额外的 kafka 环境设置?
在此先感谢您的帮助
问题出在Kafka广播监听器的配置上。
TL/DR; 在 KAFKA_CFG_ADVERTISED_LISTENERS
中将 PLAINTEXT_HOST://localhost:29092
更改为 PLAINTEXT_HOST://mercury:29092
并且您的 Kafka 集群应该可以从其他机器访问。
在更复杂的网络中,可能需要有一个内部网络和一个外部网络,例如由于不同的安全要求。 Kafka 允许通过分别设置 listeners
和 advertised.listeners
来区分它们。
advertised.listeners 的条目应该表示可以从集群外部的客户端访问 Kafka 集群的 URL。如果这被限制为 localhost
,除了您的主机之外没有任何机器可以连接到集群。