使用配置文件启动MongoDB

Ubuntu 16.04 (阿里云ECS),MongoDB 4.0,

原来,已经写了10篇MongoDB的随笔了。可是,自己居然没有使用配置文件启动过MongoDB,对其更多的配置是不明白的。

昨天(180808)花了一些努力,终于,实现了使用配置文件启动MongoDB、并且改进了随机启动脚本,本文便是对此过程进行的记录。

注意,安装方式很关键!安装方式不同,可能会和本文介绍的内容存在差别,请读者自行判别。本文使用的安装方式Install MongoDB Community Edition on Ubuntu,其中的Using .deb Packages (Recommended)。

新发现,终于知道自己为何可以在ECS上率性用上使用配置文件启动MongoDB了!原来,在其/etc目录中存在一个mongod.conf文件:

$ ls -l mongod.conf
-rw-r--r-- 1 root root 626 Jun 22 10:19 mongod.conf

本地开发环境和ECS都是使用相同的安装方式,可是,刚刚检查本地系统时却没有找到/etc/mongod.conf文件,检查ECS上的mongod.conf的建立时间发现其建立时间为Jun 22,那个时候俺还没有购买ECS呢!运气!哎,总靠运气学习软件、开发、编程可不是好事啊!学习,需要的是dig,不断dig!

旧方式

安装完毕后,mongod、mongo等命令会出现在/usr/bin中,可以使用whereis命令查看(命令很多,本文仅涉及到其中的mongod、mongo)。

由于安装后/etc/下没有配置文件,于是,自己一直使用命令行方式启动MongoDB服务器。

后来,将MongoDB服务器启动命令加入到了启动脚本——简单粗糙版:

/etc/init.d/中建立MongoDB服务器的启动脚本,并手动在/etc/rc3.d/中建立脚本的软连接(此时根本不知道什么LBS信息,启动脚本的编写规范,直到现在自己也只是知道皮毛)。

下面是旧方式的启动脚本mongo01:

1 #!/bin/sh
2 
3 # START MongoDB
4 # Data Directory: /home/log/ws/mdb/data0725
5 
6 # Only can be accessed from localhost/127.0.0.1
7 # Use the default port 27017
8 mongod --dbpath /home/username/ws/mdb/data0725 --logpath /home/username/ws/mdb/data0725/log --logappend --auth --directoryperdb &

前面看过的一篇博文中讲,要是启动脚本中没有LBS信息的话,可能会导致服务无法启动。还好,在上面的MongoDB服务启动时一直是成功的。

注意,末尾添加 空格、&符号。

在代表运行级别3的/etc/rc3.d/目录中建立启动脚本的软连接。

重启,可以发现MongoDB服务器已经启动了,如下:

sudo netstat -antp | grep mongod

ps -ef | grep mongod

做完上面的操作后,启动MongoDB服务器的脚本已经被添加为Linux服务了。

还可以使用service --status-all查看脚本对应服务的运行状态:

[ + ] mongo01

中括号中是+号,表示服务已启动。

从启动脚本可以看到,数据文件存放于家目录下的,日志文件也是存放于其中。

在MongoDB服务器的启动被添加为Linux服务后,默认是使用root账户启动的——可以看到ps -ef显示进程的用户为root,这样的权限太高,需要限制。

而自己之前使用登录账号启动MongoDB时,MongoDB的进程为登录账号。

Linux账号、进程、进程相关的资源——各种文件(包括文件夹)之间存在什么关系呢?

最佳实践是怎样的?配置文件放哪里、数据文件放哪里、日志文件放哪里、PID文件放哪里、其它文件?

之前使用netstat -ano | grep mongod命令时,还可以看到一个/tmp/mongodb-27017.sock文件,这个文件又是做什么用的呢?

总之,对于旧方式自己还是不太放心的,还需要改进,更专业的改进——把东西放到对的位置、安全的位置

新方式

介绍在阿里云ECS上使用部署。

前面说了,在/etc/目录下发现了一个mongod.conf文件——一个很好的起点,试着用这个文件启动MongoDB服务,是可以的。

不过,看到Nginx等在/etc/中都有自己的目录,于是,新建了mongod目录,并把/etc/中的mongod.conf拷贝了进取,再按照自己的需要改改改。

首先要考虑的是数据库存放位置,孤选择了/home/目录下建立一个mdb目录,再在里面建立各种MongoDB数据库存放文件夹(放在/var/目录下也可以吧?还是推荐方案?默认是放到/data/目录下,可是,没有/data/目录)。

$ ls -l /home/mdb/
total 4
drwxr-xr-x 7 root root 4096 Aug 8 18:04 data0802

/home/mdb/下的data0802就是孤存放数据库的目录了,日志文件存放在/var/log/mongodb/目录下,日志文件名和配置文件名同名——参考了uWSGI服务器的日志文件命名。

还有PID文件,放到了/run/目录下,也应该和配置文件同名(不包括扩展名)(/run/目录下是否也建立一个mongodb目录呢?)。

因此,有下面几个文件是需要关注的:

/home/mdb/data0802

/etc/mongod/data0802.conf

/var/log/mongodb/data0802.log

/run/data0802.pid

配置文件如下:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /home/mdb/data0802
  journal:
    enabled: true
  directoryPerDB: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/data0802.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

# how the process runs
processManagement:
  fork: true
  pidFilePath: /run/data0802.pid
  timeZoneInfo: /usr/share/zoneinfo

# set auth?
setParameter:
  enableLocalhostAuthBypass: false

security:
  authorization: enabled

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

在配置随机启动前,使用mongod测试下上面的配置文件吧!因为是在/etc/目录下,所以,需要添加sudo!

注意,在执行前请确保没有其它MongoDB服务在运行,或者,不会和配置文件中描述的发生冲突。

$sudo mongod -f /etc/mongod/data0802.conf

注意,上面的配置文件用了绝对路径。

不出意外,运行成功!

需要注意上面的配置文件中紫色的部分,那是自己在默认的配置文件上后来添加的,因为启动时遇到了很多警告或错误信息:

directoryPerDB: true

fork: true

security:

  authorization: enabled

可以从参考链接MongoDB Configuration File Options中找到它们代表的意义。

命令行启动的参数 和 配置文件中的配置项 有对应关系,是否一一对应,暂不确定,,而且两者的写法也不太一样。

比如,上面配置文件中的authorization:enabled,在命令行中只要写为--auth即可。

fork: true表示后台启动?其具体意义还需要dig。

不过,仍然坚定支持配置文件方式启动。对于命令行中的选型对应的配置文件选项, 咱可以去参考的官文链接中去 查找——目前来看很easy。

下面,配置随机启动MongoDB服务——和旧方式是不同的。

在/etc/init.d/目录中建立启动脚本mongodb,如下:

 1 #!/bin/bash
 2 ### BEGIN INIT INFO
 3 # Provides:          mongodb
 4 # Required-start:    $local_fs $remote_fs $network $syslog
 5 # Required-Stop:     $local_fs $remote_fs $network $syslog
 6 # Default-Start:     2 3 4 5
 7 # Default-Stop:      0 1 6
 8 # Short-Description: starts the mongodb daemon
 9 # Description:       starts mongodb using start-stop-daemon
10 ### END INIT INFO
11 
12 mongod -f /etc/mongod/data0802.conf &

说明,没有sudo,使用了绝对路径,命令后面跟着 空格、&符号。

注意,启动脚本中的LBS信息尚不确定,请大家谨慎使用。

再使用update-rc.d命令安装此启动脚本即可,安装后,Linux服务就多了一项mongodb了!可以使用命令service --status-all查看其状态。

安装启动脚本:

sudo update-rc.d mongodb defaults 10

好了,重启,重启后可以看到mongodb服务已经启动,使用mongo命令也可以连接到MongoDB服务。

如果服务没有启动,那一定是出现了故障了!那么,检查日志文件。日志文件在哪儿?/var/log/mongodb/data0802.log。

参考链接

MongoDB Configuration File Options

PID文件介绍

附录

1.命令行中使用配置文件启动时的一些输出

$ sudo mongod -f data0802.conf
2018-08-08T17:05:27.171+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
about to fork child process, waiting until server is ready for connections.
forked process: 5858
child process started successfully, parent exiting

2.使用mongo链接MongoDB服务器的一些输出,其中的WARNING信息可以 促进 完善配置文件

$ mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Server has startup warnings:
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten]
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 7856 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]

说明:

孤的配置文件中没有使用默认的WiredTiger存储引擎,而是使用了文件系统存储的方式,会比较低效;

WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

开始没有开启安全认证,后来添加了authorization: enabled选项,警告消失:

WARNING: Access control is not enabled for the database.

其它的WARNING尚未解决。

3.解决一下WARNING后使用mongo访问MongoDB服务器的输出

$ mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
>

后记

其实,新方式中的数据库文件夹早已存在了,并且已经建立了两个账号,在做本文实践时,直接拷贝了文件夹,结果,可以使用。只不过,因为之前没有选择WiredTiger存储引擎,所以,现在也是不可以的了。但是,通过数据导出、导入的方式可以将其中的数据转存到另一个支持WiredTiger存储引擎的数据库中。

fork配置项说明:fork server process

Enable a daemon mode that runs the mongos or mongod process in the background.

使得mongod、mongo在后台运行。

还有一个问题,怎么设置、选择启动MongoDB的用户和用户组呢?需要新建吗?怎么新建?

原文地址:https://www.cnblogs.com/luo630/p/9447795.html