MONGODB学习总结入门篇.docx
- 文档编号:9098325
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:15
- 大小:221.35KB
MONGODB学习总结入门篇.docx
《MONGODB学习总结入门篇.docx》由会员分享,可在线阅读,更多相关《MONGODB学习总结入门篇.docx(15页珍藏版)》请在冰豆网上搜索。
MONGODB学习总结入门篇
MongoDB
1Mongodb基本概念
1.1简介
WhatisMongoDB?
MongoDB是一个基于分布式文件存储的数据库。
由C++语言编写。
旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB很像MySQL,document对应MySQL的row,collection对应MySQL的table。
1.2特点
它的特点是高性能、易部署、易使用,存储数据非常方便。
主要功能特性有:
*面向集合存储,易存储对象类型的数据。
*模式自由。
*支持动态查询。
*支持完全索引,包含内部对象。
*支持查询。
*支持复制和故障恢复。
*使用高效的二进制数据存储,包括大型对象(如视频等)。
*自动处理碎片,以支持云计算层次的扩展性。
*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
*文件存储格式为BSON(一种JSON的扩展)。
*可通过网络访问。
1.3使用原理
所谓“面向集合”(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection)。
每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。
集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。
如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
存储在集合中的文档,被存储为键-值对的形式。
键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。
我们称这种存储形式为BSON(BinarySerializeddOcumentFormat)。
推荐64位系统。
参考官方API(建议英文)。
2Window下Mongodb操作
2.1下载与解压
官方网站:
http:
//www.mongodb.org/downloads。
下载对于版本,解压并抽取相关的bin目录到C:
\MongoDB下(这个任意选择)。
在启动MongoDB之前,我们必须新建一个存放mongoDB数据和日志的目录。
数据库目录:
C:
\MongoDB\data\db\,日志目录:
C:
\MongoDB\data\。
2.2运行服务端
打开CMD窗口,进入到C:
\MongoDB\bin目录下,运行服务端mongod.exe。
C:
\>cdC:
\MongoDB\bin
C:
\MongoDB\bin>mongod.exe--dbpath=C:
\MongoDB\data\db--directoryperdb--logpath=C:
\MongoDB\data\logs--logappend
注:
日志文件为C:
\MongoDB\data\logs,以及添加方式记录(追加)。
数据目录为C:
\MongoDB\data\db,并且每个数据库将储存在一个单独的目录(--directoryperdb)。
服务端要一直运行。
Ctrl+C可中断。
//例:
创建名为MongoDB_DaShu的服务
mongod--install--serviceNameMongoDB_DaShu--serviceDisplayNameMongoDB_LBJ--logpathc:
\MongoDB\data--dbpathc:
\MongoDB\data–directoryperdb
2.3运行客户端
再打开一个CMD窗口,进入到C:
\MongoDB\bin目录下,运行客户端mongo.exe来登录MongoDB。
(要保持服务端mongod.exe的窗口不关闭)
2.4测试操作
MongoDB使用GridFS来储存大文件。
每个BSON对象大小不能超过4MB。
字段名限制:
不能以“$”开头;不能包含“.”;“_id”是系统保留的字段,但用户可以自己储存唯一性的数据在字段中。
MongoDB为每个数据库分配一系列文件。
每个数据文件都会被预分配一个大小,第一个文件名字为“.0”,大小为64MB,第二个文件“.1”为128MB,依此类推,文件大小上限为2GB。
MongoDB没有新建数据库或者collection的命令,只要进行insert或其它操作,MongoDB就会自动帮你建立数据库和collection。
当查询一个不存在的collection时也不会出错,Mongo会认为那是一个空的collection。
一个对象被插入到数据库中时,如果它没有ID,会自动生成一个“_id”字段,为24位16进制数。
MongoDB命令行客户端的脚本语法有些类似MySQL的:
>showdbs//列出所有数据库
>usememo//使用数据库memo。
即使这个数据库不存在也可以执行,但该数据库不会立刻被新建,要等到执行了insert等的操作时,才会建立这个数据库。
>showcollections//列出当前数据库的collections
>db//显示当前数据库
>showusers//列出用户
更多语法,查看help
新建数据库与数据集合:
插入数据:
(插入数据的方式有很丰富)
查询数据:
MongoDB的查询语法很强大,类似于SQL的条件查询。
例如,很多SQL可以做的,它都可以做:
db.foo.find()//select*fromfoo
db.foo.find().limit(10)//select*fromfoolimit10
db.foo.find().sort({x:
1})//select*fromfooorderbyxasc
db.foo.find().sort({x:
1}).skip(5).limit(10)//select*fromfooorderbyxasclimit5,10
db.foo.find({x:
10})//select*fromfoowherex=10
db.foo.find({x:
{$lt:
10}})//select*fromfoowherex<=10
db.foo.find({},{y:
true})//selectyfromfoo
一些SQL不能做的,MongoDB也可以做:
db.foo.find({"address.city":
"gz"})//搜索嵌套文档address中city值为gz的记录
db.foo.find({likes:
"math"})//搜索数组
db.foo.ensureIndex({"address.city":
1})//在嵌套文档的字段上建索引
更新数据:
db.foo.update({},{})更新对象,第一个参数是查询对象,第二个是替代的,可以在第二个对象里指定更新哪些字段,要使用$set。
删除条件查询:
删除数据集合(表):
删除当前数据库:
db.foo.remove()是用来删除数据,只删除匹配的对象
索引:
db.foo.ensureIndex({productid:
1})//在productid上建立普通索引
db.foo.ensureIndex({district:
1,plate:
1})//多字段索引
db.foo.ensureIndex({productid:
1},{unique:
true})//唯一索引
总的来说,使用mongodb可以满足常见的增删改差,但是不能完成复杂的跨表级联查询,mongodb努力使数据变得简单紧凑。
2.5备份与恢复
二进制数据格式,常用于备份、还原。
Mongodb的备份工具mongodump:
事例:
下图把备份数据库test中所有的数据集合(表)
MongoDB的数据恢复工具mongorestore:
事例:
恢复数据库test中的表t002的数据
2.6数据导出,导入
json或csv格式,每次一个collection
数据导出:
数据导入:
2.7安全与认证
usetest2//选择数据库test2
db.addUser("username","password");//普通权限,可读写
db.addUser("username","password",true);//只可读,不可写
db.system.users.remove({user:
“username”});//删除用户
3Mongodb研究性学习
3.1Mongodb应用方案优化
Mongodb系统采用Auto-Sharding算法存在着数据在各个节点上分配不均匀现象,这就是CPU利用率过高的原因,直接影响了系统性能。
这里提出Mongodb在大数据量情况下CPU占有率过高的解决办法——Mongodb分片优化。
Mongodb中的分片机制提供如下功能:
●当数据量和负载个数发生变化时,分片机制可以自动平衡负载和数据分布的变化
●分片机制可以灵活的添加新的硬件设备类满足数据的需求
●拓展性强,最大可以扩展到1000个节点
●出现故障时,利用sharding可以实现自动故障转移。
Auto-Sharding架构图如下:
说明:
●Client:
客户端请求
●Sharding:
分片
即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例
构成的ReplicaSet。
为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard
为一组ReplicaSet。
●Mongos:
路由进程
这是一个前端路由,客户端由此接入,然后询问ConfigServers需要到哪个Shard上查询或
保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。
客户端只需要将原本
发给mongod的查询或更新请求原封不动地发给RoutingProcess,而不必关心所操作的记录
存储在哪个Shard上。
●Mongod:
配置服务器
为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shardkey,
例如{age:
1},shardkey可以决定该条记录属于哪个chunk。
ConfigServers就是用来存储:
所有shard节点的配置信息、每个chunk的shardkey范围、chunk在各shard的分布情况、
该集群中所有DB和collection的sharding配置信息。
Auto-sharding,是通过mongos的自动分片功能简历一个水平扩展的数据库集群系统,将数据存储在sharding的各个节点上。
当增加节点时,sharding能够自动对数据进行分片,对整个系统进行负载均衡。
导致CPU占用率最大的主要原因:
空间的预分配问题:
为了避免形成过多的硬盘碎片,mongodb在每次空间不足时,都会申请一大块硬盘空间(由Auto-sharding机制决定),而且申请的量呈指数增长,64M,128M,256M知道2G为单个文件的最大体积。
Mongodb的sharding在存储数据时采用分块存储(chunk),每一块的大小默认为200M,而sharding每一次数据迁移的最小单元就是chunk,而这个数据迁移的过程则是引发cpu占有率最大的根本原因,过程是:
Mongodb后台有个banlence的进程会检查各个sharding节点数据的分配情况,当不同节点的chunk相差达到一定的大小时,就开始进行数据迁移,以平衡数据在各sharding节点的分布。
Balancer迁移数据的过程是,先将数据读都内存,然后进行迁移,这导入cpu占用率高的原因。
3.2构建简单的mongodb集群
架构如下:
ShardServer1:
20000
ShardServer2:
20001
ConfigServer:
30000
RouteProcess:
40000
●创建文件目录
●启动shardingserver
mongod--shardsvr--port20000--dbpath/data/shard/s0--logpath
/data/shard/log/s0.log--directoryperdb--启动ShardServer实例1
/Apps/mongo/bin/mongod--shardsvr--port20001--dbpath/data/shard/s1--logpath
/data/shard/log/s1.log--directoryperdb--启动ShardServer实例2
●启动configserver
mongod--configsvr--port30000--dbpath/data/shard/config--logpath
/data/shard/log/config.log--directoryperdb--启动ConfigServer实例
●启动路由
mongos--port40000--configdblocalhost:
30000--logpath
/data/shard/log/route.log--chunkSize1--启动RouteServer实例
●Sharding配置
添加shard节点
Ø连接admin库:
Mongoadmin–port40000
Ø添加shardserver:
db.runCommand({addshard:
”localhost:
2000”})
db.runCommand({addshard:
”localhost:
2000”})
Ø设置分片存储的数据库:
db.runCommand({enableSharding:
”test”})
Ø设置分片的集合名词,且必须指定shardkey,系统会自动创建索引:
db.runCommand({shardCollection:
”test.users”,key(_id,1)})
●Sharserver基本操作
列出说有shardserver:
db.runCommand({listshards:
1})
查看sharding信息:
printShardingStatus()
判断是否是sharding:
db.runCommand({isdbgrid:
1})
新增分片表,新增shardingserver
(续)…
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MONGODB 学习 总结 入门