- 问题参考
- 原因
- 解决: bat 进程守护运行
- 无黑窗口运行模式
ERROR Failed to clean up log for __consumer_offsets-42 in dir C:tmpkafka-logs due to IOException (kafka.server.LogDirFailureChannel) java.nio.file.FileSystemException: C:tmpkafka-logs__consumer_offsets-4200000000000000000000.timeindex.cleaned -> C:tmpkafka-logs__consumer_offsets-4200000000000000000000.timeindex.swap: 另一个程序正在使用此文件,进程无法访问。 .... java.nio.file.FileSystemException
Windows Kafka ERROR Failed to clean up log for __consumer_offsets
[Kafka错误]-----kafka在window下出现另一个程序正在使用此文件,进程无法访问的错误
kafka日志清理策略触发,在window环境下,在打开需要清理的日志的同时,对该文件进行重命名操作是不被允许的(linux环境下可以),从而导致kafka宕机。
解决: bat 进程守护运行方案一:修改日志清理策略,将日志清理时间修改为无穷(-1),使kafka数据日志永久存储 缺点:(1)磁盘空间会不断增大
方案二:在window上搭建虚拟机(docker同理,且更麻烦),然后在虚拟机中部署kafka 缺点:(1)运维人员需要懂点linux运维知识(2)增加内存消耗
方案三:上面文章中有写到重新打补丁包,我试过在2.8.0-2.13.0版本中重新打包,结果还是不行。
于是乎 用个简单的bat脚本 对kafka的启动进程守护, 1.每10秒检查端口运行状态 2.注意:重新启动时会 清空kafka的日志文件
kafka_run_daemon.bat
@echo off
:: 执行的命令
set _startBat=D:softwarekafkastart.bat
:: 日志所在位置
set _kafkaLogs=D:softwarekafkatmp
:checkstart
:: 端口方式进行检查
netstat -ano | findstr 0.0.0.0 | findstr :19092 | findstr LISTENING > nul
if %ERRORLEVEL% EQU 0 (
echo 运行正常
GOTO checkag ) else (
echo 没有运行
GOTO startsvr )
:startsvr
echo %time% kafka运行状态异常、正在重新启动
:: 检查 zookeeper
echo %time% 检查zookeeper状态
netstat -ano | findstr 0.0.0.0 | findstr :12181 | findstr LISTENING > nul
if %ERRORLEVEL% EQU 0 (
echo %time% zookeeper正在运行
FOR /F "tokens=5" %%P IN ('netstat -a -n -o ^| findstr :12181') DO TaskKill.exe /PID %%P -t -f
echo %time% zookeeper结束完成
) else (
echo %time% zookeeper没有运行
)
:: 删除tmp zookeepr和kafka的运行日志
echo %time% 删除tmp zookeepr和kafka的运行日志
rd/s/q %_kafkaLogs%
echo %time% 日志清理完成
:: 开始启动
echo %time% 开始启动
start %_startBat%
set/p=.nul
echo .
echo Wscript.Sleep Wscript.Arguments(0) >%tmp%delay.vbs
cscript //b //nologo %tmp%delay.vbs 40000
::计划40秒完成启动
echo %time% 启动操作完成,检查存活状态
GOTO checkstart
:checkag
echo %time% 程序运行正常,10秒后继续检查...
echo Wscript.Sleep Wscript.Arguments(0) >%tmp%delay.vbs
cscript //b //nologo %tmp%delay.vbs 10000
GOTO checkstart
start.bat 卡夫卡启动脚本
start .binwindowszookeeper-server-start.bat .configzookeeper.properties timeout 10 start .binwindowskafka-server-start.bat .configserver.properties exit
使用方法 ,将两个bat复制到kafka根目录,配置好bat 里面的日志位置(此处将kafka和zookeeper都放在同一tem文件夹),
直接运行 kafka_run_daemon.bat,也可添加到系统服务中去
本地测试,挂掉后可以正常重启:
无黑窗口运行模式在上面的进程守护基础之上
run_zookeeper.vbs
Dim WinscriptHost
Set WinscriptHost = CreateObject("Wscript.Shell")
WinscriptHost.Run ".binwindowszookeeper-server-start.bat .configzookeeper.properties", 0, True
Set WinscriptHost = Nothing
run_kafka.vbs
Dim WinscriptHost
Set WinscriptHost = CreateObject("Wscript.Shell")
WinscriptHost.Run ".binwindowskafka-server-start.bat .configserver.properties", 0, True
Set WinscriptHost = Nothing
start_vbs.bat
start wscript runZookeeper.vbs timeout 10 start wscript runKafka.vbs exit
run_zookeeper.vbs和run_kafka.vbs复制到kafka根目录, 修改 kafka_run_daemon.bat脚本中的_startBat**(执行命令)=start_vbs.bat,
运行kafka_run_daemon.bat, 则kafka和zookeeper将不会出现黑窗口。**
这不是好的解决办法 ~~有其他解决办法的话,望看到的大哥们告知一下。



