【问题标题】:Kafka - Broker fails because all log dirs have failedKafka - 代理失败,因为所有日志目录都失败了
【发布时间】:2019-01-09 16:21:34
【问题描述】:

我正在尝试在 Windows 操作系统上进行简单的 kafka 配置。我的 zookeeper 和 kafka 安装使用默认配置(数据和日志目录路径除外)。我可以毫无问题地启动 kafka 并生成/使用消息;但是,当代理尝试删除旧消息时(我将日志保留时间设置为 100 毫秒),我收到以下错误:

    java.nio.file.FileSystemException: C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log -> C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log.deleted: The process cannot access the file because it is being used by another process.

        at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
        at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
        at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:387)
        at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
        at java.nio.file.Files.move(Files.java:1395)
        at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:697)
        at org.apache.kafka.common.record.FileRecords.renameTo(FileRecords.java:212)
        at kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:415)
        at kafka.log.Log.kafka$log$Log$$asyncDeleteSegment(Log.scala:1601)
        at kafka.log.Log.kafka$log$Log$$deleteSegment(Log.scala:1588)
        at kafka.log.Log$$anonfun$deleteSegments$1$$anonfun$apply$mcI$sp$1.apply(Log.scala:1170)
        at kafka.log.Log$$anonfun$deleteSegments$1$$anonfun$apply$mcI$sp$1.apply(Log.scala:1170)
        at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
        at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
        at kafka.log.Log$$anonfun$deleteSegments$1.apply$mcI$sp(Log.scala:1170)
        at kafka.log.Log$$anonfun$deleteSegments$1.apply(Log.scala:1161)
        at kafka.log.Log$$anonfun$deleteSegments$1.apply(Log.scala:1161)
        at kafka.log.Log.maybeHandleIOException(Log.scala:1678)
        at kafka.log.Log.deleteSegments(Log.scala:1161)
        at kafka.log.Log.deleteOldSegments(Log.scala:1156)
        at kafka.log.Log.deleteRetentionMsBreachedSegments(Log.scala:1228)
        at kafka.log.Log.deleteOldSegments(Log.scala:1222)
        at kafka.log.LogManager$$anonfun$cleanupLogs$3.apply(LogManager.scala:854)
        at kafka.log.LogManager$$anonfun$cleanupLogs$3.apply(LogManager.scala:852)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
        at scala.collection.immutable.List.foreach(List.scala:392)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
        at kafka.log.LogManager.cleanupLogs(LogManager.scala:852)
        at kafka.log.LogManager$$anonfun$startup$1.apply$mcV$sp(LogManager.scala:385)
        at kafka.utils.KafkaScheduler$$anonfun$1.apply$mcV$sp(KafkaScheduler.scala:110)
        at kafka.utils.CoreUtils$$anon$1.run(CoreUtils.scala:62)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
        Suppressed: java.nio.file.FileSystemException: C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log -> C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log.deleted: The process cannot access the file because it is being used by another process.

                at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
                at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
                at sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:301)
                at sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:287)
                at java.nio.file.Files.move(Files.java:1395)
                at org.apache.kafka.common.utils.Utils.atomicMoveWithFallback(Utils.java:694)
                ... 32 more

And then...

[2018-08-01 18:14:01,479] INFO [ReplicaManager broker=0] Stopping serving replicas in dir C:\Workspace\kafka_2.11-1.1.0\kafka-logs (kafka.server.ReplicaManager)
[2018-08-01 18:14:01,480] ERROR Uncaught exception in scheduled task 'kafka-log-retention' (kafka.utils.KafkaScheduler)
org.apache.kafka.common.errors.KafkaStorageException: Error while deleting segments for discrete-topic-0 in dir C:\Workspace\kafka_2.11-1.1.0\kafka-logs
Caused by: java.nio.file.FileSystemException: C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log -> C:\Workspace\kafka_2.11-1.1.0\kafka-logs\discrete-topic-0\00000000000000000000.log.deleted: The process cannot access the file because it is being used by another process.
[2018-08-01 18:14:01,504] INFO Stopping serving logs in dir C:\Workspace\kafka_2.11-1.1.0\kafka-logs (kafka.log.LogManager)
[2018-08-01 18:14:01,508] ERROR Shutdown broker because all log dirs in C:\Workspace\kafka_2.11-1.1.0\kafka-logs have failed (kafka.log.LogManager)

好像是这个问题:https://issues.apache.org/jira/browse/KAFKA-6188

kafka 版本:kafka_2.11-1.1.0 视窗 10 动物园管理员版本:3.4.12

我有几个问题:

  1. 有人遇到过这个问题吗?有解决方法吗?
  2. 此时在 Windows 上运行 kafka 代理是否可行?我知道 Windows 不支持它,而且似乎存在多个严重问题。

谢谢

【问题讨论】:

  • 有什么理由不使用最新的 Kafka?而且 100 毫秒真的很小......但无论如何,该文件仍在被另一个进程使用,这不完全是 Windows 问题
  • 你可以在这篇文章中查看我的答案:stackoverflow.com/questions/51473270/kafka-configuration/…我认为这是同一个问题。
  • 1) 是,没有解决方法 2) 没有针对 windows 的测试,所以它不是一个真正受支持的平台,所以从我的角度来看,不适合生产
  • 1) 我将保留时间设置为 100 毫秒以快速清除日志。我同意这是一个非常小的值,不适合正常操作。 2)@Bitswazsky 您的解决方案似乎确实有帮助。谢谢

标签: apache-kafka


【解决方案1】:

第一步:在 server.properties 文件中指向一个新的日志目录并保存文件

log.dirs=C:\Tools\kafka_2.11-2.1.0\kafka-test-logs

第 2 步:再次启动 kafka 服务器

/bin/windows/kafka-server-start.bat /config/server.properties

【讨论】:

  • 这(更改 log.dirs)有所帮助,但不清楚原因
  • 很奇怪。 log.dirs=C:\Tools\kafka_2.11-2.1.0\kafka-test-logs 创建目录 c:\ProgramPortable\kafka_2.12-2.3.0\Toolskafka_2.11-2.1.0kafka-test-logs\是你所期望的吗?
  • 您必须使用 \\ 来转义反斜杠。
【解决方案2】:

当我使用 here 所述的默认配置在本地运行 zookeeper、kafka 服务器、命令行生产者和消费者时遇到了类似的问题。

服务器和生产者成功启动,但是当我尝试启动消费者时,我立即遇到了日志失败的问题。

我通过为服务器、生产者和消费者设置不同的日志目录来修复它。至于没有明确的方法为生产者和消费者设置它,我不得不更新他们的启动脚本。我加了一行

set LOG_DIR=/distr/kafka_2.11-2.2.0/producer_logs

kafka_console_producer.bat
/distr/kafka_2.11-2.2.0/consumer_logs 分别为kafka_console_consumer.bat
修复消费者成功启动后。 似乎问题是因为所有三个进程都使用相同的日志目录并以某种方式相互干扰。

【讨论】:

    【解决方案3】:

    我有相同的 kafka 行为,但只是重命名或清理日志目录并不能解决问题。每次我尝试启动 kakfa 时它都会崩溃(它正在生成所有已删除的日志)。

    解决方案:

    1. 像以前一样删除日志。
    2. 转到 ZooKeeper 数据目录(您可以在 \conf\zoo.cfg 中找到它)并清理它。重新启动一切,它应该完全重置。

    【讨论】:

    • 我还删除了 zookeeper 数据日志,它起作用了
    【解决方案4】:

    我在 Windows 上使用 Kafka 2.12-2.3.0。对我有用的是更改 server.properties 设置 log.dirs= 以包含日志数据 Kafka 和 Zookeeper。

    例子:

    log.dirs=C:/kafka_2.12-2.3.0/data/kafka, C:/kafka_2.12-2.3.0/data/zookeeper

    【讨论】:

    • 在使用kafka自带的zookeeper时是否适用
    • 谢谢!这对我有用。我正在使用带有 Kafka 2.13 的 Windows 10。
    【解决方案5】:

    我尝试了多种方法来解决这个问题:

    1. 从 server.properties 中 log.dirs 属性指向的文件夹中删除日志。 它确实在一定时间内解决了我的问题,但是当我创建了 20 多个主题时它停止了工作,所以每次我启动我的 kafka 服务器时都会出现这个问题。

    2. 尝试使用命令“kafka-topics --zookeeper localhost:2181 --delete --topic topicname”从 kafka 中删除主题,但它将我的主题标记为 --“标记为删除标志”。但没有解决我的问题。

    最后我尝试删除 kafka 的 tmp 文件夹中的 zookeeper 和 kafka-logs 文件夹,它成功了,所有主题都被删除了。

    【讨论】:

      【解决方案6】:

      删除 Kafka 代理的日志文件以及 Zookeeper 的数据和日志文件,然后重新启动它们。 还要记住在重新启动 Kafka 和 Zookeeper 之前停止 Kafka 客户端

      【讨论】:

        【解决方案7】:

        您可以删除所有 Kafka 数据。见Kafka docs

        1. 如果您还没有这样做,请使用 Ctrl-C 停止生产者和消费者客户端。
        2. 使用 Ctrl-C 停止 Kafka 代理。
        3. 最后,使用Ctrl-C 停止 ZooKeeper 服务器。

        如果您还想删除本地 Kafka 环境的任何数据 包括您在此过程中创建的任何事件,运行命令:

        $ rm -rf /tmp/kafka-logs /tmp/zookeeper
        

        【讨论】:

          【解决方案8】:

          转到 kafka 文件夹中的 config 文件夹(例如 D:\kafka\config) 打开 zookeeper.properties 编辑你的 datadir 看起来像: dataDir = D:/kafka/data/zookeeper 在记事本中打开 server.properties 并编辑 logs.dirs 和 zookeeper.connect logs.dirs = D:/kafka/data/kafka zookeeper.connect=localhost:2181 注意:根据您自己的 kafka 设置和文件夹替换 D:\kafka

          【讨论】:

            【解决方案9】:

            尝试在 Kafka 文件夹中创建一个新文件夹。 更改 server.properties 和 zookeeper.properties 并重新启动命令提示符,然后再次尝试启动服务器。

            【讨论】:

              【解决方案10】:

              在开发机器中,我停止了zookeeper和kafka-server以及所有客户端并删除了日志目录的内容。 然后依次启动zookeeper、kafka、connector、clients。

              【讨论】:

                【解决方案11】:

                删除本地文件夹下的所有文件,如 docker 监视器中所示。之后,重新启动容器。

                【讨论】:

                  猜你喜欢
                  • 2020-02-24
                  • 2020-07-30
                  • 2018-04-20
                  • 2012-11-30
                  • 2013-03-31
                  • 2023-01-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-22
                  相关资源
                  最近更新 更多