Centos7.*-Mongodb3.4单实例部署

mongodb的安装方式比较简单,下面演示在CentOS7上用yum方式安装。

参考文献

使用yum方式安装

仅供学习参考,若在生产环境中部署请注意修改安全配置。

  • 整个mongodb(社区版)包含如下软件
软件名称 描述
mongodb-org-server 包含mongod守护程序和关联的配置和init脚本
mongodb-org-mongos 包含mongos守护程序
mongodb-org-shell 包含mongo shell,它是一个连接mongodb的命令行客户端,允许用户直接输入nosql语法管理数据库。
mongodb-org-tools 包含以下工具的MongoDB:数据导入、导出、备份、恢复等等
  • 创建yum源文件
1
vim /etc/yum.repos.d/mongodb-org-3.4.repo1
  • 把下面的内容复制到上面的文件中
1
2
3
4
5
6
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc123456
  • 启动yum命令开始安装
1
yum install -y mongodb-org1
  • 如果使用SELinux,则必须配置SELinux,以允许在基于Red Hat Linux的系统(Red Hat Enterprise Linux或CentOS Linux)上启动MongoDB。
1
2
3
vim /etc/selinux/config
#在打开的文件中将值设置为disabled
SELINUX=disabled

关闭THP

自CentOS6版本开始引入了Transparent Huge Pages(THP),从CentOS7版本开始,该特性默认就会启用。尽管THP的本意是为提升内存的性能,不过某些数据库厂商还是建议直接关闭THP(比如说Oracle、MariaDB、MongoDB等),否则可能会导致性能出现下降。

首先检查THP的启用状态:不关闭mongo启动的时候会警告。

1
2
3
4
5
6
// 检查THP状态
cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
这个状态就说明都是启用的。
1
2
3
4
5
6
7
8
9
//禁用THP,编辑rc.local文件
vim /etc/rc.d/rc.local
增加下列内容:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

编辑完了需要重启服务器才能生效。

配置信息

mongo配置文件操作

  • 安装完后寻找相关配置信息

  • whereis mongd

  • 1
    mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
  • mongd.conf 就是配置文件。

  • 打开就可以看到相关配置信息。

mongdb权限操作配置信息

Built-In Roles(内置角色):

  • 数据库用户角色:
    • read、readWrite;
  • 数据库管理角色:
    • dbAdmin、dbOwner、userAdmin;
  • 集群管理角色:
    • clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 备份恢复角色:
    • backup、restore;
  • 所有数据库角色:
    • readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 超级用户角色:
    • root
      • 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  • 内部角色:
    • __system

具体角色:

  • Read:
    • 允许用户读取指定数据库。
  • readWrite:
    • 允许用户读写指定数据库。
  • dbAdmin:
    • 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。
  • userAdmin:
    • 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户。
  • clusterAdmin:
    • 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  • readAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的读权限。
  • readWriteAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的读写权限。
  • userAdminAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
  • dbAdminAnyDatabase:
    • 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  • root:
    • 只在admin数据库中可用。超级账号,超级权限。

开启用户权限

提示:即便设置了账号密码依然可以不通过密码链接,需要在mongo 启动的时候开启认证。

  • 创建用户
    • 注意读写用户的权限请使用readWrite。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
show dbs; 
//显示数据库列表

use admin;
//进入admin collections

db.createUser({"user":"root","pwd":"z201.com","roles":[{"role":"root","db":"admin"}]})
//创建超级管理员root库管理账号

db.auth("root","eoner.com")
//校验账号是否匹配
1
//显示1表示匹配成功

user yisheng;
//进入yisheng collections,如果没有该数据库会自己创建一个;但是如果不在里面插入数据是不显示出来的。

db.createUser({"user":"yisheng","pwd":"z201.com","roles":[{"role":"readWrite","db":"yisheng"}]})
//创建数据库管理员

db.auth("yisheng","z201.com")
1
//显示1表示匹配成功
  • 修改密码
1
db.changeUserPassword('root','z201.com');
  • 数据库开启认证,注意请进入数据库中在执行。
1
2
security:
authorization:true

基础操作

启动

1
systemctl start mongod

重启

1
systemctl restart mongod
  • 如果无效

    • use admin
    • db.shutdownServer();

停止

1
systemctl stop mongod

认证模式启动

1
nohup mongod --auth --port 27017 --dbpath /var/lib/mongo/ &
  • /var/bin/mongd 可以在mongod.conf中查看。

客户端连接失败问题:

SCRAM-SHA-1 authentication failed `forroot`

  • mongodb加入了SCRAM-SHA-1校验方式,需要第三方工具配合进行验证。如果直接用代码连接会出问题。
  • 如果客户端没有SCRAM-SHA-1的校验方式,可以选择将authverison 版本降低;不使用该认证方式,同时工具连接的时候需要手动修改默认的认证方式。
  • 参考文献

CURD

  • 插入
1
2
3
4
db.ops_dev.insert({title: 'MongoDB ', 
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL']
})

其他注意事项

mongodb进程莫名退出

每天早上到公司发现Mongo都会自己关闭掉。

1
2
3
4
5
6
7
8
9
10
11
2018-01-03T18:21:03.135+0800 I CONTROL  [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends
2018-01-03T18:21:03.136+0800 I NETWORK [signalProcessingThread] shutdown: going to close listening sockets...
2018-01-03T18:21:03.136+0800 I NETWORK [signalProcessingThread] closing listening socket: 6
2018-01-03T18:21:03.136+0800 I NETWORK [signalProcessingThread] closing listening socket: 7
2018-01-03T18:21:03.136+0800 I NETWORK [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2018-01-03T18:21:03.136+0800 I NETWORK [signalProcessingThread] shutdown: going to flush diaglog...
2018-01-03T18:21:03.136+0800 I FTDC [signalProcessingThread] Shutting down full-time diagnostic data capture
2018-01-03T18:21:03.138+0800 I STORAGE [signalProcessingThread] WiredTigerKVEngine shutting down
2018-01-03T18:21:03.366+0800 I STORAGE [signalProcessingThread] shutdown: removing fs lock...
2018-01-03T18:21:03.366+0800 I CONTROL [signalProcessingThread] now exiting
2018-01-03T18:21:03.366+0800 I CONTROL [signalProcessingThread] shutting down with code:0
  • 天啦噜有人发送了Hangup。。。好比kill -1 pid,但可以确认的是没有人手动信号给mongodb进程。
  • 然后网上找了很久发现了这篇文档 Signals

Bash resends a SIGHUP to all jobs if it receives a SIGHUP itself; this would include mongod.
Also, if you happen to have huponexit turned on, every job will receive a SIGHUP when bash exits.

​ shell登进之后启动了mongo,然后退出shell使用的方式是直接关掉窗口,linux认为这是一起异常退出,这样一来这个shell进程就会收到SIGHUP信号,为了保证状态一致性,从而给它的所有子进程发送SIGHUP信号.而使用命令exit退出就不会有这种问题,因为linux会认为这是一种正常的退出。
​ mongodb官方文档会发现mongo有–-fork这样的一个参数,使用该参数启动mongo时,会自动将其挂到init进程(pid为1)下启动,而不加的话ppid(父进程id)就是当前的shell进程。

  • 如果使用了 fork 参数就必须添加 logpath
1
mongod --fork --auth --port 27017 --dbpath /var/lib/mongo/ --logpath /opt/mongod/mongod.log

安全的推出方式

一定要以命令方式关闭

关闭服务时,一定要注意,用–shutdown命令关闭,既方便又安全。