centos下,mongodb开机不能自启动,systemctl、rc.local都试了,还是不行,要不要放弃?

阅读目录
问题背景
转机:strace命令
strace的使用
比较正常情况下,和异常情况下的strace输出日志
柳暗花明
总结
回到顶部
问题背景
最近装个centos 7.6的环境,其中,基础环境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自启动使用的是systemctl,其他几个组件,都没啥问题,唯独,这个mongodb,是死活启动不了。

但是,我这里说的,不是启动不了,如果直接在shell里敲:

Copy
systemctl start mongod.service

是没啥问题的,是可以启动的。

mongod.service大致如下,各文件夹的权限也已经仔细检查过,应该是没毛病:

Copy
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment=“OPTIONS=-f /etc/mongod.conf”
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking

file size

LimitFSIZE=infinity

cpu time

LimitCPU=infinity

virtual memory size

LimitAS=infinity

open files

LimitNOFILE=64000

processes/threads

LimitNPROC=64000

locked memory

LimitMEMLOCK=infinity

total threads (user+kernel)

TasksMax=infinity
TasksAccounting=false

Recommended limits for for mongod as specified in

http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

后边换成了rc.local方式:

Copy
/etc/rc.d/rc.local

#!/bin/bash
/usr/bin/mongod --fork -f /etc/mongod.conf &
但是,依然不行。

这两天,同事也在断断续续在弄,大家手里有其他事,这块暂时放下了。

回到顶部
转机:strace命令
我一般浏览器开的tab比较多,有个几天前的tab,是关于strace的,我当时主要是想:找一个命令,可以监控某个进程的网络请求。

本来可以用tcpdump,但是,这个不是针对某个进程的,只能通过端口过滤,一般情况下,用端口过滤也足够了,但是,总是觉得不爽。

然后找到了这个链接:

https://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process

里面提到了strace可以做到。试了下,确实完美解决了我的问题。

比如说,我可以attach到某个进程,然后调用进程的某个接口,让该进程调用某个微服务,然后看看我们能不能抓到:

(看不清可在单独tab查看,这个是java应用,向注册中心eureka发送的心跳,可以发现,完美抓到了)

回到顶部
strace的使用
可参考我的这篇简单介绍:

Linux下,如何监控某个进程到底向哪个地址发起了网络调用

大家也可以直接在服务器上直接执行以下shell,查看帮助文档:

Copy
yum install strace
man strace
其主要支持两种方式,一种是直接使用strace来包装某个命令,使用strace来启动该命令;另一种,就是上面说的,attach到某个已经在运行中的进程。

然后,我想到,既然strace可以监控系统调用,那么,监控下mongodb吧,这里可以用strace来包装命令,我试着把命令换成了如下的样子:

Copy
strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf
这块命令,分两块看。

Copy
strace -tt -s 10000 -o mongo.txt
这部分是strace的参数,

-tt 打印时间

-s 设置字符串的长度,否则具体内容显示不出来

-o 将结果输出到文件

另外部分,就是mongo的命令了:

Copy
/usr/bin/mongod --fork /etc/mongod.conf
比较正常情况下,和异常情况下的strace输出日志#

在同事建议下,我们先直接在shell中执行了以下命令:

Copy
strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf
然后,得到了mongo.txt。这个是正常的文件。

然后,我们reboot了服务器,然后不清楚文件生成到哪里了,直接find查找了一把,然后找到后,把这两个文件,都存到了pc上,用beyond compare进行对比。

下面是对比结果:

建议大图查看。

可以发现,有问题的文件里,在打开以下文件时,报了错,提示没有权限:

Copy
/sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied)
然后,我们只是知道了,有这个现象,但不知道为啥,然后就开始了一顿漫无边际的面向搜索引擎找问题。找了半天,没啥收获。

后边我们就决定再去看看官网,看看官网有没有说,怎么才是正统的服务自启动方式(已经快放弃了。。。)

回到顶部
柳暗花明
结果在官网的如下链接:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/#install-mongodb-community-edition

看到如下一段话,说SELinux,默认不让mongo访问/sys/fs/cgroup:

然后我一看,这个目录有点熟悉啊,上面报没有权限的文件,不就这个目录下吗?

Copy
/sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied)
知道原因就好说了,原来是SELinux,我们这边比较暴力,直接把这个关闭了。

关闭方式:https://www.cnblogs.com/activiti/p/7552677.html

回到顶部
总结
在华为的时候,组里的大佬们有一句话:办法总比困难多。

那时感觉,这也太鸡汤了。。。

我现在也有这个感觉,每次在快要放弃时,问题结果被解决了,有点意思。

另外一个感悟:方法比结果重要

我是逐日,定居成都的后端java程序猿一枚.对于一线编码实战、网络、数据库、高并发等有浓厚兴趣。

博客分类导航贴:博客目录导航,让我们一起学起来吧(持续更新)

文章观点不一定对,但可以保证,都是一字一字敲出来的,如果有疑问的话,欢迎扫描下面的二维码加我微信,一起沟通交流。

换了这个新模板,自带打赏功能;每篇文章,光是写文章的时间,基本耗时都在2个小时以上,还没算上弄demo代码的时间,码字不易,那大家如果觉得文章有帮助,可以点个推荐,或者关注我,老板些可以打赏点辛苦钱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值