云测评-MongoDB存储引擎谁更强

导读:本文作者是来自Percona的支持工程师 Vinodh Krishnaswamy Aayushi Mangal。这篇文章主要介绍了MongoDB中两个引擎之间的差异,并在文章结尾处给出了表格对比总结。全文约2050字,阅读需要5分钟。

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

在MongoDB中,主要使用的是MMAPV1和WiredTiger引擎。当然,我们也可以使用其他引擎,如使用Percona Server for MongoDB(PSMDB)的rocks db,以及使用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也会为该进程分配出缓存。

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

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

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

总结 MMAPV1 vs WiredTiger

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

关键特性

MMAPV1

wiredTiger

引入/设为默认引擎 版本号

从最初版本开始引入,作为默认引擎直到3.0版本。在4.0中已弃用,将来将被删除。

从3.0版本开始引入,并从3.2版本作为默认引擎。

数据压缩

不支持

使用默认的snappy和zlib算法进行数据压缩。所以比MMAPV1引擎占用的空间更小

日志

MongoDB首先将内存中的更改写入磁盘日志文件。如果在将更改提交到数据文件之前MongoDB发生故障/终止,MongoDB可以使用日志文件将写入操作应用于数据文件并保持一致状态。

WiredTiger日志会在检查点之间保留所有数据修改。如果MongoDB在检查点之间退出,它将使用日志重播自上一个检查点以来修改的所有数据。

锁和并发

2.6版本之前,MongoDB使用读写锁锁定,允许对数据库进行并发读取访问,但对单个写入操作进行独占访问。从3.0开始,使用集合级锁定

支持文档级锁定

事务

对单个文档的操作是原子的

4.0版本开始支持多文档事务

CPU性能

添加CPU核数并不能提高性能

多核系统性能有明显提升

加密

不支持

MongoDB企业版可以使用静态加密,PSMDB 3.6.8中可以使用BETA版

内存策略

自动使用机器上的所有可用内存作为其缓存使用

内部缓存和文件系统缓存两种机制

更新操作

它擅长具有高容量写入、读取和就地更新的场景

不支持就地更新,这会导致整个文档重写

可配置性

较低

允许通过不同的变量使用此引擎进行更多调整。 如:缓存大小,读/写票据,检查点间隔等

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券