MongoDB莫名崩溃的问题定位与解决纪实

国庆之前发布的软件版本一直运行正常,国庆之后,测试同事跑自动化测试脚本,发现该软件频繁异常,通过查看log发现,该软件使用的MongoDB崩溃了。

该软件是个Windows的桌面软件,由于需要存储大量数据,会后台启动MongoDB,并以此作为数据存储库。

报错信息

## 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运行如下命令:
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文件夹的读写规避了这个问题。

参考资料

后言

  • 要理性分析,并相信自己的专业判断。
  • 别人说的话,不要全信,如果你怀疑,那要拿出证据来,不然别人不会承认的。
  • 证明自己没错很难,证明是别人的错,更难。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐