MongoDB基础
一、MongoDB概述
1、非关系型数据库
(1)存储数据不以关系型模型为依据,不需要固定的格式表。非关系型数据库作为关系型数据库的一个补充,在日益发展的网站时代,发挥着高效与高性能。
(2)优点
①数据库高并发读写
②对海量数据高效率存储与访问
③数据库高扩展性与高可用性
(3)常用非关系型数据库
①MongoDB
②Memcache
③Redis
④HBase
2、MongoDB简介
(1)一款跨平台、面向文档的数据库。可实现高性能、高可用性,并且能够轻松扩展
(2)是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的
(3)不采用关系模型,主要是为了获得更好的扩展性,它不再有行的概念,运行方式主要基于两个概念:集合(colletion)和文档(document)
3、MongoDB的特点
(1)面向集合存储、模式自由、丰富的查询语句和多索引、复制集机制、易于水平扩展、可插入存储引擎、跨平台多语言支持
(2)安装简单,提供了面向文档存储功能,操作起来比较容易
(3)提供了复制、高可用性和自动分片功能。分片:如果负载增加,可以吗分布在计算机网络中的其他节点上
(4)支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
(5)支持各种语言:Ruby、Python、Java、C++、PHP、C#等多种语言
4、适用领域
(1)可以为web应用提供可扩展的高性能数据存储解决方案。主要适用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储。
(2)适合大数据量、高并发、弱事务的互联网应用,内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好满足web2.0和异动互联网应用数据存储的要求
二、MongoDB的安装
1、安装及运行控制
(1)安装
①安装支持软件:yum install -y openssl-devel
②安装MongoDB
③创建相关目录
1)存储目录
a.mkdir -p /data/mongodb1
2)日志目录
a.mkdir -p /data/logs/mongodb
b.touch /data/logs/mongodb/mongodb1.log
c.chmod -R 777 /data/logs/mongodb/mongodb1.log
3)进程占用资源设置
a.ulimit -n 25000
(2)运行控制
①创建配置文件和启动参数
1)vim /usr/local/mongodb/mongodb1.conf
port = 27017
dbpath = /data/mongodb1
logpath = /data/logs/mongodb/mongodb1.log
fork = true
maxConns = 5000
storageEngine = mmapv1
2)
②设置内核参数
echo 0 > /proc/sys/vm/zone_reclaim_mode
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2、启动和停止MongoDB
(1)启动
①usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb1.conf
②usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf
(2)停止
①usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
②非正常关闭需手动删除mongod.lock文件:rm -rf /data/mongodb1/mongodb1.lock
(3)设置开机启动
(4)连接并访问MongoDB
①/usr/local/mongodb/bin/mongo
三、MongoDB的存储结构
1、逻辑存储结构
(1)常用术语及说明
(2)数据库
①默认数据库:text
②保留数据库
1)admin:root数据库。如果将一个用户添加到这个数据库,则它将自动集成所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行
2)local:这个数据永远不被复制,可以用来存储限于本地单台服务器的任意集合
3)config:当用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
(3)集合
①MongoDB的文档组,类似于关系数据库中的表格
②集合没有固定的结构,可以插入不同格式和类型的数据,但通常情况下插入的数据都会有一定关联性
③合法的集合名字不能使空字符串,不能含有\0(空字符),这个祖父表示集合名的结尾,不能以system.开头,这是为系统集合保留的前缀
(4)文档
①文档是一个键值,即BSON。
②文档不需要设置相同的字段,并且相同字段不需要相同的数据类型
③文档中的键值对是有序的
④文档中的值可以使双银行里面的字符串,也可以是其他几种数据类型
⑤区分类型和大小写
⑥文档不能有重复键
⑦文档的键是字符串,除了少数情况,键可以使用任意UTF-8字符
⑧键不能含有空字符,空字符用来标识结尾
⑨.和$有特别意义,只有在特定环境下才能使用
⑩以_开头的键是保留的
2、物理存储结构
(1)数据存储
①数据目录由dbpath指定
②每个数据库都包含一个.ns文件和一些数据文件,随着数据量不断增大,文件数量也会增多。
③数据文件每次生成一个新文件,大小都会比上一个文件大两倍
④文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但只是虚拟内存,只有访问到这块数据时才会交换到物理内存
(2)日志存储
①存放位置由logpath指定
②journal日志文件,用于MongoDB崩溃恢复的保障
③oplog复制操作日志文件在启动主从复制时出现
④man查询日志文件,需要在配置文件中指定profile=1与slowms=200,查看慢查询的命令为:>db.system.profile.find()
3、数据类型
四、MongoDB基本操作
1、常用基本操作
2、连接数据库
(1)/usr/local/mongodb/bin/mongo
(2)mongodb://zhangsan:123456@192.168.100.100:27017
3、创建和删除数据库
(1)创建:use database_name
(2)删除(先进入相应库):db.dropDatabase()
4、集合和文档的操作
(1)直接创建集合:
①db.createCollection(“name”,{capped:true,autoIndexId:true,size:6142800,max:10000})
②capped:是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义
③autoindexid:是否使用_id作为索引,默认为使用(true或false)
④size:限制集合使用空间的大小,默认为没有限制
⑤max:集合中最大条数限制,默认为没有限制
(2)向集合中插入文档:db.collection_name.insert({“key”:”value”})
①不指定_id:db.collection_name.save(document)
(3)跟新文档:db.collection_name.update({“_id”:1},{“key”:”value”})
①只更新一条记录:db.collection_name.update({“_id”:1},{$set:(“key”:”value”)})
②也可用save命令进行跟新
(4)删除文档:db.collection_name.remove()
①deleteOne()
②deleteMany()
五、MongoDB日常维护
1、备份与恢复管理
(1)导入导出
①导出:mongoexport -d dbname -c collectionname -o filename.json
②导入:mongoimport -d bdname -c collectioname file
③d:数据库名字
④c:collection名字
⑤f:导出哪些列
⑥o:要导出的文件
⑦q:导出数据的过滤条件
(2)备份与恢复
①备份:mongodump -h dbhost -d dbname -o dbdirectory
②h:数据库服务器地址
③d:需要备份的实例
④o:备份的数据存放位置,备份后会自动在此目录建立相应文件夹及备份文件
⑤恢复:mongorestore -h dbhost -d dbname --dir dbdirectory
(3)复制数据库
①db.copyDatabase(“db1”,”db2”,”127.0.0.1:27017”)
(4)克隆集合
①db.runCommand({“cloneCollection”:”test.user”,”from”:”127.0.0.1:27018”})
(5)不同数据库之间数据迁移(扩展知识)
2、安全管理
(1)限定监听特定IP和端口(配置文件)
①bind_ip=192.168.11.30
②port=27017
(2)授权启动
①配置文件添加auth=true
②添加用户
1)use admin
2)db.createUser({“user”:”root”,”pwd”:”111111”,”roles”:[“root”]})
a.“rules”:[{role:”userAdminAnyDatabase”,db:”admin”}]
③使用用户
1)use admin
2)db.auth(“root”,”111111”)
④查看用户
1)db.system.users.find()
2)show users
⑤删除用户
1)db.system.users.remove({user:”root”})
⑥数据库内置角色
1)数据库用户角色:
a.read:指定数据库读取权限
b.readWrite:指定数据库读写权限
2)数据库管理角色:
a.dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
b.dbOwner:允许在当前DB中执行任意操作
c.userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
3)集群管理角色:
a.clusterAdmin:赋予管理集群的最高权限,只在admin数据库中可用
b.clusterManager:赋予管理和监控集群的权限
c.clusterMonitor:赋予监控集群的权限,对监控工具具有readonly的权限
d.hostManager:赋予管理Server
4)备份恢复角色:
a.backup:备份权限
b.restore:恢复备份权限
5)所有数据库角色:
a.readAnyDatabase:赋予用户所有数据库的读权限,只在admin数据库中可用
b.readWriteAnyDatabase:赋予用户所有数据库的读写权限,只在admin数据库中可用
c.userAdminAnyDatabase:赋予用户所有数据库管理User的权限,只在admin数据库中可用
d.dbAdminAnyDatabase:赋予管理所有数据库的权限,只在admin数据库中可用
6)超级用户角色:
a.root:超级账号,超级权限,只在admin数据库中可用
b.这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7)内部角色:
a.__system
(3)进程管理
①查看进程:db.currentOp()
3、MongoDB监控
(1)查看数据库统计信息
①查看数据库实例状态信息:db.serverStatus()
②查看当前数据库统计信息:db.stats()
③通过web界面查看:在配置文件中添加httpinterface=true
(2)查看集合统计信息
①查看集合统计信息:db.users.stats()
②查看集合大小:db.user.dataSize()
(3)第三方监控工具
①可以再Nagios中配置使用MongoDB插件来监控MongoDB数据库