摘自:http://www.open-open.com/lib/view/open1427078982824.html
阅读目录
<iframe id="aswift_0" style="padding: 0px; margin: 0px; left: 0px; position: absolute; top: 0px;" name="aswift_0" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="728" height="90"></iframe>
引言
在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoDB 3.0于2015年3月3日正式发布。可以毫不夸张的说,该版本的新增特性标志着MongoDB这款典型的NoSQL数据库已经进入了一个全新的发展阶段。本文以下内容会逐个盘点3.0版本的新增特性。
插件式存储引擎API
MongoDB 3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MySQL的设计理念。目前除了早期的MMAP存储引擎外,WiredTiger和RocksDB均已完成了对MongoDB的支持,前者更是在被MongoDB公司收购后更是直接引入到了MongoDB 3.0版本中。插件式存储引擎API的引入为MongoDB丰富自己武器库以处理更多不同类型的业务提供了无限可能,内存存储引擎、事务存储引擎甚至Hadoop在未来都有可能接入进来。
WiredTiger存储引擎
如果说插件式存储引擎API为MongoDB 3.0打造了一个武器库,那么WiredTiger绝对是武器库中第一枚也是最重要的一枚重磅。因为MMAP存储引擎自身的天然缺陷(耗费磁盘空间和内存空间且难以清理,库级别锁),MongoDB为数据库运维人员带来了极大痛苦,甚至一部分人已经开始转向TokuMX,尽管后者目前也不甚稳定。意识到这一问题的MongoDB,做出了有钱任性的决定,直接收购存储引擎厂商WiredTiger,将WiredTiger存储引擎集成进3.0版本(仅在64位版本中提供)。那么这款走到聚光灯下的存储引擎究竟具备哪些值得期待的特性呢?
1、文档级别并发控制
WiredTiger通过MVCC实现文档级别的并发控制,即文档级别锁。这就允许多个客户端请求同时更新一个集合内存的多个文档,再也不需要在排队等待 库级别的写锁。这在提升数据库读写性能的同时,大大提高了系统的并发处理能力。关于这一点的效果从监控工具mongostat就可以直接体现出来,旧版本 的监控指标会有locked db这一项(该项指标过高是mongo使用人员的一大痛点啊),而新版的mongostat已经看不到了。
MongoDB 2.4.12版本
$ /home/mongodb/mongodb-linux-x86_64-2.4.12/bin/mongostat –port 55060
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 *0 *0 0 1|0 0 18g 18.3g 16.1g 0 ycsb:0.0% 0 0|0 0|0 62b 2k 1 13:04:01
*0 *0 *0 *0 0 1|0 0 18g 18.3g 16.1g 0 ycsb:0.0% 0 0|0 0|0 62b 2k 1 13:04:02
*0 *0 *0 *0 0 1|0 0 18g 18.3g 16.1g 0 ycsb:0.0% 0 0|0 0|0 62b 2k 1 13:04:03
MongoDB 3.0 rc8版本
$ /home/mongodb/mongodb-linux-x86_64-3.0.0-rc8/bin/mongostat –port 55050
insert query update delete getmore command % dirty % used flushes vsize res qr|qw ar|aw netIn netOut conn time
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 1 13:02:38
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 1 13:02:39
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 1 13:02:40
2、磁盘数据压缩
WiredTiger支持对所有集合和索引进行Block压缩和前缀压缩(如果数据库启用了journal,journal文件一样会压缩),已支持的压 缩选项包括:不压缩、Snappy压缩和Zlib压缩。这为广大Mongo使用者们带来了又一福音,因为很多Mongo数据库都是因为MMAP存储引擎消 耗了过多的磁盘空间而不得已进行扩容。其中Snappy压缩为数据库的默认压缩方式,用户可以根据业务需求选择适合的压缩方式。理论上来说,Snappy 压缩速度快,压缩率OK,而Zlib压缩率高,CPU消耗多且速度稍慢。当然,只要选择使用压缩,Mongo肯定会占用更多的CPU使用率,但是考虑到 Mongo本身并不是十分耗CPU,所以启用压缩完全是值得的。
此外,WiredTiger存储方式上也有很大改进。旧版本Mongo在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以即 使删掉了某个集合或者索引,占用的磁盘空间也很难及时自动回收。WiredTiger在集合和索引级别分配文件,数据库中的所有集合和索引均存储在单独的 文件中,集合或者索引删除后,对应的存储文件随即删除。当然,因为存储方式不同,低版本的数据库无法直接升级到WiredTiger存储引擎,只能通过导 出导入数据的方式来实现。
MongoDB 2.4.12版本
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_2_4_12]$ ll
drwxrwxr-x 3 mongodb mongodb 4096 2月 25 19:03 local
-rwxrwxr-x 1 mongodb mongodb 6 2月 25 19:04 mongod.lock
drwxrwxr-x 2 mongodb mongodb 4096 2月 27 18:30 _tmp
drwxrwxr-x 3 mongodb mongodb 4096 2月 27 18:39 ycsb
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_2_4_12]$ ll ycsb/
drwxrwxr-x 2 mongodb mongodb 4096 2月 27 18:39 _tmp
-rw——- 1 mongodb mongodb 67108864 2月 27 18:57 ycsb.0
-rw——- 1 mongodb mongodb 134217728 2月 27 18:57 ycsb.1
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.10
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.11
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.12
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:39 ycsb.13
-rw——- 1 mongodb mongodb 268435456 2月 27 18:57 ycsb.2
-rw——- 1 mongodb mongodb 536870912 2月 27 18:57 ycsb.3
-rw——- 1 mongodb mongodb 1073741824 2月 27 18:57 ycsb.4
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.5
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.6
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.7
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.8
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57 ycsb.9
-rw——- 1 mongodb mongodb 16777216 2月 27 18:40 ycsb.ns
Mongo 3.0 rc8版本
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_3_0_0]$ ll
drwxrwxr-x 2 mongodb mongodb 4096 2月 28 18:32 local
-rw-rw-r– 1 mongodb mongodb 36864 3月 21 13:41 _mdb_catalog.wt
-rwxrwxr-x 1 mongodb mongodb 6 2月 28 18:32 mongod.lock
-rw-rw-r– 1 mongodb mongodb 36864 3月 21 13:42 sizeStorer.wt
-rw-rw-r– 1 mongodb mongodb 95 2月 28 18:32 storage.bson
-rw-rw-r– 1 mongodb mongodb 49 2月 28 18:32 WiredTiger
-rw-rw-r– 1 mongodb mongodb 433 2月 28 18:32 WiredTiger.basecfg
-rw-rw-r– 1 mongodb mongodb 21 2月 28 18:32 WiredTiger.lock
-rw-rw-r– 1 mongodb mongodb 921 3月 21 13:41 WiredTiger.turtle
-rw-rw-r– 1 mongodb mongodb 53248 3月 21 13:41 WiredTiger.wt
drwxrwxr-x 2 mongodb mongodb 4096 3月 21 13:41 ycsb
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_3_0_0]$ ll ycsb/
-rw-rw-r– 1 mongodb mongodb 19314257920 2月 28 19:16 collection-4–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 602112 3月 21 13:40 collection-6–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 262598656 2月 28 18:53 index-5–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 827392 3月 21 13:40 index-7–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 1085440 3月 21 13:41 index-8–1318477584648278106.wt
3、可配置内存使用上限
WiredTiger支持内存使用容量配置,用户通过storage.wiredTiger.engineConfig.cacheSizeGB参数即可 控制MongoDB所能使用的最大内存,该参数默认值为物理内存大小的一半。这也为广大Mongo使用者们带来了又一福音,MMAP存储引擎消耗内存是出 了名的,只要数据量够大,简直就是有多少用多少。
MMAPv1存储引擎提升
MongoDB 3.0出了引入WiredTiger外,对于原有的存储引擎MMAP也进行了一定的完善,该存储引擎依然是3.0版的默认存储引擎。遗憾的是改进后的 MMAP存储引擎依旧在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以磁盘空间无法及时自动回收的问题如故。
1、锁粒度由库级别锁提升为集合级别锁
这在一定程度上也能够提升数据库的并发处理能力。
2、文档空间分配方式改变
在MMAP存储引擎中,文档按照写入顺序排列存储。如果文档更新后长度变长且原有存储位置后面没有足够的空间放下增长部分的数据,那么文档就要移动到文件 中的其他位置。这种因更新导致的文档位置移动会严重降低写性能,因为一旦文档发生移动,集合中的所有索引都要同步修改文档新的存储位置。
MMAP存储引擎为了减少这种情况的发生提供了两种文档空间分配方式:基于paddingFactor(填充因子)的自适应分配方式和基于 usePowerOf2Sizes的预分配方式,其中前者为默认方式。第一种方式会基于每个集合中文档更新历史计算文档更新的平均增长长度,然后在新文档 插入或旧文档移动时填充一部分空间,如当前集合paddingFactor的值为1.5,那么一个大小为200字节的文档插入时就会自动在文档后填充 100个字节的空间。第二种方式则不考虑更新历史,直接为文档分配2的N次方大小的存储空间,如一个大小同样为200字节的文档插入时直接分配256个字 节的空间。
MongoDB 3.0版本中的MMAPv1抛弃了基于paddingFactor的自适应分配方式,因为这种方式看起来很智能,但是因为一个集合中的文档的大小不一,所 以经过填充后的空间大小也不一样。如果集合上的更新操作很多,那么因为记录移动后导致的空闲空间会因为大小不一而难以重用。目前基于 usePowerOf2Sizes的预分配方式成为默认的文档空间分配方式,这种分配方式因为分配和回收的空间大小都是2的N次方(当大小超过2MB时则 变为2MB的倍数增长),因此更容易维护和利用。如果某个集合上只有insert或者in-place update,那么用户可以通过为该集合设置noPadding标志位,关闭空间预分配。
复制集改进
1、复制集成员增长
MongoDB 3.0的复制集成员的最大个数由之前的12个增长为50个,但能够投票的最大成员个数依然为7个,而相应的getLastError中的 w: “majority” 项也仅代表投票节点的大多数。
2、Primary节点StepDown处理方式变化
在复制集中通过replSetStepDown命令可以使得当前的Primary节点退位,重新选举新的Primay节点。MongoDB 3.0在StepDown的处理方式上做了如下修改:1)在Primary退位之前,会首先中断某些耗时较长的用户操作如创建索引、写操作、 Mapreduce任务等;2)为了防止数据回滚,Primary节点在退位之前会等待一个可被选举的Secondary节点同步到最新数据,而旧版本中 Primary节点只要有Secondary节点的数据同步到10秒以内就退位;3)同时replSetStepDown命令新增了一个 secondaryCatchUpPeriodSecs参数,用户可以指定Primary节点等待有Secondary节点的数据同步到该参数指定的秒数内就退位。
分片集群改进
1、新增工具函数 sh.removeTagRange()
旧版本中只有sh.addTagRange(),如果要删除tagRange只能手工到config.tags集合中删除。
2、提供更可预测的Read Preference处理
新版本中mongos实例在执行读操作时不再将连接固定在复制集成员上,而是对每个读操作都会重新评估Read Preference。这样当Read Preference修改时,其行为更容易预测。
3、为chunk迁移提供writeConcern设置
新版本针对均衡器为moveChunk和cleanupOrphaned这两个涉及到chunk迁移的命令提供了writeConcern参数。
4、增加均衡器状态显示
新版本中通过sh.status()可以看到均衡器的状态信息。
其他改动
1、优化explan函数
新版本explain函数可以支持count,find,group,aggregate,update,remove等操作的查询计划显示,结果更全面更精细。
2、重写mongodb工具
新版本所有mongodb自带工具均使用Go语言重写,特别是在mongodump和mongorestore添加了并行机制,这样可以大大加快数据的导出和导入。
3、日志输出控制
新版本中将日志分为不同的模块,其中包括ACCESS、COMMAND、CONTROL、GEO、INDEX、NETWORK、QUERY、REPL、 SHARDING、STORAGE、JOURNAL和WRITE等。用户可以动态调整每个模块的日志级别,这无疑更有利于系统问题诊断。
4、 索引构建优化
后台索引建立过程中,不能进行删库删表删索引操作,且后台索引建立过程不会因此自动中断。另外,使用createIndexes命令可以同时建立多个索引,并且只扫描一遍数据,提升了建索引的效率。
总结
以上仅列出了MongoDB 3.0的一些主要特性和修改,如果希望了解更多可以查看MongoDB 3.0的Release-Notes。总体来看,MongoDB 3.0提供了较多令人惊喜的新特性,也使人们更加看好其未来的发展。
参考资料链接
来自:http://blog.sina.com.cn/s/blog_48c95a190102vedr.html
相关推荐
在本项目中,我们主要探讨的是如何在Spring MVC框架下集成MongoDB 3.0数据库,同时利用log4j2进行日志管理,并且运用注解进行程序的简化与优化。下面将对这些核心知识点进行详细阐述。 首先,Spring MVC是Spring...
本教程主要针对MongoDB 3.0版本,结合Java进行实战教学。 在Java中使用MongoDB,我们需要依赖MongoDB的Java驱动程序,即`mongo-java-driver`。这个驱动程序提供了一套丰富的API,允许开发者在Java应用中方便地连接...
本项目以spring4.0+mongodb3.0为基础开发简易demo,对mongodb进行权限认证,简单增删改查,mapreduce,aggregate操作简单演示,java项目,非maven项目,使用之前先配好mongodb及其修改mongodb.properties里参数。
在“mongoDB3.0以上连接工具.zip”这个压缩包中,我们可以找到用于连接MongoDB 3.0及以上版本的工具,这些工具可能包括MongoDB Compass、Robo 3T (原名Robomongo)、MongoDB Shell等。这些工具都是为了帮助用户更高效...
在SUSE Linux Enterprise Server 11(SLES11)64位操作系统上安装MongoDB 3.0版本,可以充分利用64位系统的内存资源,提供更优的性能和稳定性。以下是关于MongoDB 3.0在SUSE11 64bit环境下安装和使用的详细步骤及...
在这个“mongodb3.0Linux版本的tgz包”中,我们主要讨论的是MongoDB 3.0.8在Linux操作系统上的部署和使用。 MongoDB 3.0是其发展中的一个重要里程碑,它引入了许多新特性,提高了性能和可扩展性。以下是一些关键...
2015.3.3正式发布了Mongodb3.0,对比2.0版本加入了许多新特性,主要加了新的存储引擎WiredTiger,默认引擎是MMAP;本文档主要讲述的是MongoDB 3.0数据压缩测试;感兴趣的朋友可以过来看看
### MongoDB 3.0 数据压缩测试分析 #### MongoDB 3.0 新特性概览 MongoDB 3.0 是在2015年3月3日正式发布的,与之前的2.0版本相比,它引入了大量的新功能和技术改进。其中最重要的一个特性就是加入了新的存储引擎...
近期学习MongoDb 需要查看API,可是官方只能从浏览器查询,没有办法下载,并且程序安装包中也没有docs。让我很是纠结,该文件是我自己爬虫、打包并制作成CHM贡献给大家。
在本实例中,我们讨论的是针对Linux(尤其是RHEL62和CentOS)系统的MongoDB 3.0版本的安装包。 MongoDB 3.0是一个重要的版本更新,它引入了许多新特性,提升了性能和稳定性。首先,让我们来看看MongoDB 3.0的核心...
此资源在mogoDB官网下载,为2016年9月份最新版本,64位。 ...robomongo是作为mogoDB数据库的可视化工具,你可以理解成SQL,MYSQL,里面能用鼠标控制的操作。 该robomongo版本是0.9.0,能支持最新的mongo3.x,...
MongoDB 3.0引入了更强大的安全权限访问控制,以增强数据库的安全性。相比于之前的版本,这个新特性对用户管理进行了重大改进,确保只有经过身份验证和授权的用户才能执行特定的操作。以下是对MongoDB 3.0安全权限...
通过安装当前版本3.0.4的MongoDB,在hpess / chef映像上构建。 具有简单的副本集支持。用根据我们所有其他容器,一个简单的docker compose文件将使您轻松轻松地建立一个实例。 这将启动一个绑定到默认mongo端口的...
在本文中,我们将探讨如何使用Spring连接并操作MongoDB 3.0版本。 首先,我们需要在项目中引入相应的依赖。在Maven项目中,这通常通过在pom.xml文件中添加依赖来完成。在提供的内容中,我们可以看到以下关键依赖: ...
ansible-mongodb Ansible playbook 和用于配置简单 MongoDB(包括 MongoDB 3.0)的示例。 这对于想要深入了解 MongoDB(尤其是 3.0)并能够轻松(重新)创建环境的人们来说(目前)是很好的。要求Ansible (1.8.x) ...
Spring Data MongoDB API。 Spring Data MongoDB 开发文档。
它利用了 MongoDB 3.0 作为数据存储解决方案。MongoDB 是一个流行的开源、文档型数据库,支持 JSON 格式的文档存储,具有高度可扩展性和灵活性。版本 3.0 引入了重要的性能提升和新功能,如 WiredTiger 存储引擎,...
### Linux版MongoDB环境搭建详解 #### 一、前言 MongoDB 是一款非常流行的开源文档型数据库系统,因其灵活性和高性能而广泛应用于各种场景。本文档将详细介绍如何在Linux环境下搭建MongoDB运行环境,包括从创建...
MongoDB 是一个流行的开源、高性能、无模式的文档型数据库,广泛用于开发现代Web应用程序、大数据分析和存储。它的灵活性和可扩展性使其在许多领域成为关系型数据库的理想替代品。这里我们关注的是MongoDB的源码版本...