从磁盘已满错误恢复Kafka群集

时间:2019-07-08 13:49:00

标签: apache-kafka replication diskspace

我们有一个3节点的Kafka集群。对于数据存储,我们在每个/data/disk1节点中有2个已安装的磁盘-/data/disk23log.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

大多数主题的复制因子是23。因此,我想知道是否可以执行以下操作:

  1. 将所有主题(节点2和节点3运行正常)的复制因子更改为2
  2. delete来自Node1的一些东西。
  3. 重新启动Node 1
  4. 像最初一样,将复制因子更改回23

有人知道更好的方法或更好的建议吗?

更新:需要步骤1和4 not。如果您有副本,仅23就足够了。

1 个答案:

答案 0 :(得分:1)

您的问题(以及相应的解决方案)类似于此问题中所述的问题:kafka 0.9.0.1 fails to start with fatal exception

最简单,最快的方法是删除部分数据。代理启动时,将使用新的保留时间复制数据。

  

所以,我想知道我是否可以执行以下操作...

专门回答问题-是的,您可以按顺序执行描述的步骤,这将有助于使群集恢复到一致状态。

为防止将来发生这种情况,您可以尝试使用参数 log.retention.bytes 代替 log.retention.hours ,尽管我相信对于日志使用基于大小的保留策略不是最佳选择,因为正如我的实践所示,在大多数情况下,有必要至少知道主题存储在群集中的时间。