ubuntu下mongodb服务自动停止 Nodejs相关排查建议
ubuntu下mongodb服务自动停止 Nodejs相关排查建议
各位大侠好。我在ubuntu下部署了一个node.js + mongodb的个人网站,但 mongodb service 在服务器启动一段时间后会莫名其妙的停止,请问大家有类似的问题么?请教应该怎么解决。具体说明如下:
1. mongoDB 版本 mongo --version MongoDB shell version: 2.4.6
2. 安装过程 参照mongoDB官方文档安装:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
3. mongodb服务状态 服务器启动时,远程登录并查看: sudo service mongodb status mongodb start/running, process 2199 运行一段时间,大概5 - 10分钟,网站异常,原因是node无法链接mongo数据库,再次查看: sudo service mongodb status mongodb stop/waiting
烦请各位帮忙,另祝学业精进,工作顺利。
Ubuntu 下 MongoDB 服务自动停止 Node.js 相关排查建议
各位大侠好。我在 Ubuntu 下部署了一个 Node.js + MongoDB 的个人网站,但 MongoDB 服务在服务器启动一段时间后会莫名其妙地停止。请各位帮忙提供一些排查建议。具体说明如下:
1. MongoDB 版本
mongo --version
输出结果:
MongoDB shell version: 2.4.6
2. 安装过程
参照 MongoDB 官方文档进行安装: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
3. MongoDB 服务状态
服务器启动时,远程登录并查看:
sudo service mongodb status
输出结果:
mongodb start/running, process 2199
然而,在运行一段时间后(大约 5 到 10 分钟),网站出现异常,原因是 Node.js 无法连接到 MongoDB 数据库。此时再次查看:
sudo service mongodb status
输出结果:
mongodb stop/waiting
排查建议
1. 检查日志文件
MongoDB 的日志文件通常位于 /var/log/mongodb/mongodb.log
。检查该文件以了解服务停止的原因。
tail -f /var/log/mongodb/mongodb.log
2. 资源限制
检查系统资源使用情况,特别是内存和 CPU 使用率。如果资源不足,MongoDB 可能会自动停止以避免进一步的问题。
top
3. 配置文件检查
检查 MongoDB 的配置文件 /etc/mongodb.conf
,确保没有错误的配置项。例如,检查 storage.dbPath
是否正确设置,并且有足够的磁盘空间。
cat /etc/mongodb.conf
4. 日志级别调整
将 MongoDB 的日志级别调高,以便获取更多详细信息。
编辑 /etc/mongodb.conf
文件,将 logpath
和 logappend
设置为合适的值,并增加 verbose
级别。
# /etc/mongodb.conf
logpath=/var/log/mongodb/mongodb.log
logappend=true
verbose=true
重启 MongoDB 服务:
sudo service mongodb restart
5. 监控脚本
编写一个简单的监控脚本来定期检查 MongoDB 的状态,并在服务停止时自动重启。
// monitor_mongodb.js
const { exec } = require('child_process');
setInterval(() => {
exec('sudo service mongodb status', (error, stdout, stderr) => {
if (stdout.includes('stop/waiting')) {
console.log('MongoDB stopped, restarting...');
exec('sudo service mongodb restart');
}
});
}, 60000); // 每分钟检查一次
// 启动监控脚本
node monitor_mongodb.js
希望以上建议能够帮助你解决问题。祝学业精进,工作顺利!
谢谢leapon先,日志上看一切正常,重启服务后 -- 服务停止后: vi /var/log/mongodb/mongodb.log
Wed Oct 30 23:45:57.798 [initandlisten] waiting for connections on port 27017
Wed Oct 30 23:45:57.798 [websvr] admin web console waiting for connections on port 28017 Thu Oct 31 00:12:05.122 [initandlisten] connection accepted from 127.0.0.1:43525 #1 (1 connection now open) Thu Oct 31 00:12:08.259 [conn1] end connection 127.0.0.1:43525 (0 connections now open) …… Thu Oct 31 00:13:01.120 [conn1] end connection 127.0.0.1:43525 (0 connections now open)
后面还有些 connection accepted 和 end connection,都是重复的类似内容。连接数最大才到6。最后一条是上面的 end connection。
另外不知道这个和帐户是否有关系,云服务器系统安装后,提供给我的就是root用户名和密码。之前是用root创建一个admin帐户,在admin帐户下安装和运行数据库,程序等,并且添加了开机自动启动…… 两三天试了很多方法都不行。
我现在在root账户下重新安装mongodb,正在测试……
Leapon 你好,还要请教你一下。
前天晚上我重装了系统和mongodb,为了找出问题所在,我没有运行链接mongodb的app,而是单独让mongodb服务在运行,同时跑了一个test程序,test只是单纯的从某端口接受请求,返回一个“hello world”。test不连接mongodb,我想看看是那个部分先down掉。
过了一天,mongodb服务和test程序都运行良好。于是我修改了原来的app,单纯的用node.js链接到mongodb,什么也不做,又运行了一个下午,一切正常。
但晚上我再次更新app,进行了一条数据库的插入,操作成功,但半小时后发现app挂掉了,ssh登录一看mongodb服务停止了。下面是log
Sat Nov 2 05:37:46.704 [conn174] end connection 127.0.0.1:43816 (4 connections now open) Sat Nov 2 05:37:46.704 [conn175] end connection 127.0.0.1:43817 (4 connections now open) Sat Nov 2 05:37:46.704 [conn173] end connection 127.0.0.1:43815 (4 connections now open) Sat Nov 2 05:37:46.704 [conn172] end connection 127.0.0.1:43814 (4 connections now open) Sat Nov 2 05:37:46.704 [conn176] end connection 127.0.0.1:43818 (4 connections now open) Sat Nov 2 05:37:56.646 [initandlisten] connection accepted from 127.0.0.1:43819 #177 (1 connection now open) Sat Nov 2 05:37:56.657 [initandlisten] connection accepted from 127.0.0.1:43820 #178 (2 connections now open) Sat Nov 2 05:37:56.657 [initandlisten] connection accepted from 127.0.0.1:43821 #179 (3 connections now open) Sat Nov 2 05:37:56.657 [initandlisten] connection accepted from 127.0.0.1:43822 #180 (4 connections now open) Sat Nov 2 05:37:56.657 [initandlisten] connection accepted from 127.0.0.1:43823 #181 (5 connections now open) Sat Nov 2 05:38:23.239 [PeriodicTask::Runner] task: WriteBackManager::cleaner took: 199ms Sat Nov 2 05:38:27.616 [TTLMonitor] query CodeCraft.system.indexes query: { expireAfterSeconds: { $exists: true } } ntoreturn:0 ntoskip:0 nscanned:1 keyUpdates:0 numYields: 1 locks(micros) r:1268824 nreturned:0 reslen:20 812ms Sat Nov 2 05:38:28.992 [TTLMonitor] query local.system.indexes query: { expireAfterSeconds: { $exists: true } } ntoreturn:0 ntoskip:0 nscanned:0 keyUpdates:0 locks(micros) r:675203 nreturned:0 reslen:20 663ms Sat Nov 2 05:38:38.625 [conn179] end connection 127.0.0.1:43821 (4 connections now open) Sat Nov 2 05:38:38.625 [conn178] end connection 127.0.0.1:43820 (4 connections now open) Sat Nov 2 05:38:38.625 [conn181] end connection 127.0.0.1:43823 (4 connections now open) Sat Nov 2 05:38:38.625 [conn177] end connection 127.0.0.1:43819 (4 connections now open) Sat Nov 2 05:38:38.625 [conn180] end connection 127.0.0.1:43822 (4 connections now open)
以上就是log文件的末尾部分,前面也很正常,log里没有提到任何服务停止的原因。请问log里面 [conn180]等是什么意思?第180个链接吗?那请问是否有链接数的限制?我记得最大连接数是800,整个log里出现的最大连接数是6呀……
更新app并进行数据库插入的那一个版本,程序运行时候 mongo api 没有任何error,操作很成功,而且进入mongo查看也看得到数据。应该说明链接和数据存取api的调用都没有问题。
但突然想起一个问题,我是在ubuntu下用supervisorctl管理node应用的进程。之前配置supervisorctl的都是用 node server.js 命令,上面更新app时顺带更新了supervisorctl配置文件,改用 nodemon server.js 。
我在想会不会是 supervisorctl 执行 nodemon 命令中间使mongdb服务出现问题了。现在改回 node server.js 命令测试中,一小时过去了一切正常,等待明早再次查看结果……
最大连接数是6 - 6 是同时连接在数据库的上限 (concurrent)
[conn180] - 180 是第180个数据库的连接
我在本地机和aws的ubuntu运行mongodb,没遇到过类似问题。感觉你的云服务有问题。以前试用azure云的时候,linux锁住硬盘,无法写入。这样的问题只能云管理者才能调试。你的问题还是出现的话,建议换一家云服务商。
谢谢你leapon,现在两天过去了,一切正常,而且进行了更多的数据库操作,都没有问题。
我猜应该就是 nodemon 的原因。
ssh链接服务器,在 supervisorctl 中使用 nodemon 命令很快就会出现 mongodb 挂掉的问题。 换用 node 就没事了
在Ubuntu下遇到MongoDB服务自动停止的问题,并且这会影响到你的Node.js应用连接数据库,可以尝试以下几个步骤来排查和解决问题:
-
检查MongoDB日志:MongoDB通常会在
/var/log/mongodb/mongodb.log
中记录错误信息。查看这些日志可以帮助理解为什么MongoDB服务会停止。sudo tail -f /var/log/mongodb/mongodb.log
-
检查系统资源:内存不足可能会导致MongoDB服务停止。使用
top
或htop
命令检查系统资源使用情况。top
-
优化MongoDB配置:如果MongoDB因为内存限制而崩溃,可以调整MongoDB的配置文件以减少内存占用。编辑
/etc/mongodb.conf
文件,例如,调整storage.journal.enabled=false
以禁用写日志,但这会影响数据持久性。sudo nano /etc/mongodb.conf
修改完配置后重启MongoDB服务:
sudo service mongodb restart
-
使用pm2管理Node.js进程:pm2是一个进程管理器,可以确保Node.js应用始终运行。如果你还没有安装pm2,可以通过npm全局安装它。
npm install pm2 -g
然后使用pm2启动你的Node.js应用:
pm2 start app.js
通过以上步骤,你应该能够定位并解决MongoDB服务自动停止的问题。希望这些建议对你有所帮助!