收藏 分享(赏)

MongoDB-介绍.ppt

上传人:weiwoduzun 文档编号:3795190 上传时间:2018-11-19 格式:PPT 页数:85 大小:4.98MB
下载 相关 举报
MongoDB-介绍.ppt_第1页
第1页 / 共85页
MongoDB-介绍.ppt_第2页
第2页 / 共85页
MongoDB-介绍.ppt_第3页
第3页 / 共85页
MongoDB-介绍.ppt_第4页
第4页 / 共85页
MongoDB-介绍.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、MongoDB技术交流,2012年8月,议题,一、需求背景 二、传统SQL的瓶颈 三、NoSQL的优势 四、CAP理论 五、NoSQL的不足 六、NoSQL应用现状 七、几种典型NoSQL的对比 八、重点介绍MongoDB,一、需求背景,一、需求背景,一、需求背景,大数据的特征 Volume - 数据量巨大,对TB、PB数据级的处理,已经成为基本要求。 Variety - 数据多样性,能处理结构化和非结构化数据,能处理Web数据,能处理语音数据甚至是图像、视频数据。 Velocity - 数据实时性,在客户每次浏览页面,每次下订单的过程中,都会对用户进行实时的推荐,决策已经变得实时。,一、需求

2、背景,大数据时代下的系统需求 High performance - 高并发读写,高并发、实时动态数据获取和更新。 Huge Storage - 海量数据的高效率存储和访问,类似SNS网站,海量用户信息的高效率实时存储和查询。 High Scalability & High Availability - 高可扩展性和高可用性,需要拥有快速横向扩展能力、提供7*24小时不间断服务。,二、传统SQL的瓶颈,关系数据库处理大数据遇到的问题 面对高并发读写的需求,数据库读写压力巨大,硬盘IO无法承受。 面对海量数据,数据库存储记录数量有限,SQL查询效率极低。 横向扩展艰难,无法通过快速增加服务器节点实

3、现,系统升级和维护造成服务不可用。,三、NoSQL的优势,NoSQL处理大数据的优势 易扩展,数据之间无关系,这样就非常容易扩展。 灵活的数据模型,可以随时存储自定义的数据格式。而在关系数据库里,增删字段是件非常麻烦的事情。如果是大数据量的表,增加字段简直就是一个噩梦。 高可用,通过复制模型实现高可用性。 高性能,得益于数据无关系性,数据库的结构简单,这样就有非常高的读写性能,尤其在大数据量下。,三、NoSQL的优势,什么是NoSQL? NoSQL是Not Only SQL的缩写,而不是Not SQL,它不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。 相比

4、传统数据库,叫它分布式数据管理系统更贴切,数据存储被简化更灵活,重点被放在了分布式数据管理上。,四、CAP原理,分布式数据管理系统的CAP原理三要素 一致性(Consistency) 可用性(Availability) 分区容忍性(Partition tolerance) CAP定理 在分布式数据管理系统中,这三个要素最多只能同时实现两点,不可能三者兼顾。 分区容忍性是基本要求,对于大多数web应用,牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。,五、NoSQL的不足,弱事务性 在一些要求事务一致性较高、业务逻辑比较复杂,或者一些需要复杂分析查询的环境中,NoSQL难以担当重任。

5、 弱联表查询 只能提供简单的查询,无法进行多表联合查询等复杂的查询操作。 非主流 大部分NoSQL都还处于前-生产环境阶段,还有大量的关键特性有待实现。,六、NoSQL的应用现状,六、NoSQL的应用现状,七、几种典型NoSQL的对比,八、重点介绍MongoDB,1、谁在使用MongoDB 2、MongoDB预研 3、MongoDB操作 4、Replica Sets副本集 5、Sharding(分片) 6、数据文件内部结构,1、谁在使用MongoDB,1、谁在使用MongoDB,2、MongoDB预研,MongoDB简介 一个基于分布式文件存储的数据库。由C+语言编写。旨在为WEB应用提供可扩

6、展的高性能数据存储解决方案。 一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的产品。 它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。 它最大特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,支持MadReduce功能。,2、MongoDB预研,主要特点 高性能、易部署、易使用,存储数据方便。 模式自由,支持动态查询、完全索引、文档内嵌查询。 面向集合,以文档(K/V)形式存储,Key用于唯一标识,而Value则可以是各种

7、复杂的文件类型。 支持主/从服务器间的复制和故障恢复。 自动分片,以支持云级别的服务伸缩性,可动态添加额外的服务器。,2、MongoDB预研,性能测试 测试环境 CPU: Intel Xeon E5-2620 主频:2000MHz 六核心 内存:64GB 磁盘:2 * 300GB/10000转/SAS12 * 2TB 7200转 64MB SATA 网卡:3 * 10000M网卡 操作系统:Linux Centos 6.2 x86_64,2、MongoDB预研,性能测试 每记录2K共40G数据,在此基础上增加一个新表进行读写测试结果,2、MongoDB预研,性能测试 每记录2K共40G数据,在

8、此基础上建立一个有10w条记录的表,并对记录的不同字段做索引,然后按照索引字段进行数据读取,一次连接读取10w条记录然后输出测试结果,2、MongoDB预研,性能测试 每记录2M共40G数据,在此基础上增加一个新表进行读写测试结果,2、MongoDB预研,性能测试 每记录2K共128G数据,在此基础上增加一个新表进行读写测试结果,2、MongoDB预研,性能测试 每记录2M共128G数据,在此基础上增加一个新表进行读写测试结果,2、MongoDB预研,性能测试 磁盘读取效率测试,在原库64G基础上建6400个表, 6400*5000*2K=64G,每隔20个表读取一个表中的第一条及最后一条记录

9、,记录读取时间,2、MongoDB预研,性能测试 多表大规模检索效率测试,建立25000张表, 25000*3000*2K=150G,然后通过两台服务器读取数据,每台服务器上8个客户端,记录16张表的读取和检索时间 每隔1400张表取一个表的所有数据,共取16张表,记录每张表数据的获取时间 每隔1400张表取一个表,然后对表中的数据排序,输出其中的1500-1550条记录,记录获取时间 对表中的字段做索引,然后每隔1400张表取一个表,再对表中的数据排序,输出其中的1500-1550条记录,记录获取时间,2、MongoDB预研,性能测试 平均每取一张表全部数据耗时673ms,cpu耗用10%以

10、内,测试结果如下:,2、MongoDB预研,性能测试 基本分析 单客户端16个线程基本达到最大值10000次/s,读取速度约为10000*2K=20MB/s,cpu占用率偶尔达到80%左右,但大部分为5%,磁盘io基本没有,可以说明在内存足够大的情况下读取数据基本是全命中的。 单客户端16个线程的写入基本达到最大值4000次/s,写入速度约为8MB/s , cpu占用率偶尔达到90%,但大部分维持在6%,磁盘有明显的写io操作。 读写并发的情况,读取速度明显下降,基本是下降50%的效率,读响应时间明显增加约为2.7ms, cpu占用率偶尔达到100%,但大部分维持在6%,磁盘有明显的写入io,

11、读取io基本没有,说明在内存足够大的情况下,读取仍然是全命中,但会受到写入操作的影响。,2、MongoDB预研,性能测试 基本分析 无索引情况下,检索对于cpu的消耗较少,排序对于cpu的消耗较高且相对来说较为耗时。 2M单线程的读可以达到50MB/s的速度,多线程可以达到90MB/s的速度,基本达到网络传输极值。 2M数据在内存命中的情况下没有明显的磁盘io操作,对于cpu的消耗写入比读取要高,但两者都不算高,一般在30%以内,写入速度可以到45MB/s的速度。 从10w条数据的读取情况可以看出, 10w次连接10w次读取,每次读取1条数据的时间约为1.3ms,而一次性读取10w条数据,总时

12、间为3800ms,相当于单条数据0.038ms,小数据读取的大部分时间都耗费在网络连接上,后期可以考虑一次读取多条数据。,2、MongoDB预研,适用场合 网站数据,实时的插入,更新与查询。 由于性能很高,可做持久化缓存层。 存储大尺寸,低价值的数据。 高伸缩性的集群场景。 BSON格式非常适合文档化数据的存储及查询。,2、MongoDB预研,不适用场合 高度事务性的系统,例如银行或会计系统。 传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。,2、MongoDB预研,版本选择 MongoDB的版本命名规范如:x.y.z y为奇数

13、时表示当前版本为开发版,如:1.5.1、1.7.2 y为偶数时表示当前版本为稳定版,如:1.6.3、1.8.2 详情:http:/www.mongodb.org/display/DOCS/Version+Numbers 系统平台选择 最好使用64位机器64位操作系统,可以获得更大的内存映射空间,提升MongoDB的性能,3、MongoDB操作,MongoDB支持的数据类型 null 布尔 ture | false 整数 123 浮点 12.3 字符串 “hello world” 对象ID 用 new ObjectId()来申明 日期 用 new Date()来申明 时间戳 数组 “apple”

14、,”blanan”,”pear” 内嵌文档 “name” : “Joe”, “age”: 13, “phone” : “home”:”123”,”moblie”:”456” RegExp 正则表达式 /a-z/,3、MongoDB操作,关系型数据库的存储方式(学生、地址、科目、成绩):,3、MongoDB操作,MongoDB的存储方式(学生、地址、科目、成绩):,3、MongoDB操作,一个MongoDB文档结构例子:,3、MongoDB操作,在MongoDB中的存储形式:,3、MongoDB操作,MongoDB读操作 1) WHERE # select * from users where

15、name = lili db.users.find(name : “lili“) “_id“ : ObjectId(“502e06947dcbce905cc49831“), “name“ : “lili“, “sex“ : “female“, “age“ : 18, “married“ : false 2) FIELDS # select name, age from users where age = 18 db.users.find(age : 18, name : 1, age : 1) “_id“ : ObjectId(“502e06947dcbce905cc49831“), “nam

16、e“ : “lili“, “age“ : 18 # select name, age from users db.users.find(, name : 1, age : 1),3、MongoDB操作,MongoDB读操作 3) SORT # select * from users order by age db.users.find().sort(age : 1) # select * from users order by sex asce, age desc db.users.find().sort(sex : 1, age : -1) 4) SLICE# select * from u

17、sers skip 2 limit 3 db.users.find().skip(2).limit(3)Conditional Operators # select * from users where sex = maleand age 18 and age db.users.find(sex : “male“, age : $gt : 18, $lt : 30) 比较操作包括:$gt ()、$lt (=)、$lte(=)、$ne (!=),3、MongoDB操作,MongoDB读操作 5) IN # select * from users where age in (18, 28) db.

18、users.find(age : $in : 18, 28) 对应的操作符有 $nin (not in) 6) COUNT # select count(*) from users where age 18 db.users.find(age : $gt : 18).count() 7)OR # select * from users where age = 18 or age = 28 db.users.find($or : age : 18, age : 28) # select * from users where age = 28 db.users.find($or : age : $

19、lte : 18, age : $gte : 28),3、MongoDB操作,MongoDB写操作 1) INSERT # insert into users value() db.users.insert(name : “Jimmy“, sex : “male“, age : 88) 2) UPDATE# update users set age = 100, sex = 0 where name = Jimmy db.users.update(name : “Jimmy“, $set : age : 100, sex : “female“)update(criteria, objNew,

20、upsert, mul) 有几个参数需要注意criteria: 需要被更新的条件表达式objNew: 更新表达式upsert: 如目标记录不存在,是否插入新文档multi: 是否更新多个文档,3、MongoDB操作,MongoDB写操作 2) UPDATE# update users set age = age + 10 db.users.update(, $inc:age:10, false, true)# update users set age = age + 10, sex = male where name = Joe db.users.update(name : “Joe“, $i

21、nc : age: 10) 3)REMOVE用于删除单个或全部文档,删除后的文档无法恢复 id = db.users.findOne(name : “lili“)._id db.users.remove(id) db.users.remove()/移除所有,3、MongoDB操作,MongoDB高级操作 Distinct db.users.distinct(“name“) “Joe“, “lili“, “Jimmy“, “Jeremy“ Group#SELECT name, sum(marks) FROM user where name=foo GROUP BY name db.user.gr

22、oup( key : name : true, cond: name : foo, reduce: function(obj,prev) prev.msum += obj.marks; , initial: msum : 0 );,3、MongoDB操作,MongoDB高级操作 Index/ single ascendingdb.colors.ensureIndex(name: 1)/ unique db.colors.ensureIndex(email: 1, unique: true)/ single descending db.colors.ensureIndex(createdat:

23、-1)/ compound db.colors.ensureIndex(name: 1, createdat: -1),4、Replica Sets副本集,副本集架构图,Primary,Secondary-1,Secondary-2,. . .,4、Replica Sets副本集,角色介绍 Primary主服务器,写操作只能在其身上发生,通过保存操作日志(oplog),然后异步同步到多个 Secondary 上。 Secondary从服务器,热机备份主服务器上的数据,分担主机读压力,当主机故障发生,随时待命接管主机工作。,4、Replica Sets副本集,主/从服务器间数据同步图,4、Rep

24、lica Sets副本集,主/从服务器间数据同步 红色箭头表示写操作写到Primary上,然后异步同步到多个Secondary上。 蓝色箭头表示读操作可以从Primary或Secondary任意一个上读。 各个Primary与Secondary之间一直保持心跳同步检测,用于判断Replica Sets的状态。,5、Sharding(分片),分片集群架构图,5、Sharding(分片),角色介绍 Shard Server - mongod实例,存储实际数据的模块。 Config Server - mongod实例,存储集群元数据、分片信息等。 Route Server - mongos实例,客户

25、端访问统一接入点,处理数据访问路由,查询优化,数据合并、排序、裁剪,请求推送等。,5、Sharding(分片),分片机制图,5、Sharding(分片),分片机制介绍 分片是指将数据拆分,将其分散在不同机器上的过程。 通过分片能够增加更多的机器,来应对不断增加的负载和数据。 MongoDB何时分片: 机器的磁盘不够用 单个mongod已经不能满足写数据的性能需求 想将大量的数据放在内存中提高性能 一般来说,集群先从不分片开始,然后在需要时才转换成分片。,5、Sharding(分片),分片机制介绍 MongoDB的分片是指定一个分片key来进行,数据按范围分成不同的chunk,每个chunk的大

26、小有限制。 有多个分片节点保存这些chunk,每个节点保存一部分的chunk 。 每一个分片节点都是一个Replica Sets,这样保证数据的安全性。 当一个chunk超过其限制的最大体积时,会分裂成两个小的chunk 。 当chunk在分片节点中分布不均衡时,会引发chunk迁移操作。,5、Sharding(分片),分片机制介绍 假设有一个用户文档集合,如果选择“name”作为片键,第一片可能会存放名字以AF开头的文档,第二片存GP的名字,第三片存的QZ的名字。,“A”, ”F”(Shard1),“G”, ”P”(Shard2),“Q”, ”Z”(Shard3),5、Sharding(分片

27、),分片服务角色图,5、Sharding(分片),分片服务角色介绍 客户端访问路由节点mongos来进行数据读写。 config服务器保存了两个映射关系,一个是key值的区间对应哪一个chunk的映射关系,另一个是chunk存在哪一个分片节点的映射关系。 路由节点通过config服务器获取数据信息,通过这些信息,找到真正存放数据的分片节点进行对应操作。,5、Sharding(分片),分片服务角色介绍 路由节点还会在写操作时判断当前chunk是否超出限定大小,如果超出,就分列成两个chunk。 对于按分片key进行的查询和update操作来说,路由节点会查到具体的chunk然后再进行相关的工作。

28、 对于不按分片key进行的查询和update操作来说,mongos会对所有下属节点发送请求然后再对返回结果进行合并。,6、数据文件内部结构,在文件系统中为每个数据库预分配逐渐增长大小的文件集,这样可以有效地避免潜在的文件系统碎片,使数据库操作更高效。 一个数据库的文件集从序号0开始分配,0,1.,大小依次是64M,128M,256M,512M,1G,2G,然后就是一直2G的创建下去(32位系统最大到512M)。 数据库文件在内部会被切分成多个数据域,数据域之间使用双向链表连接。 名字空间用于区分不同的存储类别,比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间。 名字

29、空间与数据域间的关系:,6、数据文件内部结构,6、数据文件内部结构,名字空间与数据域: 每个名字空间可以有不同的数据域,在磁盘上不必连续。 图中还有一个特殊的名字空间freelist,存放着不再使用的数据域,例如,删除集合或索引产生的数据域。 当名字空间分配新的数据域时,系统会先查找空闲列表,看看有没有适合大小的数据域可用。 在每一个数据域中,保存了具体一行行BSON格式的数据,这些数据也是通过双向链表连接。 每一行数据存储空间不仅包括数据占用空间,还可能包含一部分附加空间,这使得在数据update变大后可以不移动位置。,6、数据文件内部结构,索引数据也保存在数据文件中,不过索引是被组织成B-

30、tree结构,而不是双向链表。 对每个数据库,都有一个命名空间文件,用于保存每个名字空间对应的元数据。我们通过查询这些元数据来找到对应的名字空间的数据存储位置。 下面通过10gen工程师Mathias Stearn的发言稿,介绍数据文件结构:,6、数据文件内部结构,每个数据库都有相应的数据文件和命名空间文件。,6、数据文件内部结构,数据文件从16MB开始,新的数据文件比上一个文件大一倍,最大为2GB 。,6、数据文件内部结构,数据文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但只是虚拟内存,只有访问到这块数据时才会交换到物理内存。,6、数据文件内部结构,MongoDB的数据文件映

31、射到内存表中的位置。,6、数据文件内部结构,使用32位机器的话,内存地址最大可以标识4GB内存。,6、数据文件内部结构,但是在32位机器上,4GB内存会有1GB被内核占用,大约0.5GB会用于mongod进程的stack空间,只剩下大约2.5GB可用于映射数据文件。,6、数据文件内部结构,使用64位机器的话,内存地址最大可以标识128TB内存。,6、数据文件内部结构,每个数据文件被分成一个一个的数据块。,6、数据文件内部结构,块与块之间用双向链表连接。,6、数据文件内部结构,在命名空间文件中,保存的是一个哈希表,存储了每个名字空间对应的元数据,包括其大小,块数,第一块位置,最后一块位置,被删除

32、的块的链表以及索引信息。,6、数据文件内部结构,这些位置通过DiskLoc数据结构进行存储,存储了数据文件编号和块在文件中的位置。,6、数据文件内部结构,对每一个块来说,其头部包含了一些块的元数据,比如自己的位置,上一个块和下一个块的位置。,6、数据文件内部结构,以及块中第一条和最后一条记录的位置指针。剩下的部分用于存储具体的数据,具体数据之间也是通过双向链表进行连接。,6、数据文件内部结构,MongoDB尽管在数据存储上与传统关系数据库很不一样,但是在索引构建上却几乎是与传统关系型数据库一致。 主要是使用了B-tree作为索引结构。 B-tree,多路搜索树,并不是二叉的,以下介绍其主要特点

33、:,6、数据文件内部结构,B-tree特点,6、数据文件内部结构,B-tree特点 1)任意非叶子结点最多只有M个儿子,且M2。 2)根结点的儿子数为2, M。 3)每个结点存放至少M/2-1和至多M-1个关键字,且唯一。 4)非叶子结点的关键字:K1, K2, , KM-1;且Ki Ki+1。 5)非叶子结点的指针:P1, P2, , PM;其中P1指向关键字小于K1的子树,PM指向关键字大于KM-1的子树,其它Pi指向关键字属于(Ki-1, Ki)的子树。 6)所有叶子结点位于同一层。,6、数据文件内部结构,B-tree搜索 从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否

34、则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字。 下面一篇文章是10gen工程师 Kyle Banker 所写,他拿食谱举例,讲解了索引的基本实现,非常形像。 原文链接:http:/ 想像你要在一本没有目录的食谱上查找某一道菜的做法,唯一的办法可能就是从头到尾把这本几百页的书看一遍,直到找到你想找的菜。 而一个快速的方法就是给菜谱加上一个目录,目录中有每一道菜的名字及与其相对应的页数,并且菜名是按字母顺序排列,这样你就可以按首字母快速地找到你菜谱的页数了。,6、数据文件内部结构,唯一索引 举例: 水饺 -

35、 45 水煮肉片 - 4,011 水煮鱼 - 943,6、数据文件内部结构,非唯一索引 但是如果我今天买了条鱼,想查一下所有跟鱼相关的做法,那么用上面的索引就没办法了。于是出现下面一种索引构建方法,即将所有菜的材料构建目录,这时候一个材料对应多道菜。 举例: 鱼 - 3, 20, 42, 88, 103, 1,215 猪肉 - 2, 47, 88, 89, 90, 275 白菜 - 7, 9, 80, 81, 82, 83, 84,6、数据文件内部结构,联合索引 还有另一种需求,如果我知道材料里有鱼,而我又知道这道菜的名字,就不用查找到材料后去翻看后面几个具体页的菜再来选择了。 举例: 鱼 - 水煮鱼 - 1,215 - 红烧带鱼 - 88 - 酸菜鱼 - 103,6、数据文件内部结构,联合索引 猪肉 - 红烧肉 - 875 - 小炒肉 - 89 - 回锅肉 - 47 白菜 - 白菜汤 - 2,000 ,无限地享受无线的生活,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 规范标准 > 国内外标准规范

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报