一、 listenersadvertised.listeners

在公司内网部署 kafka 集群只需要用到 listeners,内外网需要作区分时才需要用到advertised.listeners

  • listeners: 学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。我们要监听的uri的逗号分隔列表和监听器名称。指定hostname为0.0.0.0绑定所有接口。hostname为空以绑定到默认接口(JVM拿到的本机的hostname,java.net.InetAddress.getCanonicalHostName().)。
  • advertised.listeners:和 listener相比多了个advertised。Advertise的含义表示宣称的、公布的,就是组监听器是 Broker 用于对外发布的。会注册到zookeeper中,client真正要访问的地址。 如果没有配置advertised.listeners,此时advertised.listeners默认值等于listeners参数的值,并被发布到zooleeper中,供客户端访问使用。

比如在公司搭建的 kafka 集群,只有内网中的服务可以用,这种情况下,只需要用 listeners 就行;在 docker 中或者 在类似阿里云主机上部署 kafka 集群,这种情况下是需要用到 advertised.listeners

kafka 0.9.x以后的版本新增了advertised.listeners配置 kafka 0.9.x以后的版本不要使用 advertised.host.name 和 advertised.host.port 已经deprecated host.name 和 port 为 deprecated,使用listeners代替。

注意:

  • 如果 advertised.listeners没有设置,则hostname的值会被注册到zookeeper中;
  • 如果 advertised.listeners没有设置,hostname不能为0.0.0.0,否则client通过zk拿到的broker地址就是0.0.0.0;
  • 如果要绑定到所有interface,hostname不设置就可以;
  • 如果hostnameadvertised.listeners都没设置,则注册到zk的就是JVM拿到的本机的hostname;
  • 如果要bind到所有interface,client又能访问,解决的办法是hostname不设置或设置为0.0.0.0,advertised.listeners一定要设置为一个client可以访问的地址,如直接设置ip地址。
#hostname为空
listeners=PLAINTEXT://:9092
zookeeper.connect=10.254.254.5:2181
advertised.listeners=PLAINTEXT://192.168.3.46:9092

二、容器环境下IP跨网闸映射

kafka容器在地点A,平台服务器在地点B,地点A与地点B之间跨网闸。kafka容器ip为192.168.3.46映射到11.55.56.6,平台ip为11.55.56.26。但是发现实际使用中,平台无法消费到kafka的数据,但是能telnet通9092。

根据之间的介绍,kafka的clinet连接broker的过程如下所示:
在这里插入图片描述
在这里插入图片描述

平台可以连接到kafka,但是从kafka获取到的ip为PLAINTEXT://192.168.3.46:9092,为映射前的IP,所以ip映射是失效的。

解决此问题的办法是采用域名的方式:

  • kafka配置文件:
listeners=PLAINTEXT://:9092
zookeeper.connect=10.254.254.5:2181
advertised.listeners=PLAINTEXT://cluster_kafka:9092
  • kafka容器在/etc/hosts增加域名:
192.168.3.46 cluster_kafka
  • 平台容器在/etc/hosts增加域名:
11.55.56.6 cluster_kafka
  • 与Kafka容器同宿主机的容器在/etc/hosts增加域名:
192.168.3.46 cluster_kafka
Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐