MongoDB是一个基于分布式文件存储的数据库,非关系型数据库(NOSQL);它具有快速、高拓展性、FailOver机制、Json格式存储等优势;
1、文档
文档是MongoDB中数据的基本单位,类似关系型数据库中的行(但是比行复杂),多个键及其关联的值有序的放在一起就构成了文档;
2、集合(Collections)
结合就是一组文档,类似于关系型数据库中的表;集合是无模式的,集合中的文档可以是各种格式结构的,非常灵活;从开发者的角度可以把集合划分为子集合;
3、数据库(database)
MongoDB中多个文档组成集合,多个集合组成数据库;一个MongoDB实例可以承载多个数据库,他们之间可相互独立,每个数据库都有独立的权限控制;MongoDB默认存在一下数据库:
Admin数据库:权限数据库,在创建用户的时候如果将用户添加到admin数据库中,那么该用户就自动继承了所有数据库的权限;建议不要使用admin数据库存储业务数据,最好创建新的数据库;
Local数据库:该数据库不会被负责,只会在本地存储数据,即local数据库里的内容不会同步到副本集里的其他节点上去;重要数据切勿存储再local数据中,否则当一个节点故障时,存储在local里的数据就会丢失;
Config数据库:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片的信息;
官网:http://www.mongodb.org/
学习网站:http://www.runoob.com/mongodb
一个MongoDB实例可以包含一组数据库,一个Database可以包含一组Collection(集合),一个集合可以包含一组Document,一个Document包含一组field(字段),每一个字段都是一个key/value pair;
准备工作:一台安装了CentOS系统的虚拟机、SecureCRT(要求系统先安装lrzsz用于文件上传下载)或xshell&xftp;
MongoDB下载地址:https://www.mongodb.com/downloads
运行rz上传安装包文件到/home/nguser/mongodb/目录并解压 tar -zxvf mongodb-linux-x86_64-amazon-3.4.1.tgz;
新建两个文件夹分别用于存放数据库文件和日志文件,logs和db;
赋予文件夹读取、写入、执行权限;
指定数据库目录和日志文件目录,启动mongodb,验证服务是否安装成功;
输入命令lsof -i :27017 ,监听端口已经在使用中,说明启动已经完成
上面已经能够将mongodb成功安装、部署、启动,但是不难发现mongodb服务启动相对还是比较麻烦的,是否可以将数据文件目录、日志目录、服务端口、是否开启认证等配置统一放到一个配置文件里进行配置,并能够通过输入简单的service mongo start/stop来实现服务的启动与停止,答案是肯定的。
进入目录 cd /home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/,执行命令:
vim mongodb.conf
mongodb命令参数请参考博客:http://blog.csdn.net/fdipzone/article/details/7442162
使用如下命令重新启动mongodb服务,使配置生效;
./mongod –config /home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/mongodb.conf
验证服务是否启动成功;
ulimit -SHn 655350
#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/mongod --maxConns 20000 --config /home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/mongodb.conf
;;
stop)
/home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/mongo 127.0.0.1:27017/admin --eval "db.shutdownServer()"
;;
status)
/home/nguser/mongodb/mongodb-linux-x86_64-amazon-3.4.1/bin/mongo 127.0.0.1:27017/admin --eval "db.stats()"
;;
esac
chmod +x /etc/rc.d/init.d/mongod
chkconfig mongod on
mongodb的权限是通过角色来定义的,系统内置了几类角色,同时用户也可以自己定义角色,一般情况下系统默认的角色已能够U满足我们的需求了;
Database User Roles:针对非系统数据库和部分系统表的用户角色组
每个数据都包含以下客户角色:read、readWrite;Database Administration Roles:数据库管理角色,可以操作所有数据库;
每个数据库都包含以下管理角色:dbAdmin(数据库管理员)、dbOwner(数据库所有者可以执行数据库所有管理的操作,该角色合并了readWrite\dbAdmin\userAdmin角色的权限)、userAdmin(用户管理员,具有创建和修改角色和用户的权限);Cluster Administration Roles:管理员簇针对整个系统进行管理,包含角色:clusterAdmin(集群管理员)、clusterManager(集群管理者)、clusterMonitor(集群监视者)、hostManager(主机管理者)
Backup and Restoration Roles:备份还原角色组,包含角色:backup(备份)、restore(还原)
All-Database Roles:所有数据库角色,跟超管差不多,包含角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
Superuser Roles:超级管理员
Internal Role:内部角色,包含角色:__system(系统角色)
角色相关的命令参考:[https://docs.mongodb.com/manual/reference/method/js-role-management/](https://docs.mongodb.com/manual/reference/method/js-role-management/)
在了解完角色以后,我们就可以结合不同的应用场景创建具有相关权限的用户了,参考如下:
use admin//系统管理员
db.createUser({user:"admin",pwd:"admin",roles:["readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin"]})//数据库管理员
db.createUser({user:"user",pwd:"user",roles:["userAdminAnyDatabase"]})//用户管理员,用来增加和删除用户
db.createUser({user:"etl",pwd:"etl",roles:[{role:"readWrite",db:"etl"}]})//普通用户
用户相关的命令参考:https://docs.mongodb.com/manual/reference/method/js-user-management/
2. 新建用户etl,赋予etl用户操作ETL数据库的读写权限;
3. 修改mongodb配置文件,开启认证;
4. 重启服务,使用etl用户测试连接成功与否;
PS:注意防火墙设置
firewall-cmd --zone=public --add-port=27017/tcp --permanent
systemctl restart firewalld.service
解决方案:
db.grantRolesToUser("admin", [{role: "hostManager", db: "admin"}])
后续章节我们将一起探讨mongodb备份与还原,集群部署等,敬请期待…
author:杨大山 qq技术交流群:242573682