首页 > 技术文章 > Linux服务器mongodb数据库挂掉了的重连方法(超详细,持续更新!)

wangchengxu 2021-01-25 15:51 原文

缘由:linux服务器mongodb数据库挂掉了,需要重连

一、先systemctl方式启动mongo,测试是否能成功

systemctl status/start/stop mongod

二、手动方式启动(不推荐此方法)

1. 先mongo看能否连接成功

mongo

2. 查看mongo的数据库存放路径(dbpath)或者查看到mongod.conf文件路径

ps -ax | grep mongod

3. 在mongod.conf中查看数据库存放路径(dbpath)

/etc/mongo.conf      # mongo.conf文件路径。vim打开查看mongo数据库的dbpath
/var/lib/mongo       # mongo的数据库存放路径(dbpath)

4. 查看mongo的安装路径

root@xxx:/# whereis mongo
mongo: /usr/bin/mongo 

5. 切换到mongo的安装bin路径,执行重启命令

cd /usr/bin
sudo ./mongod -dbpath 刚刚查到的mongo数据库存放地址(dbpath)

如:sudo ./mongod -dbpath /var/lib/mongo

6. 有些时候,这种手动启动方式,关闭jumpserver连接服务器后会mongo数据库会断连,所以可以使用 nohup 方式后台一直启动,具体命令:

nohup mongod -dbpath /var/lib/mongo > out.log &

nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行, 具体可以查看菜鸟教程的解释和示例
以上命令表示在后台执行 mongod -dbpath /var/lib/mongo (mongo手动启动命令),并重定向输入到 out.log 文件

7. 清理旧日志,释放磁盘空间(以下摘自菜鸟教程)

df 以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
例如,我们使用df -h命令来查看磁盘信息, -h 选项为根据大小适当显示:

显示内容参数说明:

Filesystem:文件系统
Size: 分区大小
Used: 已使用容量
Avail: 还可以使用的容量
Use%: 已用百分比
Mounted on: 挂载点

相关命令:

df -hl:查看磁盘剩余空间
df -h:查看每个根路径的分区大小
du -sh [目录名]:返回该目录的大小
du -sm [文件夹]:返回该文件夹总M数
du -h [目录名]:查看指定文件夹下的所有文件大小(包含子文件夹)

三、可以通过上面手动启动mongo成功,但Jenkins更新,mongo启动失败,以下为正常排查流程

  • 查看Linux系统日志,看下mongo启动命令错误日志
  • 排查mongo自身日志,并依次解决
  • 重启mongo

1. 查看Linux系统日志,先切换root用户,然后vim打开Linux系统日志,日志文件在/var/log/messages ,路径和文件不对自行再查下

sudo su
/var/log/messages

2. vim打开后,/ 输入mongo进行查找定位,发现命令错误日志

错误显示子进程退出失败,mongo启动失败,应该是之前我们直接kill mongo进程号异常关闭mongo导致, 系统日志没有找到关键的错误原因和解决办法,再进入mongo日志进行定位查找

3. 查找mongo日志文件路径

vim etc/mongod.conf

vim打开后查找到mongo的日志文件路径为:/var/log/mongodb/mongod.log

4. vim打开mongo日志, 继续定位mongo启动失败问题

MongoDB的日志文件在设置 logappend=true 的情况下,会不断向同一日志文件追加的,时间长了,日志文件会变得非常大,vim打开会很慢
可以将旧的mongod.log文件改名,新建一个同名的mongod.log,再来复现Jenkins更新时mongo启动失败问题,这样vim打开就很快了
打开mongo日志文件后,错误如下:(可以先命令行模式输入nohl取消之前vim搜索mongo关键字的高亮显示)

5. mongod.lock文件暂不可用问题(Unable to lock the lock file)

以上错误表示:mongod.lock文件暂不可用,因为我们之前手动拉起了一个mongo,而mongo启动一个示例后就会占用mongod.lock文件,所以Jenkins再启动mongo就会提示mongod.lock文件暂不可用

6. mongo地址和端口被占用(SocketException: Address already in use)

以上错误表示:mongo默认的127.0.0.1:27017地址和端口被占用了

以上错误表示:无法断开套接字文件/tmp/mongodb-27017.sock,mongodb-27017.sock可以理解为一个套接字管道文件

8. mongo目录下文件权限错误(Permission denied)

以上错误表示:mongo目录下的WiredTiger.turtl文件操作时权限错误,这就引申一个mongo启动用户组的问题

9. 先查看正常的服务器下,mongo的文件权限及用户组

top查看得知正常机器人的mongo启动的用户组为mongod

10. 查看启动错误的mongo文件权限及用户组

ls -ll 查看var/lib/mongo目录下的文件权限及用户组

11. 更改mongo目录下的文件权限及用户组为之前查到的mongod

sudo chown -R mongod:mongod /var/lib/mongo/*

12. top查看mongod运行的用户组,确定是否为mongod,如果是roo等其他用户组,不是mongod用户组则需要手动关闭mongo连接再重新执行Jenkins更新

sudo chown -R mongod:mongod /var/lib/mongo/*

13. 进入mongo后执行手动关闭mongo连接,切忌使用kill进程方式,否则又会报之前的mongo异常关闭错误

mongo
use admin
db.shutdownServer()

14. 重新执行Jenkins更新,mongo即被正常启动了

结语:这次踩坑还是有很多益处,以后要学着多看日志,包括系统日志和出问题的工具,数据库,框架等日志,通过日志来一步步定位问题和解决

这次mongo的问题最初是服务器系统磁盘满了,所以更新失败,但是我先一步进行手动启动mongo导致各种mongo文件占用和文件权限被更改才导致后面各种更新时,mongo启动失败,还是需规范化排错流程

Computer science and software engineering have always been my passion

推荐阅读