Kafka Broker 出现Too many open files
问题描述
环境
- kafka server 0.10.0.1 (查看libs/kafka_2.10-0.10.0.1.jar)
- 5个broker
- 1000个partition,3份的存储
- 部分partition每秒数据有3000,一半以上的大概1000条
- 数据每条大概是100B
- 200个partition的数据被实时消费
- 使用机械硬盘
问题表现
- 外部无法连接
- 此时第一个kafka broker上的日志
server.log大量出现错误1 2 3 4 5 6 7 8
[2019-06-21 18:03:29,341] ERROR Error while accepting connection (kafka.network.Acceptor) java.io.IOException: Too many open files at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) at kafka.network.Acceptor.accept(SocketServer.scala:323) at kafka.network.Acceptor.run(SocketServer.scala:268) at java.lang.Thread.run(Thread.java:748) - 查看kafka server的文件句柄
lsof -p <pid>,里面有近十万的can't identify protocol - 消费程序无法获取数据
- 到一定时候,有问题的broker可能崩溃。
- 重启出问题的broker后,问题解决。
排查过程
因为数据是多副本,所以考虑将问题节点下线,但是下线后遇到问题,消费程序都不能从kafka消费。
使用jstack连续多次抓取消费者Java进程,发现,
但是这时用kafka-console-consumer.sh来消费是可以。
继续排查后,发现不同的消费方式会有不同的结果(在后续版本中,这些参数混乱被纠正了):
- 使用参数
--zookeeper localhost:2181可以消费 - 使用参数
--bootstrap-server localhost9092 --new-consumer的方式不可以消费
有伙伴怀疑,__consumer_offset是单点的,使用kafka-topic.sh --describe看了之后,发现的确如此,而且单点位置放置在第一个broker上,因此当第一个broker出问题后,整个kafka集群不能消费。
使用kafka-reassign-partitions.sh将__consumer_offset做三份,打散到多个broker后。问题解决。
留下评论