MongoDB 3.0 版本标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大、灵活而且易于管理的数据库管理系统。此版本在性能和伸缩性方面都有非常巨大的提升,通过在存储层的大幅改进实现。内建 WiredTiger存储引擎,这是一项难以置信的技术实现,提供无门闩、非堵塞算法来利用先进的硬件平台(如大容量芯片缓存和线程化架构)来提升性能。通过 WiredTiger ,MongoDB 3.0 实现了文档级别的并发控制,因此大幅提升了大并发下的写负载。透明的磁盘压缩技术减少对存储的容量要求达 80%。
此外 MongoDB 原先的存储引擎也得到了增强,包括集合级别并发控制以及更高效的日志,现在称为 MMAPv1。在生产环境中可以同时运行MMAPv1和WiredTiger两种存储引擎,这是因为 MongoDB 3.0 的可插入式存储引擎 API 所提供的灵活性,通过这个架构,MongoDB 提供了易用高级的应用开发、持久性和水平扩展性。同时 MongoDB 3.0还提供了企业Ops Manager 管理工具,用来管理大规模的 MongoDB 架构。
一、存储引擎WiredTiger
MongoDB 3.0的存储引擎是插件式的,默认为新增的WiredTiger。WiredTiger相比原来的MMAPv1引擎的优点:
1.文档级别的锁
这个改进真是盼望已久啊,一直以来MongoDB的锁粒度都被人诟病,根据我们实际的经验MongoDB在高并发的读写混合场景下性能很差。
2.更高的压缩比
新的MongoDB使用了前缀压缩(Prefix Compression),大大提高了索引数据的压缩比。简单的测试结果来看很客观:
3.写性能提高
官方的说是提高了7-10倍。
注意:WiredTiger只能用于64位的机器。
二、MMAPv1引擎的改进
虽然新增了WiredTiger,但是对原来的MMAPv1引擎也做了改进。
1.新的记录分配策略
MongoDB 3.0使用power of 2 allocation代替原来的动态记录分配,且弃用了paddingFactor。原来的分配策略在文档变大超过初始分配的大小的时候,MongoDB要分配一个新的记录,并要移动数据和更新索引,导致存储碎片。 power of 2 allocation的策略是分配的记录的大小都是2的次方(32, 64, 128, 256, 512 … 2MB),每个记录包括文档本身和额外的空间——padding,这个机制减少了文档增长的时候记录重新分配和数据移动的操作。显然新的策略在处理大文档和文档增长频繁的场景下效率更高,但如果只有插入操纵和所谓的in-place更新操作(不会增长文档大小)那么使用这种策略会很浪费空间,因此MongoDB 3.0允许你关闭这种策略。
2.集合级别的锁
虽然没有WiredTiger的锁粒度小,但是相比之前MMAPv1还是挺重要的一个改进。
三、Explain
新增Explain,类似MySQL的查询计划,做性能调优的时候很有用处。
四、查询API的改进
1.aggregate()新增$dateToString 操作符,支持将日志转换为指定的格式
2.查询新增 $eq 操作符支持相等判断
五、索引
后台创建索引时不会被dropDatabase,drop和dropIndexes操作中断。
六、工具
主要是mongodump和mongorestore功能的改进。
七、新的Java驱动
简单的看了下源码,原来的API仍然兼容,但重写了很多主要类(MongoCollection,MongoDatabase),新的MongoIterable接口风格很像Java8的Stream,而且都是泛型的。提供了异步的MongoClient,新的编码框架,提高了性能。
官网文档:
http://docs.mongodb.org/v3.0/
https://www.mongodb.org/downloads
学习文档:
Mongodb Manual阅读笔记:
http://www.cnblogs.com/Amaranthus/category/549300.html
MongoDB教程:
http://www.w3cschool.cc/mongodb/mongodb-tutorial.html