MongoDB莫名崩溃的问题定位与解决纪实
国庆之前发布的软件版本一直运行正常,国庆之后,测试同事跑自动化测试脚本,发现该软件频繁异常,通过查看log发现,该软件使用的MongoDB崩溃了。
该软件是个Windows的桌面软件,由于需要存储大量数据,会后台启动MongoDB,并以此作为数据存储库。
报错信息
shell
## error 1
[thread1] WiredTiger error (16) [1697520288:390687][8764:140707646429280], log-server: __win_fs_rename, 125: D:\data5\mongodb\data\journal\WiredTigerTmplog.0000000002 to D:\data5\mongodb\data\journal\WiredTigerPreplog.0000000001: file-rename: MoveFileExW: 另一个程序正在使用此文件,进程无法访问。\r\n: Resource device Raw: [1697520288:390687][8764:140707646429280], log-server: __win_fs_rename, 125: D:\data5\mongodb\data\journal\WiredTigerTmplog.0000000002 to D:\data5\mongodb\data\journal\WiredTigerPreplog.0000000001: file-rename: MoveFileExW: 另一个程序正在使用此文件,进程无法访问。\r\n: Resource device
## error 2
2023-10-12T15:17:52.032+0800 W FTDC [ftdc] Uncaught exception in 'FileRenameFailed: 另一个程序正在使用此文件,进程无法访问。' in full-time diagnostic data capture subsystem. Shutting down the full-time diagnostic data capture subsystem.
原因分析
- 这是mongodb的数据目录里面的文件,按理其他程序不会去操作这些文件,难道是因为启动了多个mongod进程?
措施:重启电脑,重新运行软件,结果还是会有这个报错
- 已发布版本,国庆之前都正常,而且从来没出现过这个error,莫非是系统有啥升级?
咨询IT,反馈系统没有升级
- mongodb bug?
直觉和理性告诉我,应该不是,不然为啥国庆节前没有出现过,节后频繁出现。
类似案例查找
一顿搜索。。。结果99.99999%都是无用信息,直到在mongodb社区发现这篇帖子
Mongod random crashes on Windows: FileRenameFailed
社区工作人员回复:
Sorry you're having difficulty with this issue, but unfortunately I believe the error FileRenameFailed originated from outside the server, so it's typically an OS level issue.
这句话基本印证了我的猜想,不是mongodb的问题,也不是我的软件问题
再继续。。看到最后个回复,
I just had the same issue with mongodb 4.4.22. I enabled file auditing on windows and it appears Kaspersky is to blame:
卡巴斯基是罪魁祸首!!!我电脑没装卡巴斯基,但是装了"腾讯安全管家",欣喜若狂呀,赶紧把安全管家退出了!!!
但,高兴的有点早,测试下来mongodb还是会报错,一样一样的。
不过,这个回答还是给了有用信息,I enabled file auditing on windows
,如果能监控下是哪个软件占用了程序,就知道是谁在搞事情!
问题是,怎么监控呢?
监控文件被哪些软件读写
- 通过本地组策略编辑器 修改 审核策略,访问文件都增加审核
- "本地组策略编辑器" 怎么打开呢,win+r,输入gpedit.msc,回车
报错:gpedit.msc不存在!!!又是一顿搜索,windows家庭版默认不开启gpedit.msc。。。
- 安装gpedit.msc,powershell运行如下命令:
shell
Get-ChildItem -Path "C:\Windows\servicing\Packages\*" |
Where-Object{($_.Name -like "Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum")`
-or ($_.Name -like "Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum")} |
foreach {dism.exe /online /norestart /add-package:$_}
- 修改审核策略
计算机配置->Windows 设置 -> 安全设置 -> 本地策略 -> 审核策略 -> 审核对象访问
- 添加待审核文件夹
选中D:\data5\mongodb\data\journal 目录,右键->属性->安全->高级->审核->添加,添加Everyone -> 应用,保存
- 查看"事件查看器"中的审核日志
windows 搜索直接搜索"事件查看器"即可,Windows日志->安全,选中任意一条事件,就能看到事件详细信息,如下图所示:
-
搜索被占用的文件名,看看这个文件被哪些软件占用了(也就是触发了访问审核的,有审核日志的),在事件查看器中按Ctrl+F搜索文件名
-
终于找到了罪魁祸首!这个奇怪的exe再读写mongodb的文件!!!!
-
这是啥呢?找IT,IT说这是公司的安全管理软件。。。。得了,终于找到证据了,IT同事你上吧。。
-
最后IT同事通过修改这个软件的配置信息,忽略mongodb文件夹的读写规避了这个问题。
参考资料
- Mongod random crashes on Windows: FileRenameFailed
- Complete Guide to Windows File System Auditing - Varonis
后言
- 要理性分析,并相信自己的专业判断。
- 别人说的话,不要全信,如果你怀疑,那要拿出证据来,不然别人不会承认的。
- 证明自己没错很难,证明是别人的错,更难。