mongodb的安装方式比较简单,下面演示在CentOS7上用yum方式安装。
参考文献
- 下载地址 https://www.mongodb.com/download-center#community
- 在线文档 https://docs.mongodb.com/manual/introduction/
使用yum方式安装
仅供学习参考,若在生产环境中部署请注意修改安全配置。
- 整个mongodb(社区版)包含如下软件
| 软件名称 | 描述 |
|---|---|
| mongodb-org-server | 包含mongod守护程序和关联的配置和init脚本 |
| mongodb-org-mongos | 包含mongos守护程序 |
| mongodb-org-shell | 包含mongo shell,它是一个连接mongodb的命令行客户端,允许用户直接输入nosql语法管理数据库。 |
| mongodb-org-tools | 包含以下工具的MongoDB:数据导入、导出、备份、恢复等等 |
- 创建yum源文件
vim /etc/yum.repos.d/mongodb-org-3.4.repo1
- 把下面的内容复制到上面的文件中
[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命令开始安装
yum install -y mongodb-org1
- 如果使用SELinux,则必须配置SELinux,以允许在基于Red Hat Linux的系统(Red Hat Enterprise Linux或CentOS Linux)上启动MongoDB。
vim /etc/selinux/config
#在打开的文件中将值设置为disabled
SELINUX=disabled
关闭THP
自CentOS6版本开始引入了Transparent Huge Pages(THP),从CentOS7版本开始,该特性默认就会启用。尽管THP的本意是为提升内存的性能,不过某些数据库厂商还是建议直接关闭THP(比如说Oracle、MariaDB、MongoDB等),否则可能会导致性能出现下降。
首先检查THP的启用状态:不关闭mongo启动的时候会警告。
// 检查THP状态
cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
这个状态就说明都是启用的。
//禁用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
mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1mongd.conf 就是配置文件。
打开就可以看到相关配置信息。
mongdb权限操作配置信息
Built-In Roles(内置角色):
- 数据库用户角色:
- read、readWrite;
- 数据库管理角色:
- dbAdmin、dbOwner、userAdmin;
- 集群管理角色:
- clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:
- backup、restore;
- 所有数据库角色:
- readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:
- root
- 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
- root
- 内部角色:
- __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。
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表示匹配成功
- 修改密码
db.changeUserPassword('root','z201.com');
- 数据库开启认证,注意请进入数据库中在执行。
security:
authorization:true
基础操作
启动
systemctl start mongod
重启
systemctl restart mongod
如果无效
- use admin
- db.shutdownServer();
停止
systemctl stop mongod
认证模式启动
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
- 插入
db.ops_dev.insert({title: 'MongoDB ',
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL']
})
其他注意事项
mongodb进程莫名退出
每天早上到公司发现Mongo都会自己关闭掉。
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
mongod --fork --auth --port 27017 --dbpath /var/lib/mongo/ --logpath /opt/mongod/mongod.log
安全的推出方式
一定要以命令方式关闭
关闭服务时,一定要注意,用--shutdown命令关闭,既方便又安全。