Kafka 0.10.0集群突发apiKey:3、apiVersion:5无效请求异常求助
解决Kafka 0.10.0版本InvalidRequestException异常方案
集群背景
- 基于HDP搭建的Kafka集群,broker版本为0.10.0,共4台节点,已稳定运行4-5年
- 近期出现如下异常日志:
[2023-11-27 14:40:52,453] ERROR Closing socket for 192.9.231.83:9092-192.9.231.83:32584 because of error (kafka.network.Processor) org.apache.kafka.common.errors.InvalidRequestException: Error getting request for apiKey: 3 and apiVersion: 5 Caused by: java.lang.IllegalArgumentException: Invalid version for API key 3: 5 at org.apache.kafka.common.protocol.ProtoUtils.schemaFor(ProtoUtils.java:31) at org.apache.kafka.common.protocol.ProtoUtils.requestSchema(ProtoUtils.java:44) at org.apache.kafka.common.protocol.ProtoUtils.parseRequest(ProtoUtils.java:60) at org.apache.kafka.common.requests.MetadataRequest.parse(MetadataRequest.java:97) at org.apache.kafka.common.requests.AbstractRequest.getRequest(AbstractRequest.java:48) at kafka.network.RequestChannel$Request.liftedTree2$1(RequestChannel.scala:96) at kafka.network.RequestChannel$Request.<init>(RequestChannel.scala:91) at kafka.network.Processor$$anonfun$processCompletedReceives$1.apply(SocketServer.scala:492) at kafka.network.Processor$$anonfun$processCompletedReceives$1.apply(SocketServer.scala:487) at scala.collection.Iterator$class.foreach(Iterator.scala:727) at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) at scala.collection.IterableLike$class.foreach(IterableLike.scala:72) at scala.collection.AbstractIterable.foreach(Iterable.scala:54) at kafka.network.Processor.processCompletedReceives(SocketServer.scala:487) at kafka.network.Processor.run(SocketServer.scala:417) at java.lang.Thread.run(Thread.java:745)
已排查情况
- 确认集群内无broker版本不匹配问题
num.replica.fetchers参数已设置为8,排除该参数调整的解决路径
问题根源分析
日志中apiKey=3对应MetadataRequest(元数据请求),apiVersion=5是该请求的协议版本。Kafka 0.10.0版本的MetadataRequest最高仅支持到apiVersion=2,而请求使用了版本5,说明是客户端使用了远高于broker版本的Kafka客户端库发起请求,导致broker无法解析高版本协议。
具体解决方案
1. 定位问题客户端
- 依据日志中的客户端IP(192.9.231.83),找到对应的业务应用或服务
- 检查该应用使用的Kafka客户端依赖版本,确认是否为2.0及以上版本(MetadataRequest v5是在Kafka 2.0版本引入的)
2. 客户端侧适配
- 降级客户端版本:若该应用是近期新部署或升级的,将其Kafka客户端版本降级到与broker匹配的0.10.x系列版本,彻底解决协议兼容问题
- 强制指定兼容协议版本:若无法降级客户端,可在客户端配置中添加以下参数,强制使用broker兼容的旧版本协议:
api.version.request=false broker.version.fallback=0.10.0.0 metadata.max.age.ms=300000
3. 集群侧临时防护(可选)
- 在broker配置中开启
log.unknown.version=true,让broker记录未知版本请求的详细信息,便于后续排查 - 若存在大量此类无效请求,可通过防火墙或Kafka的IP白名单机制限制问题客户端访问,避免占用集群资源
4. 长期解决方案
Kafka 0.10.0版本已停止维护多年,存在大量安全漏洞和兼容性缺陷,建议逐步将集群升级到稳定的新版本(如2.8.x或3.x系列),从根源上消除版本兼容隐患。
内容的提问来源于stack exchange,提问作者jessica
相关产品推荐
相关产品推荐

