Kafka生产发送数据失败
我们使用kafka时,有时候会遇到发送数据失败的情况,其原因及解决方案如下:
1. Kafka topic leader为-1
Kafka客户端执行如下命令查看topic的leader信息:
kafka-topics.sh --describe --zookeeper zk业务IP:24002/kafka
如果leader为-1,需查看Replicas中的副本节点是否正常,查看命令如下:
kafka-broker-info.sh --zookeeper zk业务IP:24002/kafka
命令中可以查询到brokerid,说明节点kafka服务正常
如果leader为-1的分区对应的Replicas中节点都不正常,需要先恢复异常节点kafka服务。如果都正常但ISR列表中无节点信息,或者ISR列表中的节点不正常,需要查看Kafka服务端的unclean.leader.election.enable参数是否为true或者topic端是否配置此参数为true。如果都不为true,需要对此topic修改配置为true。
Kafka服务端的unclean.leader.election.enable参数配置查看方式如下:
Kafka topic端unclean.leader.election.enable参数配置查看方式如下:
kafka-topics.sh --describe --zookeeper zk业务IP:24002/kafka --topic topicName
如果Config中无unclean.leader.election.enable信息,则与服务端配置一致。
如果有,则此配置优先级高于服务端配置。
修改topic端此配置的方式如下:
kafka-topics.sh --alter --topic topicName --zookeeper zk业务IP:24002/kafka --config unclean.leader.election.enable=true
2. DNS配置导致
执行 vi /etc/resolv.conf,如果有“nameserver X.X.X.X”,把此内容注释掉
3. 网络异常
生产端节点ping服务端IP,ping -s 15000 IP,如果延迟高于5ms,说明网络延迟过高,也可通过长ping来判断是否有网络丢包。
4. CPU或者IO过高也可能导致连接失败
iostat -d -x 1查看CPU参数idle和IO参数util,idle值越高,CPU越空闲,util值越高,IO使用率越高。如果idle值小于20%,top -Hp kafkaPid查看CPU使用率高的线程,打jstack日志分析具体的原因;如果util值大于80%,查看磁盘对应的读写速率、await和svctm的大小判断对IO影响大的原因,如果读写速率比较大,排查kafka读写请求和延时,如果awati远大于svctm,IO队列太长,应用响应时间很慢。
5. 磁盘坏道或者其他原因也可能导致连接失败
如果server.log日志中有大量“java.io.IOException: Connection to IP:21007 (id: 2 rack: null) failed”日志,查看IP节点操作系统日志中是否有“Sense Key : Medium Error”信息,如果有,说明出现磁盘坏道,需修复或更换磁盘。另外,还需要打此节点的jstack信息,排查是否有阻塞或者死锁。如果是C80版本,且jstack信息中有如下信息,需打死锁补丁:
6. 如果报“TimeoutException”或偶尔发送失败,可先调大request.timeout.ms,并查看服务端num.io.threads和num.network.threads是否可以优化(这两个参数一般调整为节点磁盘个数的倍数)。根据发送的数据量的大小也可适当调整batch.size、buffer.memory、linger.ms的大小。如果发送的数据量很大且可容忍一定时延,也可以考虑开启压缩,compression.type指定压缩方式,可配置为“gzip”、“snappy”或“lz4”。
7. ssh卡住
ssh -v -p 端口号 异常节点ip
如果如上图所示卡住,解决方式是将GSSAPIAuthentication修改为no
8. 如果是集群外客户端生产发送失败,还可以通过集群内客户端测试下生产是否成功,进一步减小排查方向。
- 点赞
- 收藏
- 关注作者
评论(0)