Kafka客户端3.4.0连接2.8.1服务器出现异常日志问题咨询
Kafka客户端升级至3.4.0后出现DisconnectException及Node -1断开日志的原因与解决办法
问题现象
客户端从2.5.1升级至3.4.0后,线上服务器版本为2.8.1,程序启动后出现DisconnectException及Node -1 disconnected的INFO级日志,但实际可正常收发消息,切回2.5.1客户端后日志消失。
相关日志
2023-08-02 16:14:24.892 INFO 48784 --- [est,test1,test2] o.a.kafka.clients.FetchSessionHandler : [Consumer clientId=consumer-sos2-1, groupId=sos2] Error sending fetch request (sessionId=INVALID, epoch=INITIAL) to node 101578: org.apache.kafka.common.errors.DisconnectException: null Then, about nine minutes passed, it shows that. 2023-08-02 16:23:01.824 INFO 48784 --- [ad | producer-3] org.apache.kafka.clients.NetworkClient : [Producer clientId=producer-3] Node -1 disconnected. 2023-08-02 16:23:06.216 INFO 48784 --- [est,test1,test2] org.apache.kafka.clients.NetworkClient : [Consumer clientId=consumer-sos2-1, groupId=sos2] Node -1 disconnected. 2023-08-02 16:23:10.299 INFO 48784 --- [ad | producer-1] org.apache.kafka.clients.NetworkClient : [Producer clientId=producer-1] Node -1 disconnected. 2023-08-02 16:23:10.844 INFO 48784 --- [ad | producer-2] org.apache.kafka.clients.NetworkClient : [Producer clientId=producer-2] Node -1 disconnected.
原因分析
- 版本协议兼容性差异:3.4.0客户端引入了部分新的协议特性(如Fetch Session优化逻辑),与2.8.1服务器交互时,初始请求因版本协商不匹配触发短暂断开,客户端后续会自动降级重试,因此不影响业务但会生成日志。
- 连接空闲超时触发:3.4.0客户端默认
connection.max.idle.ms为9分钟(540000ms),与日志中9分钟后出现断开的时间点完全吻合。当连接空闲达到超时时间,客户端会主动关闭连接,重新建立连接过程中会触发Node -1 disconnected日志(Node -1是客户端标记“未找到可用节点”的虚拟标识)。 - 元数据刷新逻辑变化:3.4.0客户端的元数据刷新机制与2.5.1不同,若元数据缓存过期或刷新不及时,会导致客户端临时找不到可用节点,进而生成断开日志,后续元数据更新后恢复正常。
解决办法
1. 适配服务器版本,调整客户端协议配置
在客户端配置中显式指定兼容服务器的版本,避免使用服务器不支持的新特性:
# 强制客户端适配Kafka 2.8.1版本的协议 min.kafka.version=2.8.1 # 启用API版本请求,确保客户端与服务器协商兼容的协议版本 api.version.request=true
2. 调整连接空闲超时配置
将客户端connection.max.idle.ms调整为与服务器一致或更长时间(服务器2.8.1默认connections.max.idle.ms为10分钟),避免因空闲超时触发不必要的连接断开:
# 设置连接空闲超时为10分钟(与服务器默认值一致) connection.max.idle.ms=600000
3. 优化元数据刷新配置
调整元数据刷新间隔,确保客户端及时获取最新的集群节点信息:
# 缩短元数据刷新间隔至3分钟,减少元数据过期概率 metadata.max.age.ms=180000
4. 临时屏蔽日志(治标方案)
若业务不受影响且无需排查此类日志,可调整日志框架配置,将相关类的日志级别从INFO提升至WARN或ERROR:
- 对于Logback,在
logback.xml中添加:
<logger name="org.apache.kafka.clients.FetchSessionHandler" level="WARN"/> <logger name="org.apache.kafka.clients.NetworkClient" level="WARN"/>
- 对于Log4j2,在
log4j2.xml中添加:
<Logger name="org.apache.kafka.clients.FetchSessionHandler" level="WARN"/> <Logger name="org.apache.kafka.clients.NetworkClient" level="WARN"/>
内容的提问来源于stack exchange,提问作者HIKARIZT
相关产品推荐
相关产品推荐

