我们遇到了卡夫卡的问题。有时突然,我们会在没有警告的情况下退出同步并在发出事件时开始出现异常。
我们得到的例外是
java.io.IOException: Too many open files
似乎这是 Kafka 在许多情况下抛出的一般异常。我们对其进行了一些调查,我们认为根本原因是尝试向某个主题发出事件时,它失败了,因为 kafka 没有该主题的领导分区
有人可以帮忙吗?
我们遇到了卡夫卡的问题。有时突然,我们会在没有警告的情况下退出同步并在发出事件时开始出现异常。
我们得到的例外是
java.io.IOException: Too many open files
似乎这是 Kafka 在许多情况下抛出的一般异常。我们对其进行了一些调查,我们认为根本原因是尝试向某个主题发出事件时,它失败了,因为 kafka 没有该主题的领导分区
有人可以帮忙吗?
我假设你在 Linux 上。如果是这种情况,那么发生的事情是您的打开文件描述符用完了。真正的问题是为什么会发生这种情况。
默认情况下,Linux 通常将此数字保持在相当低的水平。您可以通过 ulimit 检查实际值:
ulimit -a | grep "open files"
然后,您可以再次通过 ulimit 设置该值:
sudo ulimit -n 4096
也就是说,除非有问题的 Kafka 主机有很多主题/分区,否则达到该限制是不寻常的。可能发生的是其他一些进程正在保持文件或连接打开。为了弄清楚你将不得不用 lsof 做一些侦探工作。
发生这种情况的一种情况是,当您的分区号很大时,因为每个分区都映射到代理中文件系统中的一个目录,该目录由两个文件组成。其中一个用于索引,另一个用于数据。经纪人打开这两个文件。所以更多的分区号有更多的打开文件。正如 Doomy 所说,您可以增加 linux 中打开的文件,但此配置不是永久的,当您关闭会话时,此配置将消失。如果您使用此命令进行检查,则在下一次登录中
ulimit -a | grep "open files"
你可以看到旧号码。但是使用此配置,您可以使其永久化:
打开这个文件:
sudo nano /etc/pam.d/common-session
并添加这一行:
session required pam_limits.so
之后,您可以在 limits.config 中设置限制,如下所示:
sudo nano /etc/security/limits.conf
然后你可以在这个文件中设置限制,例如
* soft nofile 80000
或任何硬配置。之后关闭您的会话并再次检查打开文件的限制
我在 Linux/CentOS 上遇到过类似的“java.io.IOException: Too many open files”问题。就我而言,在使用isof检查打开的 fd 之后,是 kafka-web-console 打开了太多连接。停止它解决了我的问题。
在我们的案例中,我们的 Kafka 主题被意外配置"segment.ms" = 20000
,并且在默认值为 604800000(1 周)时每 20 秒生成新的日志段。
我们使用的是亚马逊的 msk,所以我们自己没有能力运行命令,但是亚马逊支持能够为我们监控它。这导致了这个问题,但是一些节点没有恢复。
我们走了两步。。
1) 强制压实
我们将保留率和比率设置为低以进行清理
"delete.retention.ms" = 100
"min.cleanable.dirty.ratio" = "0.01"
其中一个节点能够恢复......但另一个节点似乎没有恢复到 Kafka 实际运行压缩的程度,它似乎是最大主题之一的“领导者”。
2)释放空间
我们决定销毁这个大主题,希望它能解除对节点的阻塞。最终,压缩似乎在所有节点上运行。
后来我们用新的分割设置恢复了我们破坏的主题,并且一直运行良好。