如何为MongoDB选择MMAPV1,WiredTiger或In-Memory StorageEngine?

时间:2016-06-23 07:40:05

标签: mongodb storage-engines

在MongoDb文档3.2中,我看到它们支持3个存储引擎, MMAPV1,WiredTiger,In-Memory,选择哪一个是非常令人困惑的。

我从描述中感受到WiredTiger优于MMAPV1,但在其他来源中他们说MMAPV1更适合重读...而WiredTiger适合重写... < / p>

是否有一些限制何时选择一个而不是另一个? 有人可以建议一些最佳实践,例如

当我有这种类型的应用程序通常是最好的,否则选择其他...

2 个答案:

答案 0 :(得分:35)

这是来自个人经验,但请看一下这篇博客文章,它解释了不同类型的引擎: Mongo Blog v3

Wired Tiger vs MMAPv1

  

比较MongoDB WiredTiger和MMAPv1存储引擎。高性能&amp;效率提高7倍至10倍,提高写入性能   MongoDB 3.0提供了更细粒度的文档级并发控制,为大多数写密集型应用程序提供了7倍到10倍的吞吐量,同时保持了可预测的低延迟。

对我来说选择非常简单,我需要文档级锁定,这使得 WiredTiger 成为理想的选择,我们没有企业版的mongo因此在内存引擎中不可用。 MMAPv1 Btree是将内存映射到硬盘并且效率不高的非常基本的技术。

  

MMAP存储引擎使用称为“记录分配”的进程来获取文件存储的磁盘空间。所有记录都连续地位于磁盘上,当文档变得大于分配的记录时,它必须分配新记录。新分配需要移动文档并更新引用文档的所有索引,这需要比就地更新花费更多时间并导致存储碎片。此外,MMAPv1在其当前的迭代中通常会导致文件系统的空间利用率过高,这是由于记录空间过度分配而且缺乏对压缩的支持。   如前所述,存储引擎的锁定方案是整体数据库性能中最重要的因素之一。 MMAPv1具有集合级锁定 - 这意味着一次只能使用一个插入,更新或删除操作集合。这种类型的锁定方案在并发工作负载中创建了一种非常常见的方案,其中更新/删除/插入操作始终等待它们前面的操作完成。此外,这些操作通常比存储引擎以串行方式完成流程更快。在上下文中,想象一下周日下午的一家大型超市,只有一条结账线开放:客户众多,但吞吐量低!

每个人都有不同的要求,但对于大多数情况来说,WiredTiger是理想的选择,它使文档级别的原子操作而不是收集级别具有很大的优势,你根本无法击败它。

更多读取而不是大量写入

如果您主要关注阅读,那么解决这个问题的方法就是一种方法。

您可以通过以下方式调整Mongo Driver Read Preference Modes

  1. 设置副本集,比如1个主人和3个辅助人员。
  2. 将写入问题设置为majority 写得慢一些(权衡)。
  3. 将读取偏好设置为辅助。
  4. 当您有大量读取时,此设置将执行得非常好,但由于权衡写入会更慢。但是,读取数据的吞吐量会很大。

    我希望如果您有其他问题将其添加为评论,我会尝试在此答案中解决此问题。

    此外,您可以查看MMAPv1 vs WiredTiger评论,并注意他是如何从MMAPv1改为WiredTiger的。卖家将文件锁定为您无法击败的表现。

      

    对于新项目,我现在使用WiredTiger。由于从压缩到未压缩的WiredTiger存储的迁移相当容易,因此我倾向于从压缩开始以提高CPU利用率(&#34;获得更多的收益&#34;)。如果压缩对性能或UX有显着影响,我将迁移到未压缩的WiredTiger。

    MongoDB数据库探查器

    确定数据库需求的最佳方法是使用MongoDB profiler设置测试群集并在其上运行应用程序 与大多数数据库分析器一样,MongoDB分析器可以配置为仅编写有关超过给定阈值的查询的配置文件信息。所以,一旦你知道慢查询,你就可以知道它是读取还是写入或cpu vs ram并从那里开始。

答案 1 :(得分:9)

您应该使用由内存和WiredTiger 存储引擎组成的副本集。您应该以这样的方式对MongoDB进行分片,以便内存存储引擎访问最常访问的数据,其余部分使用WiredTiger存储引擎。

在2014年收购WiredTiger后,MongoDB将此存储引擎作为default storage engine from version 3.2引入。此后,他们自己开始鼓励用户使用WiredTiger,因为它具有以下优于MMAPV1的优势:

  • WiredTiger使用文档级并发,而MMAPV1使用集合级锁定。这意味着多个用户可以使用WiredTiger同时写入集合,但不能使用MMAPV1。
  • 由于WiredTiger管理自己的内存,因此可以使用压缩,而MMPAV1则没有任何此类功能。
  • WiredTiger不允许任何就地更新。因此,最终它回收了不再使用的空间。

到目前为止,我发现只有MMPAV1优于WiredTiger的优点是:

  • Solaris平台上没有WiredTiger,而MMPAV1是。
  • 即使在仅使用单个元素更新大型文档时,WiredTiger也会重写整个文档,使其变慢。

因此,您可以在选择存储引擎时始终保留MMPAV1。现在让我们来看看内存存储引擎。从MongoDB Enterprise版本3.2.6开始,in-memory storage engine是64位版本中一般可用性(GA)的一部分。

与存储引擎相比,它具有以下优势:

  • 与WiredTiger类似,内存存储引擎也允许文档级并发。
  • 内存存储引擎比其他引擎快得多。
      

    通过避免磁盘I / O,内存存储引擎允许更可预测的数据库操作延迟。

但是这个存储引擎也有很多缺点:

  •   

    内存存储引擎在进程关闭后不会保留数据。

  • 如果您的数据集太大,那么内存引擎不是一个好选择。
      

    内存存储引擎要求其所有数据(包括oplog,如果mongod是副本集的一部分等)适合指定的--inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。

使用内存存储引擎检查MongoDB手册,例如Deployment Architectures