在MongoDb文档3.2中,我看到它们支持3个存储引擎, MMAPV1,WiredTiger,In-Memory,选择哪一个是非常令人困惑的。
我从描述中感受到WiredTiger
优于MMAPV1
,但在其他来源中他们说MMAPV1更适合重读...而WiredTiger适合重写... < / p>
是否有一些限制何时选择一个而不是另一个? 有人可以建议一些最佳实践,例如
当我有这种类型的应用程序通常是最好的,否则选择其他...
答案 0 :(得分:35)
这是来自个人经验,但请看一下这篇博客文章,它解释了不同类型的引擎: Mongo Blog v3
比较MongoDB WiredTiger和MMAPv1存储引擎。高性能&amp;效率提高7倍至10倍,提高写入性能 MongoDB 3.0提供了更细粒度的文档级并发控制,为大多数写密集型应用程序提供了7倍到10倍的吞吐量,同时保持了可预测的低延迟。
对我来说选择非常简单,我需要文档级锁定,这使得 WiredTiger 成为理想的选择,我们没有企业版的mongo因此在内存引擎中不可用。 MMAPv1 Btree是将内存映射到硬盘并且效率不高的非常基本的技术。
MMAP存储引擎使用称为“记录分配”的进程来获取文件存储的磁盘空间。所有记录都连续地位于磁盘上,当文档变得大于分配的记录时,它必须分配新记录。新分配需要移动文档并更新引用文档的所有索引,这需要比就地更新花费更多时间并导致存储碎片。此外,MMAPv1在其当前的迭代中通常会导致文件系统的空间利用率过高,这是由于记录空间过度分配而且缺乏对压缩的支持。 如前所述,存储引擎的锁定方案是整体数据库性能中最重要的因素之一。 MMAPv1具有集合级锁定 - 这意味着一次只能使用一个插入,更新或删除操作集合。这种类型的锁定方案在并发工作负载中创建了一种非常常见的方案,其中更新/删除/插入操作始终等待它们前面的操作完成。此外,这些操作通常比存储引擎以串行方式完成流程更快。在上下文中,想象一下周日下午的一家大型超市,只有一条结账线开放:客户众多,但吞吐量低!
每个人都有不同的要求,但对于大多数情况来说,WiredTiger是理想的选择,它使文档级别的原子操作而不是收集级别具有很大的优势,你根本无法击败它。
更多读取而不是大量写入
如果您主要关注阅读,那么解决这个问题的方法就是一种方法。
您可以通过以下方式调整Mongo Driver Read Preference Modes:
当您有大量读取时,此设置将执行得非常好,但由于权衡写入会更慢。但是,读取数据的吞吐量会很大。
我希望如果您有其他问题将其添加为评论,我会尝试在此答案中解决此问题。
此外,您可以查看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的优势:
到目前为止,我发现只有MMPAV1优于WiredTiger的优点是:
因此,您可以在选择存储引擎时始终保留MMPAV1。现在让我们来看看内存存储引擎。从MongoDB Enterprise版本3.2.6开始,in-memory storage engine是64位版本中一般可用性(GA)的一部分。
与存储引擎相比,它具有以下优势:
通过避免磁盘I / O,内存存储引擎允许更可预测的数据库操作延迟。
但是这个存储引擎也有很多缺点:
内存存储引擎在进程关闭后不会保留数据。
内存存储引擎要求其所有数据(包括oplog,如果mongod是副本集的一部分等)适合指定的--inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。
使用内存存储引擎检查MongoDB手册,例如Deployment Architectures。