我们有一个3节点的Kafka集群。对于数据存储,我们在每个/data/disk1
节点中有2个已安装的磁盘-/data/disk2
和3
。 log.dirs
中的kafka.properties
设置是:
log.dirs=/data/disk1/kafka-logs,/data/disk2/kafka-logs
碰巧,在节点Node1
之一中,磁盘分区/data/disk2/kafka-logs
充满了100%
。
发生这种情况的原因是-我们正在将数据从filebeat重放到kafka主题,并且很短时间内就推送了许多数据。我已将该主题的保留时间从1 day
暂时更改为7 days
,因此主题大小已恢复正常。
问题是-在Node1
100%充满的/data/disk2/kafka-logs
中,kafka进程无法启动并发出错误:
Jul 08 12:03:29 broker01 kafka[23949]: [2019-07-08 12:03:29,093] INFO Recovering unflushed segment 0 in log my-topic-0. (kafka.log.Log)
Jul 08 12:03:29 broker01 kafka[23949]: [2019-07-08 12:03:29,094] INFO Completed load of log my-topic-0 with 1 log segments and log end offset 0 in 2 ms (kafka.log.Log)
Jul 08 12:03:29 broker01 kafka[23949]: [2019-07-08 12:03:29,095] ERROR There was an error in one of the threads during logs loading: java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code (kafka.log.LogManager)
Jul 08 12:03:29 broker01 kafka[23949]: [2019-07-08 12:03:29,101] FATAL [Kafka Server 1], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
Jul 08 12:03:29 broker01 kafka[23949]: java.lang.InternalError: a fault occurred in a recent unsafe memory access operation in compiled Java code
Jul 08 12:03:29 broker01 kafka[23949]: at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
Jul 08 12:03:29 broker01 kafka[23949]: at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
Jul 08 12:03:29 broker01 kafka[23949]: at org.apache.kafka.common.record.FileLogInputStream$FileChannelLogEntry.loadRecord(FileLogInputStream.java:135)
Jul 08 12:03:29 broker01 kafka[23949]: at org.apache.kafka.common.record.FileLogInputStream$FileChannelLogEntry.record(FileLogInputStream.java:149)
Jul 08 12:03:29 broker01 kafka[23949]: at kafka.log.LogSegment.$anonfun$recover$1(LogSegment.scala:22
大多数主题的复制因子是2
或3
。因此,我想知道是否可以执行以下操作:
2
delete
来自Node1的一些东西。 Node 1
2
或3
。有人知道更好的方法或更好的建议吗?
更新:需要步骤1和4 not
。如果您有副本,仅2
和3
就足够了。
答案 0 :(得分:1)
您的问题(以及相应的解决方案)类似于此问题中所述的问题:kafka 0.9.0.1 fails to start with fatal exception
最简单,最快的方法是删除部分数据。代理启动时,将使用新的保留时间复制数据。
所以,我想知道我是否可以执行以下操作...
专门回答问题-是的,您可以按顺序执行描述的步骤,这将有助于使群集恢复到一致状态。
为防止将来发生这种情况,您可以尝试使用参数 log.retention.bytes 代替 log.retention.hours ,尽管我相信对于日志使用基于大小的保留策略不是最佳选择,因为正如我的实践所示,在大多数情况下,有必要至少知道主题存储在群集中的时间。