Kafka ZooKeeper节点/brokers/ids/$id中port字段含义及配置疑问
Kafka多监听器场景下ZooKeeper元数据port字段解析
背景信息
Kafka监听器配置
listeners=PUBLIC_SASL://0.0.0.0:5011,PUBLIC_PLAIN://0.0.0.0:5010 advertised.listeners=PUBLIC_SASL://192.168.181.2:5011,PUBLIC_PLAIN://192.168.181.2:5010 listener.security.protocol.map=PUBLIC_SASL:SASL_PLAINTEXT,PUBLIC_PLAIN:PLAINTEXT inter.broker.listener.name=PUBLIC_SASL
其中5010为明文PLAINTEXT端口,5011为SASL_PLAINTEXT认证端口。
ZooKeeper中broker元数据(/brokers/ids/$id)
{ "listener_security_protocol_map": { "PUBLIC_SASL": "SASL_PLAINTEXT", "PUBLIC_PLAIN": "PLAINTEXT" }, "endpoints": [ "PUBLIC_SASL://192.168.181.2:5011", "PUBLIC_PLAIN://192.168.181.2:5010" ], "jmx_port": -1, "features": { }, "host": "192.168.181.2", "timestamp": "1658485899402", "port": 5010, "version": 5 }
问题解答
1. port字段的含义
这是Kafka为兼容0.10.0.0版本之前的旧客户端保留的遗留字段。旧版本客户端不支持多监听器配置,只会读取这个单一的port字段来和broker建立连接,不会解析endpoints里的多端口列表。
2. 为什么取值为5010
Kafka生成port字段值的逻辑是:从listeners配置的所有监听器中,选取第一个使用PLAINTEXT协议的端口。你的配置里,PUBLIC_PLAIN是第一个出现的PLAINTEXT类型监听器,对应端口5010,所以这个字段就被设为5010。
3. 能否修改为5011
可以修改,但要根据实际场景权衡影响:
- 方法一:如果不需要明文PLAINTEXT端口,直接删除
PUBLIC_PLAIN相关的监听器配置,此时Kafka会把第一个非SSL的监听器(也就是PUBLIC_SASL的5011端口)作为port字段的值。 - 方法二:修改协议映射(不推荐):把
PUBLIC_SASL的协议改为PLAINTEXT,同时确保它是listeners中的第一个条目,但这样会让5011端口失去SASL认证能力,变成明文端口。 - 注意:如果你的环境里没有旧版本客户端,这个
port字段的取值根本不会影响业务——新版本客户端会正确解析endpoints列表中的所有端口,根据自身配置选对应端口连接。
内容的提问来源于stack exchange,提问作者Charlie Lin
相关产品推荐
相关产品推荐

