• 使用配置文件启动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的用户和用户组呢?需要新建吗?怎么新建?

  • 相关阅读:
    django虚拟环境中报E: 无法定位软件包 sqliteman
    创建django项目
    Django虚拟环境安装
    python学习笔记(三)
    python学习笔记(二)
    python学习笔记(一)
    python 类属性和实例属性
    决策树的基本ID3算法
    KNN算法的简单实现
    webClient
  • 原文地址:https://www.cnblogs.com/luo630/p/9447795.html
Copyright © 2020-2023  润新知