深入理解KAFKA_ADVERTISED_LISTENERS

一、直入主题,解释

(1)第一句话=========

KAFKA_LISTENERS:负责绑定网卡

KAFKA_ADVERTISED_LISTENERS:负责发布外网地址,这个地址会发布到zookeeper中。

(2)第二句话========

内网部署的程序,读的地址是KAFKA_LISTENERS写的。

外网部署的程序,读的地址是KAFKA_ADVERTISED_LISTENERS

zookeeper中存的地址是KAFKA_ADVERTISED_LISTENERS配置的,多个kafka注册到zookeeper就是把这个地址放到zookeeper中。如果不能理解的,可以用客户端工具打开zookeeper,看一下就清楚了。

仔细回味上面这几句话,接下来看实际例子。

(1)内网访问

第一步:kafka配置0.0.0.0:9092,表示内网所有网卡都绑定9092

第二步:程序里写的地址就是内网的地址,下图是,172.16.3.130

KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092

将kafka绑定到局域网所有网卡,当局域网的机器访问的时候,直接在springboot中配置本地ip。如

(2)外网访问

以上程序,如果部署在外网。则需要做如下改变

第一步:KAFKA_CFG_ADVERTISED_LISTENERS配置这个。

KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://<互联网ip>:9092

,这句话意思是将PLAINTEXT://<互联网ip>:9092,放到zookeeper中。当外面的服务访问到zookeeper的时候,从这个地址拿到kafka的内容,看下图,zookeeper中的broker-ids里存的就是这个你写上去的地址。

第二步:springboot程序通过外网访问的时候,配置 改成这样

二、解析原理

(1)程序首先是从zookeeper中获取broker地址。然后用这个地址去连kafka。如果配置的地址是外网程序找不到的一个地址,那就连不上了。

(2)zookeeper中的地址是通过

KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://<互联网ip>:9092

这个关键句来配置的。

[root@localhost apps]# cat kafka1.yml version: "3.6" services: kafka1: container_name: kafka1 image: 'bitnami/kafka:3.6.1' mem_limit: 4g ulimits: nproc: 65535 nofile: 65535 user: root ports: - '19092:9092' - '19093:9093' environment: - KAFKA_CFG_NODE_ID=1 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:19092 - KAFKA_BROKER_ID=1 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx2G -Xms1G - KAFKA_JVM_PERFORMANCE_OPTS="-Xss256k" volumes: - /data/new_public/kafka/broker01:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.11 kafka2: container_name: kafka2 image: 'bitnami/kafka:3.6.1' user: root ports: - '29092:9092' - '29093:9093' environment: - KAFKA_CFG_NODE_ID=2 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:29092 - KAFKA_BROKER_ID=2 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M volumes: - /data/new_public/kafka/broker02:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.12 kafka3: container_name: kafka3 image: 'bitnami/kafka:3.6.1' user: root ports: - '59092:9092' - '59093:9093' environment: - KAFKA_CFG_NODE_ID=3 - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:39092 - KAFKA_BROKER_ID=3 - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@172.23.0.11:9093,2@172.23.0.12:9093,3@172.23.0.13:9093 - ALLOW_PLAINTEXT_LISTENER=yes - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M volumes: - /data/new_public/kafka/broker03:/bitnami/kafka:rw networks: netkafka: ipv4_address: 172.23.0.13 networks: netkafka: driver: bridge ipam: config: - subnet: 172.23.0.0/25
03-19
<think>嗯,用户给了一个Docker Compose文件,想要我帮忙解释或者分析一下。首先,我需要仔细看看这个文件的结构和内容。看起来这是一个配置了三个Kafka节点的集群,使用KRaft模式运行,也就是去除了ZooKeeper的依赖。用户可能是在搭建Kafka集群时遇到了问题,或者想要确认配置是否正确。 首先,文件里用了Docker Compose版本3.6,定义了一个服务,包含kafka1、kafka2、kafka3三个服务。每个服务都用了bitnami/kafka:3.6.1镜像,这应该是官方的一个镜像版本。接下来,每个容器都有不同的端口映射,比如kafka1的19092映射到宿主机的9092,这可能是因为在同一台机器上运行多个实例,避免端口冲突。 然后看环境变量部分,这里有很多Kafka的配置参数。比如KAFKA_ENABLE_KRAFT=yes,说明启用了KRaft模式。KAFKA_CFG_PROCESS_ROLES设置了broker和controller,这意味着每个节点同时充当broker和controller角色,这是KRaft架构的特点。不过,注意到kafka1的内存限制是4g,而其他两个是较小的内存,这可能影响性能,用户是否知道这点? 再看网络配置,每个容器都有一个静态的IPv4地址,属于同一个子网netkafka。这有助于节点之间的通信。但是检查KAFKA_CFG_CONTROLLER_QUORUM_VOTERS,里面列出了三个节点的IP和端口,都是9093。看起来是正确的,但需要确认这些IP是否真的能互通,以及端口是否开放。 另外,每个服务的advertised.listeners配置了不同的外部端口,比如19092、29092、39092,对应的域名是kd.suufood.com。这里可能需要确认该域名是否解析到宿主机的正确IP,否则客户端可能无法连接。 还有,volumes部分挂载了宿主机的目录到容器内,确保数据持久化。路径是否正确?权限是否足够,因为容器以root用户运行,可能需要检查宿主机的目录权限。 用户可能的问题包括:集群是否配置正确,节点能否正常通信,客户端连接是否成功,或者是否有配置错误导致服务启动失败。比如,KRaft模式下controller的配置是否正确,quorum voters的IP是否正确,端口是否开放,以及内存分配是否合理。 需要指出可能的错误点,比如kafka3的端口映射是59092和59093,但advertised.listeners配置的是39092,这会导致客户端连接失败,因为宿主机端口59092映射到容器9092,但广告地址是39092,端口不匹配。用户可能需要将advertised.listeners的端口改为59092,或者调整宿主机端口映射,确保内外端口一致。 另外,检查KAFKA_BROKER_ID是否应该和NODE_ID一致?在KRaft模式下,NODE_ID应该唯一,而BROKER_ID可能已经被弃用,或者需要保持一致。需要确认当前版本的Kafka是否还使用BROKER_ID,或者是否由NODE_ID代替。如果配置了BROKER_ID,可能会引起混淆或错误。 最后,建议用户检查日志,确认每个节点是否成功加入集群,网络是否通畅,以及客户端配置是否正确使用广告地址和端口。</think>以下是对您提供的Kafka集群Docker Compose文件的逐层解析: --- ### 一、基础配置分析 1. **版本声明** `version: "3.6"` 表示使用Docker Compose v3.6语法,支持较新的配置特性 2. **网络架构** - 自定义桥接网络`netkafka`,子网`172.23.0.0/25` - 每个Kafka节点分配**静态IP**(如`172.23.0.11`),确保固定通信地址 --- ### 二、核心服务配置(以kafka1为例) #### 1. 容器基础参数 ```yaml container_name: kafka1 image: 'bitnami/kafka:3.6.1' # 使用KRaft模式的官方镜像 mem_limit: 4g # 容器内存限制(注意kafka2/3配置不同) ports: - '19092:9092' # 客户端通信端口映射 - '19093:9093' # Controller通信端口 volumes: - /data/.../broker01:/bitnami/kafka:rw # 数据持久化目录 ``` #### 2. KRaft模式关键配置 | 环境变量 | 作用说明 | |---------|---------| | `KAFKA_ENABLE_KRAFT=yes` | 启用KRaft模式(去ZooKeeper化) | | `KAFKA_CFG_PROCESS_ROLES=broker,controller` | 节点同时承担Broker和Controller角色 | | `KAFKA_CFG_CONTROLLER_QUORUM_VOTERS` | 集群控制器节点列表(需与所有节点一致) | #### 3. 监听器配置解析 ```bash KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:19092 ``` - `PLAINTEXT`:客户端通信协议 - `CONTROLLER`:集群内部控制器通信 - **注意**:`advertised.listeners`中的端口需与宿主机映射端口一致(如`19092`对应`9092`) --- ### 三、潜在问题排查点 1. **端口映射一致性** kafka3配置中: ```yaml ports: - '59092:9092' # 宿主机59092 → 容器9092 environment: - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:39092 ``` **矛盾点**:广告地址端口`39092`与映射端口`59092`不一致,客户端将无法连接 2. **内存分配差异** - kafka1分配`4G`内存,kafka2/3仅`512M`,可能影响集群稳定性 - 建议通过`KAFKA_HEAP_OPTS`统一调整堆内存 3. **网络连通性验证** 需确保: ```bash # 测试节点间通信 docker exec kafka1 nc -zv 172.23.0.12 9093 docker exec kafka2 nc -zv 172.23.0.13 9093 ``` --- ### 四、操作建议 1. **修改kafka3广告地址** ```yaml KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kd.suufood.com:59092 ``` 2. **日志检查命令** ```bash docker logs -f kafka1 | grep -i 'Registered Broker' ``` 3. **集群状态验证** ```bash # 进入任意容器执行 kafka-metadata-shell.sh \ --snapshot /bitnami/kafka/data/__cluster_metadata-0/quorum/00000000000000000000.log ``` 通过以上配置调整和验证步骤,可确保KRaft模式集群正常运作。建议使用`docker-compose up -d`启动服务后,持续监控节点日志确认选举状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值