关于 kafka 中 advertised.listeners 生效问题

2021-11-18 10:50:41 +08:00
 cxyfreedom

使用 docker-compose 创建了 zookeep 和 kafka 的容器,配置如下:

version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
    container_name: zookeeper
    networks: 
      - zk

  kafka:
    image: wurstmeister/kafka
    ports:
      - "29092:9092"
    environment:
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://10.10.10.4:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "topic_test:3:1"
    depends_on:
      - zookeeper
    container_name: kafka
    networks: 
      - zk

networks: 
  zk:
    driver: bridge

其中,KAFKA_ADVERTISED_LISTENERS 的 OUTSIDE 的 IP 是随意写的,换成别的也可以。

INSIDE 用于 docker 内部网络来访问的,这个外网无法连接没什么问题。OUTSIDE 则是提供给外网的。但是因为 IP 是随便配置的,实际上外网本身是无法连接到 10.10.10.4:9092 的,然后客户端通过映射出来的端口 29092 ,能够连接到 Kafka ,想问一下这是为什么?

比如用 Python 的包连接:

# -*- coding:utf-8 -*-
from kafka import KafkaConsumer


SERVER = "100.100.21.183:29092"
TOPIC = "topic_test"

consumer = KafkaConsumer(bootstrap_servers=SERVER, group_id="test_group", auto_offset_reset="earliest")

print(f"分区信息:{consumer.partitions_for_topic(TOPIC)}")
print(f"当前 topic 和分区信息:{consumer.assignment()}")
print(f"可消费偏移量:{consumer.beginning_offsets(list(consumer.assignment()))}")

# output
分区信息:{0, 1, 2}
当前 topic 和分区信息:set()
可消费偏移量:{}
580 次点击
所在节点    问与答
1 条回复
QmLi
2021-11-18 16:26:00 +08:00
印象中客户端会先通过 kafka 从 zk 里拿 topic 各分区对应 leader 的 KAFKA_ADVERTISED_LISTENERS ,然后再通过 KAFKA_ADVERTISED_LISTENERS 配置的域名或者 ip 发数据

你这里所有数据都是从 zk 里取的,到这一步都还没用到 KAFKA_ADVERTISED_LISTENERS 这个配置
你可以尝试发几条数据,估计就不行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX