MongoDB 3.0 新增特性一览

引言

在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoDB3.0于2015年3月3日正式发布。可以毫不夸张的说,该版本的新增特性标志着MongoDB这款典型的NoSQL数据库已经进入了一个全新的发展阶段。本文以下内容会逐个盘点3.0版本的新增特性。

 

插件式存储引擎API

MongoDB3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MySQL的设计理念。目前除了早期的MMAP存储引擎外,WiredTiger和RocksDB均已完成了对MongoDB的支持,前者更是在被MongoDB公司收购后更是直接引入到了MongoDB3.0版本中。插件式存储引擎API的引入为MongoDB丰富自己武器库以处理更多不同类型的业务提供了无限可能,内存存储引擎、事务存储引擎甚至Hadoop在未来都有可能接入进来。

clip_image002

 

WiredTiger存储引擎

如果说插件式存储引擎API为MongoDB3.0打造了一个武器库,那么WiredTiger绝对是武器库中第一枚也是最重要的一枚重磅炸弹。因为MMAP存储引擎自身的天然缺陷(耗费磁盘空间和内存空间且难以清理,库级别锁),MongoDB为数据库运维人员带来了极大痛苦,甚至一部分人已经开始转向TokuMX,尽管后者目前也不甚稳定。意识到这一问题的MongoDB,做出了有钱任性的决定,直接收购存储引擎厂商WiredTiger,将WiredTiger存储引擎集成进3.0版本(仅在64位版本中提供)。那么这款走到聚光灯下的存储引擎究竟具备哪些值得期待的特性呢?

 

1、文档级别并发控制

WiredTiger通过MVCC实现文档级别的并发控制,即文档级别锁。这就允许多个客户端请求同时更新一个集合内存的多个文档,再也不需要在排队等待库级别的写锁。这在提升数据库读写性能的同时,大大提高了系统的并发处理能力。关于这一点的效果从监控工具mongostat就可以直接体现出来,旧版本的监控指标会有lockeddb这一项(该项指标过高是mongo使用人员的一大痛点啊),而新版的mongostat已经看不到了。

clip_image004

 

MongoDB 2.4.12版本

1
$/home/mongodb/mongodb-linux-x86_64-2.4.12/bin/mongostat –port55060
1
2
3
4
insert query update delete getmore command flushes mapped vsize resfaults locked db idxmiss % qr|qw ar|aw netIn netOut conntime
*0 *0 *0 *0 0 1|0 0 18g 18.3g 16.1g 0 ycsb:0.0% 0 0|00|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|00|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|00|0 62b 2k 1 13:04:03

 

MongoDB 3.0 rc8版本

1
$/home/mongodb/mongodb-linux-x86_64-3.0.0-rc8/bin/mongostat –port55050
1
2
3
4
insert query update delete getmore command % dirty % used flushesvsize res qr|qw ar|aw netIn netOut conntime
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 113:02:38
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 113:02:39
*0 *0 *0 *0 0 1|0 0.0 42.2 0 30.6G 30.4G 0|0 0|0 79b 16k 113:02:40

 

2、磁盘数据压缩

WiredTiger支持对所有集合和索引进行Block压缩和前缀压缩(如果数据库启用了journal,journal文件一样会压缩),已支持的压缩选项包括:不压缩、Snappy压缩和Zlib压缩。这为广大Mongo使用者们带来了又一福音,因为很多Mongo数据库都是因为MMAP存储引擎消耗了过多的磁盘空间而不得已进行扩容。其中Snappy压缩为数据库的默认压缩方式,用户可以根据业务需求选择适合的压缩方式。理论上来说,Snappy压缩速度快,压缩率OK,而Zlib压缩率高,CPU消耗多且速度稍慢。当然,只要选择使用压缩,Mongo肯定会占用更多的CPU使用率,但是考虑到Mongo本身并不是十分耗CPU,所以启用压缩完全是值得的。

clip_image006

clip_image008

 

此外,WiredTiger存储方式上也有很大改进。旧版本Mongo在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以即使删掉了某个集合或者索引,占用的磁盘空间也很难及时自动回收。WiredTiger在集合和索引级别分配文件,数据库中的所有集合和索引均存储在单独的文件中,集合或者索引删除后,对应的存储文件随即删除。当然,因为存储方式不同,低版本的数据库无法直接升级到WiredTiger存储引擎,只能通过导出导入数据的方式来实现。

 

MongoDB 2.4.12版本

1
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_2_4_12]$ll
1
2
3
4
drwxrwxr-x 3 mongodb mongodb 4096 2月 25 19:03local
-rwxrwxr-x 1 mongodb mongodb 6 2月 25 19:04mongod.lock
drwxrwxr-x 2 mongodb mongodb 4096 2月 27 18:30_tmp
drwxrwxr-x 3 mongodb mongodb 4096 2月 27 18:39ycsb
1
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_2_4_12]$ ll ycsb/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
drwxrwxr-x 2 mongodb mongodb 4096 2月 27 18:39_tmp
-rw——- 1 mongodb mongodb 67108864 2月 27 18:57ycsb.0
-rw——- 1 mongodb mongodb 134217728 2月 27 18:57ycsb.1
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.10
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.11
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.12
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:39ycsb.13
-rw——- 1 mongodb mongodb 268435456 2月 27 18:57ycsb.2
-rw——- 1 mongodb mongodb 536870912 2月 27 18:57ycsb.3
-rw——- 1 mongodb mongodb 1073741824 2月 27 18:57ycsb.4
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.5
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.6
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.7
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.8
-rw——- 1 mongodb mongodb 2146435072 2月 27 18:57ycsb.9
-rw——- 1 mongodb mongodb 16777216 2月 27 18:40ycsb.ns

 

Mongo 3.0 rc8版本

1
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_3_0_0]$ll
1
2
3
4
5
6
7
8
9
10
11
drwxrwxr-x 2 mongodb mongodb 4096 2月 28 18:32local
-rw-rw-r– 1 mongodb mongodb 36864 3月 21 13:41_mdb_catalog.wt
-rwxrwxr-x 1 mongodb mongodb 6 2月 28 18:32mongod.lock
-rw-rw-r– 1 mongodb mongodb 36864 3月 21 13:42sizeStorer.wt
-rw-rw-r– 1 mongodb mongodb 95 2月 28 18:32storage.bson
-rw-rw-r– 1 mongodb mongodb 49 2月 28 18:32WiredTiger
-rw-rw-r– 1 mongodb mongodb 433 2月 28 18:32WiredTiger.basecfg
-rw-rw-r– 1 mongodb mongodb 21 2月 28 18:32WiredTiger.lock
-rw-rw-r– 1 mongodb mongodb 921 3月 21 13:41WiredTiger.turtle
-rw-rw-r– 1 mongodb mongodb 53248 3月 21 13:41WiredTiger.wt
drwxrwxr-x 2 mongodb mongodb 4096 3月 21 13:41ycsb
1
[mongodb@mongo-data-emergency-001.m6.momo.com mongodb_3_0_0]$ ll ycsb/
1
2
3
4
5
-rw-rw-r– 1 mongodb mongodb 19314257920 2月 2819:16 collection-4–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 602112 3月 2113:40 collection-6–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 262598656 2月 2818:53 index-5–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 827392 3月 2113:40 index-7–1318477584648278106.wt
-rw-rw-r– 1 mongodb mongodb 1085440 3月 2113:41 index-8–1318477584648278106.wt

 

3、可配置内存使用上限

WiredTiger支持内存使用容量配置,用户通过storage.wiredTiger.engineConfig.cacheSizeGB参数即可控制MongoDB所能使用的最大内存,该参数默认值为物理内存大小的一半。这也为广大Mongo使用者们带来了又一福音,MMAP存储引擎消耗内存是出了名的,只要数据量够大,简直就是有多少用多少。

 

MMAPv1存储引擎提升

MongoDB3.0出了引入WiredTiger外,对于原有的存储引擎MMAP也进行了一定的完善,该存储引擎依然是3.0版的默认存储引擎。遗憾的是改进后的MMAP存储引擎依旧在数据库级别分配文件,数据库中的所有集合和索引都混合存储在数据库文件中,所以磁盘空间无法及时自动回收的问题如故。

 

1、锁粒度由库级别锁提升为集合级别锁

这在一定程度上也能够提升数据库的并发处理能力。

 

2、文档空间分配方式改变

在MMAP存储引擎中,文档按照写入顺序排列存储。如果文档更新后长度变长且原有存储位置后面没有足够的空间放下增长部分的数据,那么文档就要移动到文件中的其他位置。这种因更新导致的文档位置移动会严重降低写性能,因为一旦文档发生移动,集合中的所有索引都要同步修改文档新的存储位置。

 

MMAP存储引擎为了减少这种情况的发生提供了两种文档空间分配方式:基于paddingFactor(填充因子)的自适应分配方式和基于usePowerOf2Sizes的预分配方式,其中前者为默认方式。第一种方式会基于每个集合中文档更新历史计算文档更新的平均增长长度,然后在新文档插入或旧文档移动时填充一部分空间,如当前集合paddingFactor的值为1.5,那么一个大小为200字节的文档插入时就会自动在文档后填充100个字节的空间。第二种方式则不考虑更新历史,直接为文档分配2的N次方大小的存储空间,如一个大小同样为200字节的文档插入时直接分配256个字节的空间。

 

MongoDB3.0版本中的MMAPv1抛弃了基于paddingFactor的自适应分配方式,因为这种方式看起来很智能,但是因为一个集合中的文档的大小不一,所以经过填充后的空间大小也不一样。如果集合上的更新操作很多,那么因为记录移动后导致的空闲空间会因为大小不一而难以重用。目前基于usePowerOf2Sizes的预分配方式成为默认的文档空间分配方式,这种分配方式因为分配和回收的空间大小都是2的N次方(当大小超过2MB时则变为2MB的倍数增长),因此更容易维护和利用。如果某个集合上只有insert或者in-placeupdate,那么用户可以通过为该集合设置noPadding标志位,关闭空间预分配。

clip_image010

 

复制集改进

 

1、复制集成员增长

MongoDB3.0的复制集成员的最大个数由之前的12个增长为50个,但能够投票的最大成员个数依然为7个,而相应的getLastError中的 w:“majority” 项也仅代表投票节点的大多数。

 

2、Primary节点StepDown处理方式变化

在复制集中通过replSetStepDown命令可以使得当前的Primary节点退位,重新选举新的Primay节点。MongoDB3.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实例在执行读操作时不再将连接固定在复制集成员上,而是对每个读操作都会重新评估ReadPreference。这样当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。总体来看,MongoDB3.0提供了较多令人惊喜的新特性,也使人们更加看好其未来的发展。

 

参考资料链接

 

MongoDB3.0官方Release-Notes:http://docs.mongodb.org/manual/release-notes/3.0/

北京Mongo用户组第二次线下活动PPT:http://www.mongoing.com/archives/543

http://blog.chinaunix.net/xmlrpc.php?r=blog/article&id=4865696&uid=15795819














本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1737684,如需转载请自行联系原作者





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淘宝网的技术发展史(一)——个人网站时代

《天下网商经理人》十月刊开始将连载系列文章《淘宝网的技术发展史》,为读者描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果。 文/淘宝技术大学培训专家 子柳 前言 11月11日,这个棍子最多的日子被网民自我调侃变成了一个…

使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

为什么 Docker 和 Kubernetes 是用 Go 写的而不是 C# ?

这是 Reddit 平台上面这几天一篇比较热门的帖子, 非常有意思,本文我列出了几个高赞的回答。👦 HahahahahaSoFunny为什么 Docker 和 Kubernetes 工具是用 Go 写的而不是 C#?总所周知,现在开发人员使用的很多新工具大多是用 Go 写的…

打造最舒适的webview调试环境

你在做移动web开发的时候是不是只是在Chrome下开启移动模式,然后就啪啪啪闷头敲代码了?如果你平时只是做做宣传页,Chrome的移动模式可能就能满足你。但是现在越来越多的应用采用Hybrid的开发方式,这样的话就可能在web页面上调用we…

淘宝网的技术发展史(二) ——Oracle替换MySQL

本文是《淘宝网的技术发展史》系列连载文的第二篇,在告别个人网站时代后,淘宝网的技术发展迎来了由Oracle开启的第二个时代。文/淘宝技术大学培训专家 子柳MySQL撑不住了 淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了&#xf…

Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)

1 、问题 有时候我们启动APP的时候,APP奔溃,在android studio里面日志可能冲掉,或者是云平台的手机安装的app,根本就没有android stduio,那我们用什么办法快速知道启动奔溃日志呢? 2、解决办法 我们先需要…

一个基础的 HTML 文档有哪些标签?(3)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

能上架App的GooglePlay开发者账号获取流程

googleplay 开发者账号申请流程 接到公司号召,要让我们的app走向世界,上架GooglePlay,都说天朝的Android 程序员是折翼的天使,猛然发现写了做么多年的Android,竟然不知道怎么成为GooglePlay开发者。 以前尝试过&#x…

如何让 ASP.NET Core 支持绑定查询字符串中的数组(2)

前言上回说到,我们实现了IntArrayModelBinder,可以让 ASP.NET Core 绑定查询字符串中的数组。但是必须显示指定ModelBinder:public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values)而官方提供的…

淘宝网的技术发展史(三)——分布式时代

本文是《淘宝网的技术发展史》系列连载文的第三篇。在系统发展的过程中,架构师的眼光至关重要,作为程序员,把功能实现即可;但作为架构师,要考虑系统的扩展性、复用性,这种敏锐的感觉,有人说是一…

你知道出现“乱码”的原因是什么吗?(4)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

Android应用程序线程消息循环模型分析(4)

接下来我们再看看应用程序的配置文件AndroidManifest.xml&#xff1a;<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"shy.luo.counter" andr…

GIS专业核心课程电子教材配套实验数据汇总(持续更新)

本文整合了GIS专业核心课程电子pdf教材,包括地理信息系统、地图学、遥感、摄影测量、遥感数字图像处理、工程测量、施工测量、GPS、数字测图、空间数据库、程序设计等,持续更新。 一、ArcGIS10实验教程(配套实验数据) 二、地理信息系统

7月18日实习日志

今天的上午的工作和昨天一样&#xff0c;上午转发了三十篇&#xff0c;基本上没有遇到什么问题。下午还是转载视频和发稿。 转载于:https://www.cnblogs.com/a1107/p/5706351.html

我抓到bit哥了,嘿嘿嘿(5)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

遥感、地理空间数据、全国基础数据下载网站大全汇总

本文收集整理了国内外常用的遥感、GNSS、地理空间数据下载网站,可以下载各种格式的矢量、栅格等数据,主要包括遥感影像、NDVI、太阳辐射、数字高程模型等各种地理空间数据,供GISer学习交流使用。 1. 地理空间数据云 该网站为国内学者使用最多的、数据下载方便的网站,可以…

RPA之基于FlaUI的微信发送消息给某人

本文由网友蓝创精英团队投稿&#xff0c;欢迎转载、分享原文作者&#xff1a;蓝创精英团队原文链接&#xff1a;https://kesshei.blog.csdn.net/article/details/124955177目的一直想实现微信的群发功能&#xff0c;但是&#xff0c;没有实现&#xff0c;原因有一条是怕违法&am…

感受机房管理化繁为简-新款KVM使用心得

感受机房管理化繁为简-新款KVM使用心得 一、 背景 随着网络应用的不断增多&#xff0c;各地机房服务器数量也随之增加&#xff0c;利用多传统主机切换器的方式已经无法满足目前这种区域广、设备多人员紧缺的现状&#xff0c;而且即使是使用了一些远程管理软件&#xff0c;实现的…

我化身保姆为你提供 html 教学服务(6)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?

那一年&#xff0c;我考入了西北师范大学&#xff0c;录取专业为地理信息系统&#xff0c;也就是常说的GIS&#xff0c;本科毕业后又考取了GIS专业的研究生&#xff0c;顺利毕业&#xff0c;进入了高校从事GIS教育工作。作为一个GISer&#xff0c;我相信有很多人跟我一样很迷茫…