V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cxyfreedom
V2EX  ›  问与答

关于 kafka 中 advertised.listeners 生效问题

  •  
  •   cxyfreedom · 2021-11-18 10:50:41 +08:00 · 722 次点击
    这是一个创建于 1110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 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()
    可消费偏移量:{}
    
    1 条回复    2021-11-18 16:26:00 +08:00
    QmLi
        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 这个配置
    你可以尝试发几条数据,估计就不行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3423 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:46 · PVG 19:46 · LAX 03:46 · JFK 06:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.