单实例版MongoDB安装 CentOS 7的版本:CentOS 7.9 2009 MongoDB的版本:MongoDB 5.0.1 备注:MongoDB的版本,需要关注第二位数字是基数还是偶数,基数是发行版本,偶数是稳定版本。在生产环境中,必须使用偶数版本。

rpm包安装

MongoDB官方文档推荐你使用rpm包安装而不是使用tar包,rpm简化了未来的升级任务和维护任务。 在正常联网的情况下,可以直接执行wget命令去官网下载rpm包;在无法联网的情况下,通过网址直接下载rpm包,然后上传至服务器安装MongoDB。 网址:https://repo.mongodb.org/yum/redhat/

1、配置存储库

[root@localhost ~]# cd /etc/yum.repos.d # 进入到此目录中
[root@localhost yum.repos.d]# vim mongodb-org-5.0.repo # 编辑一个新的mongo.repo文件

  1. [mongodb-org-5.0]
  2. name=MongoDB Repository
  3. baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/5.0/x86_64/
  4. gpgcheck=1
  5. enabled=1
  6. gpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc

:wq保存并退出。

2、开始安装

如果需要安装特定版本的话,需要配置相应版本号的存储库,然后指定版本号。

[root@localhost yum.repos.d]# yum install -y mongodb-org # 安装mongodb-org
image.png
备注:
使用yum或rpm包安装的MongoDB默认情况下,数据目录和日志目录,分别在

  • /var/lib/mongo 数据目录
  • /var/log/mongodb 日志目录

在操作系统中的用户和用户组都是mongod,配置文件的位置是/etc/mongod.conf,如果需要修改数据目录和日志目录,则改变这个文件。

3、创建并授权新的目录

这里是创建数据目录和日志目录,生产环境中会选择一个空间比较大的来创建这些目录。

[root@localhost yum.repos.d]# mkdir -p /usr/local/mongo/db # 创建数据目录
[root@localhost yum.repos.d]# mkdir -p /usr/local/mongo/logs # 创建日志目录
[root@localhost yum.repos.d]# chown mongod:mongod -R /usr/local/mongo # 将/usr/local/mongo及其子目录授权给mongod用户和mongod组中

4、配置文件调整

MongoDB在启动时会去读取这个文件的信息,所以我们这里要新增数据目录和日志目录,否则MongoDB还是会以默认目录去存储。

[root@localhost yum.repos.d]# vim /etc/mongod.conf

# mongod.conf

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

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /usr/local/mongo/logs/mongod.log

# Where and how to store data.
storage:
  dbPath: /usr/local/mongo/db
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

:wq保存并退出。
备注:

  • systemLog
    • path 系统运行日志存储目录
  • storage
    • dbPath 数据文件存储目录
  • net
    • port 端口号
    • bindIp 默认127.0.0.1,只有改成0.0.0.0,才能所有IP访问,否则只有本地客户端能访问到数据库。

5、配置SELinux

这里需要根据环境来选择配置:

  • SELinux运行在enforcing模式
  • SELinux运行在非enforcing模式

如果在生产环境中强制需要运行在enforcing模式下,执行enforcing模式下的步骤即可,非强制的话,可以直接关闭selinux。

enforcing模式

在enforcing模式下,主要是需要配置两个选项

  • 允许访问cgroup
  • 允许访问FTDC的netstat

检查checkpolicy包是否存在

[root@localhost yum.repos.d]# rpm -qa|grep checkpolicy
执行空白表示不存在,需要yum安装或rpm安装,如果有包显示,继续下面执行

新增cgroup策略文件

[root@localhost yum.repos.d]# vim mongodb_cgroup_memory.te

module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };

:wq保存并退出

编译并加载自定义策略

[root@localhost yum.repos.d]# checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
[root@localhost yum.repos.d]# semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
[root@localhost yum.repos.d]# sudo semodule -i mongodb_cgroup_memory.pp
到这里,允许访问cgroup配置完毕,继续配置允许访问FTDC的netstat

创建proc策略文件

[root@localhost yum.repos.d]# vim mongodb_proc_net.te

module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}
#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };

:wq保存并退出。

编辑并加载自定义策略

[root@localhost yum.repos.d]# checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
[root@localhost yum.repos.d]# semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
[root@localhost yum.repos.d]# semodule -i mongodb_proc_net.pp

使用非默认的数据目录

这里需要注意,如果你使用的是系统默认的数据存放目录,不需要执行,如果使用的是非系统默认的数据存放目录,则需要继续执行。 我这里使用的是非默认的数据目录,就需要继续设置 注意:semanage fcontext设置的必须包含后缀.*

[root@localhost yum.repos.d]# sudo semanage fcontext -a -t mongod_var_lib_t '/usr/local/mongo/db.*'
[root@localhost yum.repos.d]# sudo chcon -Rv -u system_u -t mongod_var_lib_t '/usr/local/mongo/db'
[root@localhost yum.repos.d]# restorecon -R -v '/usr/local/mongo/db'

使用非默认的日志目录

我这里使用的是非默认的日志目录,需要继续设置 注意:semanage fcontext设置的必须包含后缀.*

[root@localhost yum.repos.d]# sudo semanage fcontext -a -t mongod_log_t '/usr/local/mongo/logs.*'
[root@localhost yum.repos.d]# sudo chcon -Rv -u system_u -t mongod_log_t '/usr/local/mongo/logs'
[root@localhost yum.repos.d]# restorecon -R -v '/usr/local/mongo/logs’

使用自定义的端口号

如果设置的端口号不是27017,则需要执行此步骤。

[root@localhost yum.repos.d]# sudo semanage port -a -t mongod_port_t -p tcp <portnumber>

非enforcing模式

从官方文档中可以看出,如果允许的是非enforcing模式的话,不需要执行任何操作,直接启动MongoDB即可。

6、启动MongoDB

[root@localhost yum.repos.d]# sudo systemctl start mongod

7、验证MongoDB是否启动成功

[root@localhost yum.repos.d]# systemctl status mongod
image.png

8、配置服务自启动

[root@localhost yum.repos.d]# systemctl enable mongod

Tar包安装

在正常联网的情况下,可以直接执行wget命令去下载tar包;在无法联网的情况下,通过网址直接下载tar包,然后上传至服务器安装MongoDB。

1、下载MongoDB压缩包

我们可以在有网络的服务器中使用wget下载,然后再上传至linux服务器中,我这里使用wget下载,版本为社区版4.4.5(最新版本)

[root@localhost ~]# cd /usr/local
[root@localhost local]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.1.tgz

2、检查依赖包

tar包需要libcurl openssl xz-libs这三个依赖包,如果没有需要yum或者手动下载后上传到服务器中

[root@localhost local]# rpm -qa|grep libcurl
[root@localhost local]# rpm -qa|grep openssl
[root@localhost local]# rpm -qa|grep xz-libs

3、上传、解压并重命名压缩包

[root@localhost local]# tar -xzvf mongodb-linux-x86_64-rhel70-5.0.1.tgz
[root@localhost local]# mv mongodb-linux-x86_64-rhel70-5.0.1 mongo

4、配置环境变量

配置软连接,这样我们以后就不需要再绝对路径去运行命令了,这里提供两种方法:

  • 拷贝二进制文件
  • 软连接

我这里使用拷贝二进制文件到变量目录中。 软链接:ln -s /usr/local/mongodb/bin/* /usr/local/bin

[root@localhost local]# cp /usr/local/mongo/bin/* /usr/local/bin

5、安装mongosh

这个工具就类似于之前的mongo客户端,官网建议使用这个来替代之前一直使用的mongo,并声明会在未来的版本中删除旧的mongo客户端。 能访问外网直接配置存储库直接下载,无法访问外网直接去官网存储库中下载rpm包。 存储裤地址:https://repo.mongodb.org/yum/redhat/

[root@localhost ~]# rpm -ivh mongodb-mongosh-1.0.3.el7.x86_64.rpm
image.png
至此,mongosh安装完毕。

6、创建用户及组

[root@localhost local]# groupadd mongod
[root@localhost local]# useradd -g mongod -m mongod

7、进入到mongodb目录中,并新建logs和db目录。

这里新增logs和db目录,主要是用来存储mongodb在运行过程中的日志以及持久化的数据。目录可以放在任何位置,不必局限在mongodb目录中。

[root@localhost local]# cd mongo
[root@localhost mongo]# mkdir logs db
[root@localhost mongo]# chown mongod:mongod -R /usr/local/mongo

8、新增配置文件

3.6版本以上不用再增加nohttpinterface参数。

[root@localhost mongo]# vim mongodb.conf

dbpath = /usr/local/mongo/db
logpath = /usr/local/mongo/logs/mongodb.log
port = 27017
fork = true
nohttpinterface = true
bind_ip = 0.0.0.0

:wq保存并退出。
[root@localhost mongo]# chown mongod:mongod -R /usr/local/mongo
备注:

  • dbpath MongoDB持久化数据存储目录
  • logpath MongoDB运行时存储日志的目录
  • port MongoDB端口
  • fork MongoDB是否以守护进程运行
  • nohttpinterface MongoDB是否禁止http接口,默认值是false
  • bind_ip 默认为127.0.0.1,只有本地服务器的客户端能够访问数据库,这里我们改为0.0.0.0后就能通过正常ip访问

    9、配置SELinux

    这里需要根据环境来选择配置:

    • SELinux运行在enforcing模式
    • SELinux运行在非enforcing模式

    如果在生产环境中强制需要运行在enforcing模式下,执行enforcing模式下的步骤即可,非强制的话,可以直接关闭selinux。

enforcing模式

在enforcing模式下,主要是需要配置两个选项

  • 允许访问cgroup
  • 允许访问FTDC的netstat

检查checkpolicy包是否存在

[root@localhost mongodb]# rpm -qa|grep checkpolicy
执行空白表示不存在,需要yum安装或rpm安装,如果有包显示,继续下面执行

新增cgroup策略文件

[root@localhost mongo]# vim mongodb_cgroup_memory.te

module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };

:wq保存并退出

编译并加载自定义策略

[root@localhost mongo]# checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
[root@localhost mongo]# semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
[root@localhost mongo]# sudo semodule -i mongodb_cgroup_memory.pp
到这里,允许访问cgroup配置完毕,继续配置允许访问FTDC的netstat

创建proc策略文件

[root@localhost mongo]# vim mongodb_proc_net.te

module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}
#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };

:wq保存并退出。

编辑并加载自定义策略

[root@localhost mongo]# checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
[root@localhost mongo]# semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
[root@localhost mongo]# semodule -i mongodb_proc_net.pp

使用非默认的数据目录

这里需要注意,如果你使用的是系统默认的数据存放目录,不需要执行,如果使用的是非系统默认的数据存放目录,则需要继续执行。 我这里使用的是非默认的数据目录,就需要继续设置 注意:semanage fcontext设置的必须包含后缀.*

[root@localhost mongo]# sudo semanage fcontext -a -t mongod_var_lib_t '/usr/local/mongo/db.*'
[root@localhost mongo]# sudo chcon -Rv -u system_u -t mongod_var_lib_t '/usr/local/mongo/db'
[root@localhost mongo]# restorecon -R -v '/usr/local/mongo/db'

使用非默认的日志目录

我这里使用的是非默认的日志目录,需要继续设置 注意:semanage fcontext设置的必须包含后缀.*

[root@localhost mongo]# sudo semanage fcontext -a -t mongod_log_t '/usr/local/mongo/logs.*'
[root@localhost mongo]# sudo chcon -Rv -u system_u -t mongod_log_t '/usr/local/mongo/logs'
[root@localhost mongo]# restorecon -R -v '/usr/local/mongo/logs'

使用自定义的端口号

如果设置的端口号不是27017,则需要执行此步骤。

[root@localhost mongo]# sudo semanage port -a -t mongod_port_t -p tcp <portnumber>

非enforcing模式

从官方文档中可以看出,如果允许的是非enforcing模式的话,不需要执行任何操作,直接启动MongoDB即可。

10、开放端口

如果使用的是其他端口,相对应将27017变为你允许mongodb的端口即可

[root@localhost mongodb]# firewall-cmd --permanent --zone=public --add-port=27017/tcp
[root@localhost mongodb]# systemctl restart firewalld

11、配置用户资源限制

在类unix的操作系统中,默认都会限制资源使用,MongoDB建议我们按指定的参数允许,所以这里配置mongod用户的资源限制 官方建议值:

  • -f (file size): unlimited
  • -t (cpu time): unlimited
  • -v (virtual memory): unlimited
  • -l (locked-in-memory size): unlimited
  • -n (open files): 64000
  • -m (memory size): unlimited
  • -u (processes/threads): 64000

[root@localhost ~]# vim /etc/security/limits.conf

mongod soft fsize unlimited
mongod hard fsize unlimited
mongod soft cpu unlimited
mongod hard cpu unlimited
mongod soft memlock unlimited
mongod hard memlock unlimited
mongod soft as unlimited
mongod hard as unlimited
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 64000
mongod hard nproc 64000

:wq保存并退出。

12、启动MongoDB数据库

这里需要注意,我们要带配置文件启动,不然配置文件中的值不生效。 用户的话,我们使用mongod启动,而不是直接使用root去启动数据库。

[root@localhost mongodb]# su - mongod
[mongod@localhost ~]# mongod --config /usr/local/mongo/mongodb.conf
image.png

13、查看MongoDB进程

[root@localhost ~]# ps -ef|grep mongodb
image.png

14、设置MongoDB的自启动

这里的自启动,指的是MongoDB随CentOS开机启动。

[root@localhost ~]# echo 'su - mongod -c "/usr/local/mongo/bin/mongod --config /usr/local/mongo/mongodb.conf"' >>/etc/rc.d/rc.local
[root@localhost mongodb]# chmod +x /etc/rc.d/rc.local

错误

1、Error parsing INI config file: unrecognised option ‘nohttpinterface’

原因:3.6版本之后以及删除nohttpinterface这个参数
解决办法:直接删除mongodb.conf配置文件中的nohttpinterface参数即可。

2、Access control is not enabled for the database. Read and write access to data and configuration is unrestricted

原因:MongoDB建议我们使用安全的身份验证
解决办法:新增管理用户并重启服务
[mongod@localhost ~]$ mongosh
test> use admin

db.createUser(
  {
    user: "myUserAdmin",
    pwd: "33333",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

admin> db.shutdownServer() # 关闭MongoDB
admin> exit # 退出mongosh
[mongod@localhost ~]$ mongod --auth --config /usr/local/mongo/mongodb.conf

3、/sys/kernel/mm/transparent_hugepage/enabled is ‘always’. We suggest setting it to ‘never’

原因:MongoDB建议你关闭THP(透明大页)
解决办法:关闭THP
新增配置文件
[root@localhost ~]# vim /etc/systemd/system/disable-transparent-huge-pages.service

[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target

:wq保存并退出。
重新加载systemd文件
[root@localhost ~]# sudo systemctl daemon-reload
启动服务
[root@localhost ~]# sudo systemctl start disable-transparent-huge-pages
验证
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
image.png
配置随开启启动
[root@localhost ~]# sudo systemctl enable disable-transparent-huge-pages

4、/sys/kernel/mm/transparent_hugepage/defrag is ‘always’. We suggest setting it to ‘never’

原因:4.2版本之前,MongoDB除检查透明大页外,还会检查THP碎片整理,4.2版本之后只需要关闭透明大页即可,在版本之前需要忽略警告。
解决方法:
在/etc/systemd/system/disable-transparent-huge-pages.service文件中,增加一行记录,避免此警告
[root@localhost ~]# vim /etc/systemd/system/disable-transparent-huge-pages.service

[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=basic.target

:wq保存并退出。
重新加载systemd文件
[root@localhost ~]# sudo systemctl daemon-reload
启动服务
[root@localhost ~]# sudo systemctl start disable-transparent-huge-pages

5、Warning: Found ~/.mongorc.js, but not ~/.mongoshrc.js. ~/.mongorc.js will not be loaded.

原因:mongosh连接后会在~目录下查找.mongoshrc.js文件,但是没找到
解决方法:我们直接拷贝mongorc.js并重命名一下就可以解决问题
[mongod@localhost ~]$ cp .mongorc.js .mongoshrc.js