21.MongoDB
一、简介:
MongoDB 由C++编写,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。它有很多优势:
它面向文档存储,支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
允许在服务端执行脚本,可用Javascript编写函数并直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用。
可在 MongoDB 记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
可通过本地或者网络创建数据镜像,扩展性更强。
如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
二、下载安装: https://blog.51cto.com/linuxg/1895805
1、下载服务和工具等:https://www.mongodb.com/download-center/community
(使用apt-get install 资源较老,推荐官网下载安装。若用 apt-get install 安装,则使用 apt-get install mongodb-clients,确保版本一致)
2、安装:
①、dpkg 安装:dpkg -i mongodb.deb
②、源码安装: tar -zxvf mongodb.tgz
③、查看版本:mongod -version
3、启动&服务:
①、命令方式:
mongod --dbpath=/dirxxx -logpath=/data/mongo/mongo.log -logappend -fork -port=27017 (后接参数。不推荐使用)
service mongod start (配置文件在 /etc/mongod.conf 中)
②、配置文件方式:mongod -f mongodb.conf(配置文件如下。若需自启动,最好 find / -name mongod.lock 再 rm /dir/mongod.lock 防止非正常关闭干扰)
port=27017 #mongodb端口。搭建集群时,每个主机端口号要区分开。
bind_ip=192.168.xxx.xxx
dbpath=/mangodir #数据存放目录
logpath=/var/log/mongodb/mongo.log #日志文件目录
logappend=true #追加方式写日志文件
journal=true #启用日志选项
fork=true #后台运行
replSet=<name> #副本集名称,同一个副本集,名称必须一致
maxConns=20000 #最大连接数
oplogSize=2048 #同步操作记录文件大小(MB)
smallfiles=true #使用较小的默认文件
4、关闭服务:
①、Crtl+C
②、命令方式:
mongod --shutdown --dbpath=/dirxxx
service mongod stop
③、查找进程号关闭:ps -ef | grep mongo kill <pid>
-*-*-*-*-*-* 以上为配置服务器。以下通过mongo命令配置数据库:https://docs.mongodb.com/manual/mongo/ -*-*-*-*-*-*
登录客户端:mongo --host=xxx.xxx.xxx.xxx
三、配置集群:
0、集群服务器配置:(priority:优先级,可选参数)
config={_id:"<dbname>",
members:[
{_id:<id1>,host:"<host_ip1>:<port1>",priority:<1>},
{_id:<id2>,host:"<host_ip2>:<port2>",priority:<2>},
{_id:<id3>,host:"<host_ip3>:<port3>",arbiterOnly:true} //仲裁服务器
]};
1、初始化新创建的数据库集群:(config:上述的配置,可选参数。如果缺省,则需要用 rs.add 手动添加)
rs.initiate(config);
2、集群中只能有一个服务器运行此命令。如果其他的某个也运行了,则需清除:
use <local>
db.dropDatabase()
exit
service mongodb restart
3、添加从服务器: https://docs.mongodb.com/manual/reference/method/rs.add/#rs.add
rs.add({ _id:<id>, host:"<host_ip>:<port>"})
四、查看状态等:(具体参照官方文档)
1、检查配置:rs.config();
2、查看集群状态:rs.status();
3、查看用户:show users
4、查看数据库:show dbs
5、查看用户表数据:db.system.users.find()
五、用户操作: 数据库操作: https://docs.mongodb.com/manual/reference/command/
1、选择数据库:use <admin> (或者使用 db = db.getSiblingDB('admin') )
2、添加用户:
db.createUser({
user: "<name>", pwd: "<pwd>",
roles: [ { role: "readWrite", db: "<user1>" }, { role: "read", db: "<user2>" } ] //普通用户权限设置
// roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" } ] //管理员权限设置
})
3、用户操作: https://docs.mongodb.com/manual/reference/command/nav-authentication/
①、use <admin>; (选择数据库)
②、db.auth("<name>", "<pwd>"); (登录用户)
③、db.runCommand({logout:1}); (登出用户)
④、db.changeUserPassword("<UserName>","<pwd>"); (修改密码)
4、修改角色: https://docs.mongodb.com/manual/reference/command/createUser/#dbcmd.createUser
①、添加角色:db.grantRolesToUser( "<userName>", [ { role: "<role>", db: "<database>"} ])
②、取消角色:db.revokeRolesFromUser( "<userName>", [ { role: "<role>", db: "<database>"} ])
③、数据库角色类型: http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
Ⅰ、用户角色:(数据库操作)
read:读权限。非系统集合、系统集合中的system.indexes, system.js, system.namespaces
readWrite: 读写权限。非系统集合、系统集合中的system.js
Ⅱ、数据库管理角色:(数据库管理角色)
dbOwner:数据库所有者。有该数据库的全部权限。
dbAdmin:管理操作数据库对象。没有数据库的读写权限。
userAdmin:创建或修改 当前数据库的 用户或角色。可以将该数据库的任意权限赋予任意的用户。
Ⅲ、集群管理权限:( admin 数据库特有,管理整个系统而非单个数据库。这些权限包含了复制集和共享集群的管理函数)
clusterAdmin:最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:集群和复制集的管理和监控操作。可以操作config和local数据库(即分片、复制)。
clusterMonitor:仅监控集群和复制集。
hostManager:监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
backup/restore:备份恢复权限。
Ⅳ、数据库权限:( admin 数据库特有,管理其余数据库。不包括应用到集群中的数据库)
readAnyDatabase:读权限。
readWriteAnyDatabase:读写权限。
userAdminAnyDatabase:具有userAdmin每一个数据库权限。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限。
Ⅴ、超级管理员权限:
root:dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。不具有备份恢复、直接操作system.*集合的权限,但可以自己给自己赋予这些权限。
5、其他操作: https://jingyan.baidu.com/article/dca1fa6f0428a4f1a440522e.html
查询数据库列表:http://blog.csdn.net/huxu981598436/article/details/47216493
表的操作:https://www.cnblogs.com/linu/articles/10164821.html
获得数据库所有用户权限:db.getUsers()
获得某个用户权限:db.getUser()
修改密码:db.changeUserPassword("name","pwd");
:db.updateUser("name", {pwd:"pwd"} );
删除用户:db.dropUser("name")
删除所有用户:db.dropAllUsers()
创建角色:db.createRole()
更新角色:db.updateRole()
删除角色:db.dropRole("name")
获得某个角色信息:db.getRole()
删除数据库:db.dropDatabase()
六、数据备份与恢复:
1、数据备份:mongodump -h <dbHostIP>:<portNum> -u<user> -p<password> -d <dbName> -o <dbPath>
-h:MongDB所在服务器地址。端口号可缺省。
-d:需要备份的数据库实例。
-u/-p:数据库实例中的用户名和密码,不加空格。可缺省。
-o:备份的数据存放位置。备份完后系统自动在dump目录下建立<dbName>目录,用于存放该数据库实例的备份数据。
2、数据恢复:mongorestore -h <hostName>:<port> -u<user> -p<password> -d dbname <path>
--host/ -h <:port>:服务器地址。
--db/-d:需要恢复的数据库实例。
-u/-p:数据库实例中的用户名和密码,不加空格。可缺省。
--drop:恢复时先删除当前数据,后恢复备份的数据。恢复后,备份后添加修改的数据都会被删除。
--dir/<path>:最后的一个参数,指定备份的目录。