本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy 和 Aayushi Mangal。主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。文章由腾讯云数据库团队翻译整理,全文约2050字,阅读需要5分钟。


在这篇文章中,我们将了解到MongoDB中MMAP和WiredTiger引擎之间的差异。很多客户都咨询过这两个引擎的问题,这篇文章将为你们解决难题。我们将告诉您这些引擎的主要特性,您可以根据自己的需求选择合适的引擎。

在MongoDB中,主要使用的是MMAPV1和WiredTiger引擎。当然,我们也可以使用其他引擎,如使用Percona Server for MongoDB(PSMDB)的rocksdb,以及使用MongoDB Enterprise版本的内存引擎。

MongoDB刚发布时,MMAPV1是默认引擎,它至今仍然是MongoDB发行版本的引擎。但根据MongoDB的计划,4.2版本之后将不再有MMAP。那些使用1.8版本的老哥用户可能会怀念MMAP。MongoDB收购了wiredTiger Inc(见https://www.mongodb.com/press/wired-tiger),从版本3.2开始,它成为MongoDB的默认引擎。WiredTiger引擎启用了多文档事务的引入,主要用于压缩和文档级锁定等功能。在这里,我们将看到wiredTiger和MMAPV1的主要功能,并将它们总结在文末的表格中。

存储引擎

MongoDB存储引擎用于管理内存和磁盘上的BSON数据,以支持读写操作。

MMAPV1:这是MongoDB的原始存储引擎,在第一个版本中被引入,但从版本4.0开始,它已被弃用

WiredTiger:这是MongoDB在3.0版本中引入的可插拔引擎,它成为3.2版本的默认存储引擎

数据压缩

MMAPV1:不支持数据压缩,它基于内存映射文件。所以当你可以将你的写集保存在内存中时它会很好用。它擅长处理大容量写入,读取和就地更新的工作场景。

WiredTiger:支持snappy和zlib压缩。因此,与MMAP相比,带有WiredTiger的MongoDB占用的空间非常小。它有自己的写缓存和文件系统缓存。

Snappy:这是默认算法,合理压缩的高效计算。具体算法参见here.

Zlib:以CPU为代价提高压缩率。具体算法参见 here.

数据目录

让我们看一下支持每个引擎的相同数据和副本集成员的文件系统。

日志

MMAPV1:确保写入是原子的。 如果MongoDB在提交对数据文件的更改之前发生故障或终止,MongoDB可以使用日志文件将写操作应用于数据文件并保持一致状态。

WiredTiger:它使用写入之间的检查点,并且日志将持续检查点之间的所有数据修改。 因此,对于从数据库崩溃或突然终止的任何恢复,它使用自上一个检查点以来的日记条目。 在大多数情况下,此引擎不需要日志,只有在需要确保恢复到日志崩溃之前的最后一次成功写入之前,才启用日志。 否则,通常MongoDB可以从最后一个有效检查点恢复。 默认情况下,检查点每分钟发生一次。

日志目录

锁和并发

MMAPV1:版本2.6之前:使用读写锁锁定,允许对数据库进行并发读取访问,但允许对单个写入操作进行独占访问。 当存在读锁时,许多读操作可能使用此锁。 但是,当存在写锁定时,单个写入操作将独占地保持锁定,并且没有其他读取或写入操作可以共享锁定。

从3.0开始:MMAPv1存储引擎在3.0版本系列中使用了集合级别锁定,这是对早期版本的改进,其中数据库锁定是最精细的锁定。

WiredTiger:支持文档级锁定。 对于大多数读写操作,WiredTiger使用乐观并发控制。 WiredTiger仅在全局,数据库和集合级别使用意图锁。

例如:从集合“testData”中删除值为{x:1}的文档,将在集合级别为每个存储引擎获取不同的写入“LOCK”。

内存使用

MMAPv1:MongoDB自动使用计算机上的所有可用内存作为缓存。 系统资源监视器显示MongoDB使用大量内存,但其使用是动态的。 如果另一个进程突然需要服务器RAM的一半,MongoDB也会为该进程分配出缓存。搜索关注腾讯云数据库官方微信,立得10元腾讯云无门槛代金券,体验移动端一键管理数据库,学习更多数据库技术干货。

从技术上讲,操作系统的虚拟内存子系统管理着MongoDB的内存使用。 这意味着MongoDB将尽可能多地使用可用内存,并根据需要交换到磁盘。 具有足够大的内存来适应RAM中的应用程序工作数据集的部署将实现最佳性能。

WiredTiger:使用wiredTiger,MongoDB同时使用WiredTiger内部缓存和文件系统缓存。 通过文件系统缓存,MongoDB自动使用未被使用的所有空闲内存。 从3.4开始,WiredTiger内部缓存默认设置为以下两者中较大的一个:

  • 50% of (RAM – 1 GB), or
  • 256 MB.

总结 MMAPV1 vs WiredTiger

以下是对两个引擎差异总结,可以通过表格进行快速查询。

以上信息并没有包含MongoDB中两个引擎的所有差异对比,如果您有补充的,欢迎在评论中发言和讨论。

往期推荐

《磊哥测评:自建数据库VS云数据库,到底怎么选?》

《云测评:RedisGraph 1.0的基准测试》

《磊哥测评之MongoDB篇》

《如何利用MongoDB打造TOP榜小程序》

《云MongoDB优化使LBS服务性能提升10倍》

羊毛速薅

腾讯云数据库新春采购秒杀低至2.8折,09:00, 11:00, 14:00, 16:00, 19:00每天五场秒杀嗨购新春!点阅读原文即可进入会场,记得定好闹钟抢购哦~

↓↓点这儿抄底价

好文和朋友一起看!

var first_sceen__time = (+new Date());if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } (function(){ if (navigator.userAgent.indexOf("WindowsWechat") != -1){ var link = document.createElement('link'); var head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = "//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx45ba31.css"; head.appendChild(link); } })();

[图片]

Aayushi Mangal

赞赏

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

阅读原文

阅读

分享 在看

已同步到看一看

[取消](javascript:😉 [发送](javascript:😉

[我知道了](javascript:😉

朋友会在“发现-看一看”看到你“在看”的内容

确定

已同步到看一看[写下你的想法](javascript:😉

最多200字,当前共字 发送

已发送

朋友将在看一看看到

确定

写下你的想法...

取消

发布到看一看

确定

最多200字,当前共字

发送中

[图片]

微信扫一扫
关注该公众号

[图片]

微信扫一扫
使用小程序

即将打开""小程序

[取消](javascript:void(0%29;) [打开](javascript:void(0%29;)

文章来源于腾讯云开发者社区,点击查看原文