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

烦请各位帮忙,另祝学业精进,工作顺利。


10 回复

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 文件,将 logpathlogappend 设置为合适的值,并增加 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

希望以上建议能够帮助你解决问题。祝学业精进,工作顺利!


看看 log 说些啥。

谢谢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,正在测试……

和云管理员联系吧。太不正常了,log 里什么都没有。

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应用连接数据库,可以尝试以下几个步骤来排查和解决问题:

  1. 检查MongoDB日志:MongoDB通常会在/var/log/mongodb/mongodb.log中记录错误信息。查看这些日志可以帮助理解为什么MongoDB服务会停止。

    sudo tail -f /var/log/mongodb/mongodb.log
    
  2. 检查系统资源:内存不足可能会导致MongoDB服务停止。使用tophtop命令检查系统资源使用情况。

    top
    
  3. 优化MongoDB配置:如果MongoDB因为内存限制而崩溃,可以调整MongoDB的配置文件以减少内存占用。编辑/etc/mongodb.conf文件,例如,调整storage.journal.enabled=false以禁用写日志,但这会影响数据持久性。

    sudo nano /etc/mongodb.conf
    

    修改完配置后重启MongoDB服务:

    sudo service mongodb restart
    
  4. 使用pm2管理Node.js进程:pm2是一个进程管理器,可以确保Node.js应用始终运行。如果你还没有安装pm2,可以通过npm全局安装它。

    npm install pm2 -g
    

    然后使用pm2启动你的Node.js应用:

    pm2 start app.js
    

通过以上步骤,你应该能够定位并解决MongoDB服务自动停止的问题。希望这些建议对你有所帮助!

回到顶部