架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6117|回复: 1

【转】Kafka Windows 系统运行一段时间就挂掉解决方案

[复制链接]
发表于 2021-7-12 10:57:01 | 显示全部楼层 |阅读模式
1:背景

之前使用kafka都是在Linux环境下的,没有出现什么kafka本身的问题。但是,目前在做的一个项目需要兼容Window和Linux,在Window环境下使用Kafka时才发现kafka本身对于window的兼容不如Linux。

2:问题

window下对kafka进行测试的时候,发现kafka在上线一段时间之后,出现了错误:

另一个程序正在使用文件,进程无法访问。
以下解决方案不能彻底解决问题,不建议使用

Windows Kafka ERROR Failed to clean up log for __consumer_offsets
https://www.itsvse.com/thread-9980-1-1.html


QQ截图20210712092102.jpg

[2021-07-06 09:06:10,800] ERROR Failed to clean up log for __consumer_offsets-42 in dir C:\tmp\kafka-logs due to IOException (kafka.server.LogDirFailureChannel)
java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.cleaned ->
C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。

        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:904)
        at kafka.log.AbstractIndex.renameTo(AbstractIndex.scala:210)
        at kafka.log.LazyIndex$IndexValue.renameTo(LazyIndex.scala:155)
        at kafka.log.LazyIndex.$anonfun$renameTo$1(LazyIndex.scala:79)
        at kafka.log.LazyIndex.renameTo(LazyIndex.scala:79)
        at kafka.log.LogSegment.changeFileSuffixes(LogSegment.scala:496)
        at kafka.log.Log.$anonfun$replaceSegments$4(Log.scala:2402)
        at kafka.log.Log.$anonfun$replaceSegments$4$adapted(Log.scala:2402)
        at scala.collection.immutable.List.foreach(List.scala:333)
        at kafka.log.Log.replaceSegments(Log.scala:2402)
        at kafka.log.Cleaner.cleanSegments(LogCleaner.scala:613)
        at kafka.log.Cleaner.$anonfun$doClean$6(LogCleaner.scala:538)
        at kafka.log.Cleaner.$anonfun$doClean$6$adapted(LogCleaner.scala:537)
        at scala.collection.immutable.List.foreach(List.scala:333)
        at kafka.log.Cleaner.doClean(LogCleaner.scala:537)
        at kafka.log.Cleaner.clean(LogCleaner.scala:511)
        at kafka.log.LogCleaner$CleanerThread.cleanLog(LogCleaner.scala:380)
        at kafka.log.LogCleaner$CleanerThread.cleanFilthiestLog(LogCleaner.scala:352)
        at kafka.log.LogCleaner$CleanerThread.tryCleanFilthiestLog(LogCleaner.scala:332)
        at kafka.log.LogCleaner$CleanerThread.doWork(LogCleaner.scala:321)
        at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96)
        Suppressed: java.nio.file.FileSystemException: C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.cleaned -> C:\tmp\kafka-logs\__consumer_offsets-42\00000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。

                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:901)
                ... 20 more

3:原因

kafka日志清理策略触发,在window环境下,在打开需要清理的日志的同时,对该文件进行重命名操作是不被允许的(linux环境下可以),从而导致kafka宕机。

网上的解决方案最多的就是“清空kafka的日志文件然后重启kafka”,这种解决方式在生产环境下显然是不现实的。所以在一开始我又针对情况得出以下两种解决方案:

方案一:修改日志清理策略,将日志清理时间修改为无穷(-1),使kafka数据日志永久存储
缺点:(1)磁盘空间会不断增大
方案二:在window上搭建虚拟机(docker同理,且更麻烦),然后在虚拟机中部署kafka
缺点:(1)运维人员需要懂点linux运维知识(2)增加内存消耗

显然,这两种方案的缺点都让我无法忍受,所以我把视线转向kafka社区寻求帮助。

点击此处膜拜大神们的探讨:https://github.com/apache/kafka/pull/6329

据了解,原来kafka在window下的这个问题,还并不没有想象中的那么容易,官方目前为止也没有解决方案。换句话说(你们就不要在window下使用kafka啦!)

方案三:不过即便如此,在window下使用kafka的需求还是存在的,所以还是有很多大神们在关注并提出一些解决方案的。其中就有一位大神针对这个问题对kafka源码进行了二次开发。经过测试,他的这个方案在window下确实解决了问题,使得kafka可以在window下使用。但是对于这个方案,kafka的contributor说可能不太安全(就是不能将该补丁整合到官方中)。

4:解决(尾部有提供编译好的kafka包下载链接)
虽然kafka官方说该补丁不太安全,但是官方在目前为止又没有什么作为。而需求确是实实在在存在的,所以在一番考虑之下,我还是打算采用方案三的方式,一劳永逸的解决问题,所以接下来我们就要将该补丁打进,并重新编译kafka。

4.1:kafka补丁版本下载

下载该作者的kafka补丁版本

https://github.com/apache/kafka/tree/0baf9c158b5681a55df4de3a0e6193d32b1433ff

4.2:编译kafka补丁版本
由于kafka编译是通过gradle的,所以需要先配置好gradle

关于如何配置gradle可以参考这篇文章(转载来的,侵权即删)Windows下gradle的安装与配置:https://blog.csdn.net/zhaokai0130/article/details/81008719

关于如何编译kafka,可以参考github------如何使用gradle编译kafka:https://github.com/apache/kafka/tree/0baf9c158b5681a55df4de3a0e6193d32b1433ff

编译完之后,就可以得到一个可以在window下使用的kafka包了。

本着“复制-粘贴“的理念(毕竟编译源码还是挺耗时间的),这里提供一个我编译好的kafka包下载链接,下载直接使用即可。

kafka_2.12-2.3.0_window 防宕机版下载地址:

https://down.itsvse.com/item/nzraqz.html

原文链接:https://blog.csdn.net/chengtanyong4777/article/details/102542326







上一篇:MySQL 查询数据库表的注释
下一篇:【转】Sql Server 关于分区表的总结
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2021-7-12 21:16:33 | 显示全部楼层
还没玩的论坛老大这么高深 膜拜
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-19 17:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表