Docker部署3节点ZooKeeper+3节点Kafka集群连接报错问题
问题根因
- 核心故障为Kafka监听器配置错误:报错中出现的节点ID
2147483644是Kafka标识不可达控制器节点的预留虚拟ID,报错指向连接127.0.0.1:9094,说明broker向ZooKeeper注册的广播地址(advertised.listeners)配置成了容器内回环地址。客户端从ZK拿到元数据后,会尝试访问broker广播的地址,此时如果广播的是127.0.0.1,客户端就会去连自己所在环境的回环地址,自然无法访问其他broker节点,这也是把地址换成localhost后依然报相同错误的直接原因。 - 偶发broker进程退出、连接时好时坏的问题通常来自两个诱因:一是Confluent cp-kafka:7.1.1版本默认JVM堆内存需求不低于1G,Docker默认分配的内存不足时,系统OOM Killer会直接杀掉Kafka进程,这类强制kill不会在应用日志中留下错误记录;二是3节点ZooKeeper集群配置错误导致选举不稳定、脑裂,broker和ZK会话超时就会离线。
排查步骤
- 进入任意Kafka容器执行
cat /etc/kafka/kafka.properties | grep LISTENERS,核对监听器配置项,重点确认advertised.listeners的值是否包含127.0.0.1/localhost。 - 在宿主机执行
docker inspect kafka1 kafka2 kafka3 | grep OOMKilled,如果返回值为true即可确认是内存不足导致进程被强制终止。 - 进入任意ZooKeeper容器执行
./bin/zkCli.sh ls /brokers/ids,连续执行3-5次,如果返回的broker ID列表频繁变化、有节点反复消失/出现,即可确认ZK集群选举异常,需核对每个ZK节点的myid配置、节点间选举通信地址配置。
修复方案
- 修正每个Kafka节点的监听器环境变量配置,三个节点分别对应调整广播地址:
# kafka1 配置 KAFKA_LISTENERS: INTERNAL://0.0.0.0:9092 KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL # kafka2 配置 KAFKA_LISTENERS: INTERNAL://0.0.0.0:9093 KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka2:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL # kafka3 配置 KAFKA_LISTENERS: INTERNAL://0.0.0.0:9094 KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka3:9094 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
禁止在advertised.listeners配置中使用127.0.0.1、localhost这类仅当前容器可访问的回环地址。
2. 给每个Kafka、ZooKeeper容器添加内存限制配置,单容器分配内存不低于1.5G:
mem_limit: 1500m
- 修正ZooKeeper集群配置,三个节点的
ZOO_MY_ID分别设置为1、2、3,所有节点的ZOO_SERVERS配置统一为:
server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
- 配置修改完成后,执行
docker-compose down -v清空所有旧的ZK、Kafka数据卷,删除残留的错误元数据后再重启集群。 - 集群启动后验证功能时,生产/消费命令的broker列表直接写三个节点的容器通信地址:
# 生产命令示例 kafka-console-producer --broker-list kafka1:9092,kafka2:9093,kafka3:9094 --topic first_topic # 消费命令示例 kafka-console-consumer --bootstrap-server kafka1:9092,kafka2:9093,kafka3:9094 --topic first_topic --from-beginning
内容的提问来源于stack exchange,提问作者Raul Cejas
相关产品推荐
相关产品推荐

