为什么我不能从外部机器访问kafka?
Why i can't access kafka from an external machine?
我是 kafka 的新手,我尝试使用 Docker-compose 在 vps 上设置我的第一个集群。但我仍然无法从我的本地电脑(主机外)访问它。
这是我的docker撰写
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,EXTERNAL_DIFFERENT_HOST://:29093,INTERNAL://:9092
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092,EXTERNAL_DIFFERENT_HOST://XXX.XXX.XXX.XXX:29093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:39092,EXTERNAL_DIFFERENT_HOST://:39093,INTERNAL://:9093
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9093,EXTERNAL_SAME_HOST://localhost:39092,EXTERNAL_DIFFERENT_HOST://XXX.XXX.XXX.XXX:39093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
我在日志中搜索,发现没有可用的代理(始终为 0),因为服务器无法连接到“kafka:9092”并且 Zookeeper 一直无法连接到代理。
[2022-04-13 14:56:59,422] WARN Session 0x0 for sever My-vps-URL/XXX.XXX.XXX.XXX:2181, Closing socket connection. Attempting reconnect except
it is a SessionExpiredException. (org.apache.zookeeper.ClientCnxn)
org.apache.zookeeper.ClientCnxn$SessionTimeoutException: Client session timed out, have not
heard from server in 30006ms for session id 0x0
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1258)
KeeperErrorCode = ConnectionLoss for /brokers/ids
我该如何解决这个问题?
请注意,我用不同的 docker 图像(bitnami 的)和不同的集群配置(1 zookeeper 1 broker)尝试了类似的配置,但它仍然不起作用。
你有一个 Zookeeper 错误,因为你是 运行 个偶数。 Zookeeper 的数量不需要与 broker 的数量相匹配,它应该是 个奇数,仅 个,最多 7 个。您也不应该在 Zookeeper 服务器上需要 ports
。
对于您的 Kafka 连接,
KAFKA_LISTENERS
需要包含 0.0.0.0
的 IP 以允许服务器绑定到所有接口
- 您需要公开端口 29093 和 39093,因为它们是您的“不同主机”设置。您目前只有从同一台计算机连接的端口。
- 您的客户端需要连接到您设置的
EXTERNAL_DIFFERENT_HOST
地址,而不是 kafka:9092
进一步阅读 -
tried a similar config with a different docker image ( bitnami's )
该图像具有不同的变量,但基本答案与上述相同。
different cluster config ( 1 zookeeper 1 broker )
在同一台机器上 运行 多个配置没有什么好处,所以我建议首先尝试让该配置正常工作。
我是 kafka 的新手,我尝试使用 Docker-compose 在 vps 上设置我的第一个集群。但我仍然无法从我的本地电脑(主机外)访问它。
这是我的docker撰写
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,EXTERNAL_DIFFERENT_HOST://:29093,INTERNAL://:9092
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092,EXTERNAL_DIFFERENT_HOST://XXX.XXX.XXX.XXX:29093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:39092,EXTERNAL_DIFFERENT_HOST://:39093,INTERNAL://:9093
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9093,EXTERNAL_SAME_HOST://localhost:39092,EXTERNAL_DIFFERENT_HOST://XXX.XXX.XXX.XXX:39093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
我在日志中搜索,发现没有可用的代理(始终为 0),因为服务器无法连接到“kafka:9092”并且 Zookeeper 一直无法连接到代理。
[2022-04-13 14:56:59,422] WARN Session 0x0 for sever My-vps-URL/XXX.XXX.XXX.XXX:2181, Closing socket connection. Attempting reconnect except
it is a SessionExpiredException. (org.apache.zookeeper.ClientCnxn)
org.apache.zookeeper.ClientCnxn$SessionTimeoutException: Client session timed out, have not
heard from server in 30006ms for session id 0x0
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1258)
KeeperErrorCode = ConnectionLoss for /brokers/ids
我该如何解决这个问题?
请注意,我用不同的 docker 图像(bitnami 的)和不同的集群配置(1 zookeeper 1 broker)尝试了类似的配置,但它仍然不起作用。
你有一个 Zookeeper 错误,因为你是 运行 个偶数。 Zookeeper 的数量不需要与 broker 的数量相匹配,它应该是 个奇数,仅 个,最多 7 个。您也不应该在 Zookeeper 服务器上需要 ports
。
对于您的 Kafka 连接,
KAFKA_LISTENERS
需要包含0.0.0.0
的 IP 以允许服务器绑定到所有接口- 您需要公开端口 29093 和 39093,因为它们是您的“不同主机”设置。您目前只有从同一台计算机连接的端口。
- 您的客户端需要连接到您设置的
EXTERNAL_DIFFERENT_HOST
地址,而不是kafka:9092
进一步阅读 -
tried a similar config with a different docker image ( bitnami's )
该图像具有不同的变量,但基本答案与上述相同。
different cluster config ( 1 zookeeper 1 broker )
在同一台机器上 运行 多个配置没有什么好处,所以我建议首先尝试让该配置正常工作。