两个 listeners 的区别
listeners 决定 Broker 实际绑定并监听哪些地址与协议;advertised.listeners 决定 Broker 把什么地址告诉客户端与其他 Broker。前者是「我愿意在哪个网卡上听」,后者是「别人应该用哪个地址来找我」。两者配错,最典型的表现是客户端能拿到元数据却连不上实际的分区 Leader。
为什么云主机和容器最容易出问题
云主机与容器里的网卡地址往往是内网地址或临时地址,Broker 默认可能广播容器内网的地址。客户端在宿主机或集群外解析到这些地址后无法路由,于是出现「连得上、收不到」的现象。解决办法就是显式配置 advertised.listeners 为外部可达的域名或地址。
基本信息
| listeners | Broker 实际监听的协议与地址,常写 0.0.0.0 表示监听全部网卡 |
|---|---|
| advertised.listeners | 广播给客户端与其他 Broker 的地址,必须是可路由地址 |
| inter.broker.listener.name | Broker 之间通信用哪个监听器 |
| listener.security.protocol.map | 监听器名称与安全协议的映射 |
| 生效方式 | 修改监听相关配置通常需要重启 Broker |
配置项读法
| 配置项 | 作用 | 常见错误 |
|---|---|---|
| listeners | 本机绑定地址 | 只绑了 127.0.0.1,外部完全无法连接 |
| advertised.listeners | 对外广播地址 | 广播了容器内网地址,客户端拿到后连不上 |
| inter.broker.listener.name | Broker 间通信监听器 | 名称与 listeners 中定义的不一致导致启动失败 |
| listener 名称 | 监听器标识(如 PLAINTEXT、SASL_SSL) | 名称随意但必须与安全协议映射一致 |
典型使用场景
- 云主机部署:把广播地址设为公网域名或弹性地址
- 容器编排部署:区分集群内访问与集群外访问的地址
- 多网卡主机:管理与业务网络分离,分别绑定不同监听器
- 安全加固:为外部监听器启用 SSL 或 SASL 协议
- 跨网段集群:确保 Broker 之间使用可互通的监听器通信
典型配置
典型配置
# 本机监听:9092 对外提供业务读写,9093 用于控制器或其他用途
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 对外广播:必须是客户端真实可路由的地址(域名或正确 IP)
advertised.listeners=PLAINTEXT://kafka1.example.com:9092
# Broker 之间通信使用哪个监听器
inter.broker.listener.name=PLAINTEXT
# 服务端与客户端连接后返回给客户端的地址,受影响的就是 advertised.listeners排查「能连上元数据但消费超时」的问题时,先核对 advertised.listeners:客户端从任意 Broker 拿到的是同一个广播地址,广播地址不可路由时,元数据请求会成功而后续读写全部失败。
修改监听器配置通常需要滚动重启 Broker:重启期间该节点的分区会触发 Leader 切换,务必在业务低峰执行并分节点进行,避免一次性影响大量分区。