本次分享由MongoDB大中华区技术顾问分享。“
老人家
”上来就问Mongo是什么意思,猜中有奖,还号称自己是最牛的MongoDB专家(在风筝冲浪圈子里…大家都懂的)。相信大家都不知道,容易理解为芒果(英文应该是mango)。实际上mongo是由这个英文hu
mongo
u
s演变来的,表示“巨大的”的意思。
本次分享主要是介绍了MongoDB的3.0版本,对其性能提升进行内幕解密。
首先介绍了MongoDB的主要功能:
(1)自动复制高可用
MongoDB有3中配置方式:单机、主从和复制集(replicat),复制集可以实现数据读写分离,并保持数据库集群自动复制实现自动容灾和高可用性。
(2)二级索引、动态查询
MongoDB二级索引是用B
树(B-tree)实现的,B树索引其实就是大多数关系型数据库的默认索引。
动态查询:MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌对象和多维数组。
(3)聚合框架、MapReduce
MongoDB的聚合框架,就是把一系列特殊操作符作用于一个集合,可以替代MapReduce,并用于一般的聚合操作。
(4)企业级安全
(5)地理空间索引
关于LBS相关项目,一般会存储每个地点的经纬度的坐标,如果要查询附近的场所,则需要建立索引来提升查询效率,MongoDB专门针对这种查询建立了地理空间索引。
(6)GridFS,MongoDB文件存储系统
MongoDB的GridFS功能,性能没有传统的文件系统高,建议使用文件系统来存储文件,再用MongoDB来存储该文件的元数据。
(7)自动分片、水平扩展
自动分片功能支持水平的数据库集群,可以动态添加额外的机器。
(8)文档模型
将一个对象信息用一个文档存储起来的模型。我想这也是为啥MongoDB不能使用join联表查询的原因吧~
MongoDB 2.8
(
2.8版本
直接跳到3.0版本。
为什么将2.8命名为3.0?唐建法表示2.8有了极大的增强,用2.8有点委屈,因此MongoDB市场部主导命名为3.0。
)
版本开始引入支持Latch-free、Non-blocking算法的WiredTiger储存引擎MMAP。所以在使用之前必须加上
wiredtiger参数。
MongoDB3.0提升:
(1)写性能:7x-10x,提升了7到10倍写速度
(2)数据压缩:30%-80%,是原有数据的30%-80%
(3)运维:95%,运维成本减少95%,主要集中在集群
听说是:因为有了WiredTiger存储引擎,MongoDB3.0才能有文档级别的并行控制,即使处理频繁写入任务,数据库依然能维持效能一定的稳定度和可预测性。
这次3.0的发布,MongoDB官方也同步发布了一份性能测试报告,这绝对是MongoDB有史以来第一份官方测试报告。
并发量:
在YCSB(NoSQL测压工具)测试中,MongoDB3.0在多线程、批量插入场景下较之于MongoDB2.6有大约7倍的增长。第二次测试比较了两个系统上 95%读取和5%更新的场景。可以看到WiredTiger 有4倍多的吞吐量。相比于纯插入场景,这次的性能提升没有那么显著,因为写操作只占所有操作的5%。最后,对于读写操作平衡的场景,可以看到 MongoDB3.0有6倍的并发率。这比刚才看到的95%读 的4倍提高要好一些,因为这里有更多的写操作。
响应时长:
他们通过读密集型的工作负荷来比较更新响应延迟的95th和99th百分位数 。在MongoDB3.0中更新延时显著改善了,在95th和99th百分位数中几乎减少了90%。
MongoDB2.6和3.0各自的文档级别并发控制实现:
2.6版本使用悲观锁,即库级锁(实际上并不是我们理解的Lock,用Lock来形容感觉太大太重的,2.6版本的库级锁应该理解成latch,即在修改数据时,会加上的一个轻量的行锁),而3.0使用了乐观锁(MVCC):何为悲观锁,乐观锁?
悲观锁:悲观锁假定其他用户企图访问或者修改你正在访问或者修改的对象的概率是很高的。因此在悲观锁的环境里,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后,才释放锁。
所以悲观锁加锁的时间会比较长,这样可能就会长时间的限制其他用户的访问,也就是说,悲观锁的并发访问性能不好。所以2.6版本在性能上不去也就是这样原因。
2.6中采用的是库级锁,读操作和写操作为互斥操作,大大影响了数据库的整体性能。
3.0版本采用了乐观锁:
乐观锁:乐观锁则认为其他用户企图改变你正在修改的对象的几率是非常小的。因此乐观锁直到你准备提交所作的更改时才将对象锁住。
可见乐观锁加锁的时间要比悲观锁短,乐观锁可以利用较大的锁粒度获得较好的并发访问性能。这也是3.0读写性能提升并且实现高并发控制的原因之一。
当然也有需要注意的:
(1)没有32位支持
(2)和2.6数据文件不兼容
(3)Journal默认不会及时书刷盘,系统宕机的话,会丢失最多100MB Jouranl数据
(4)Stall现象还会存在 - 特别是IO资源不够的情况下
(5)Windows上性能指标不如Linux
最后提供MongoDB社区教程:
中文社区:http://www.mongoing.com
在线教程:http://university.mongodb.com