mongodb避坑指南
场景1:启动mongo报错 Illegal instruction
故障上报
- 2023.08.15.在新机器(Red Hat 8.2)上启动 mongodb 6.0.6 报错 Illegal instruction
[root@localhost ~]# sudo -u mongodb numactl --interleave=all /opt/mongodb/bin/mongod -f /data/mongo_3717/mongo_3717.conf
Illegal instruction
[root@localhost ~]# /opt/mongodb/bin/mongod --help
Illegal instruction (core dumped)
确认过程
- 查看 demsg 日志发现,命令执行失败是因为 invalid opcode 导致,应该与操作系统的指令集有关。
[root@localhost ~]# dmesg -T | grep error
[Mon Aug 14 21:00:24 2023] traps: mongod[31576] trap invalid opcode ip:55569826892a sp:7ffe89ca94e0 error:0 in mongod[5556932c5000+6297000]
[Mon Aug 14 21:25:00 2023] traps: mongod[31610] trap invalid opcode ip:55662a86f92a sp:7fffc04252c0 error:0 in mongod[5566258cc000+6297000]
- 经过多版本测试,MongoDB 4.4.9 是ok的,从 MongoDB 5.0.5 版本开始报错。查找官方文档,确实看到安装 MongoDB 5.0 要求所在服务器的CPU支持AVX指令集
- 检查下服务器的 CPU,确实不支持 AVX (注意:若支持AVX指令集,flags字段会有打印 avx 字符串)
[root@localhost ~]# cat /proc/cpuinfo | grep avx
结论
- 若需要安装或升级到 MongoDB 5.0 及以上版本,务必确保 CPU 支持 AVX 指令集,检查命令
grep avx /proc/cpuinfo
场景2:mongo日志文件归档
- 症状:windows上面安装的mongodb服务,由于日志过大导致无法直接打开(示例已达39GB,内存不足会卡死)
- 解决:在admin数据库下执行logRotate命令手动触发日志切换,切换后会将原日志文件以时间为后缀重命名并创建一个全新且为空的日志文件供MongoDB使用
C:\Windows\System32> cd /d d:\sqldata\mongodb27017\bin
C:\Windows\System32> mongo.exe -uroot -p****** --authenticationDatabase admin --port 27017
mongo> use admin
mongo> db.adminCommand({ logRotate: 1 })
附:建议部署一个定时任务,每天执行如下内容:
echo db.adminCommand({logRotate:1}); | d:\sqldata\mongodb27017\bin\mongo.exe -uroot -p****** --authenticationDatabase admin --port 27017
