如何为MongoDB选择MMAPV1,WiredTiger或In 您所在的位置:网站首页 mongodb并发控制 如何为MongoDB选择MMAPV1,WiredTiger或In

如何为MongoDB选择MMAPV1,WiredTiger或In

2023-03-12 19:50| 来源: 网络整理| 查看: 265

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

我从描述中感受到了WiredTiger更好MMAPV1,但在其他来源中他们说MMAPV1更适合重读...而WiredTiger适合重写...

是否有一些限制何时选择一个而不是另一个?例如,有人可以提出一些最佳做法

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

1> Tim..:

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

有线老虎vs MMAPv1

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

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

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

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

更多的读取而不是大量的写​​入

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

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

设置副本集,说1个主人和3个辅助人员.

将写入关注设置为多数,这会使写入速度变慢(权衡).

将读取首选项设置为辅助.

当您有大量读取时,此设置将执行得非常好,但作为权衡写入会更慢.但是,读取数据的吞吐量会很大.

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

您还可以查看MMAPv1与WiredTiger的评论,并注意他是如何将自己的想法从MMAPv1改为WiredTiger的.卖家是文件锁定,你无法击败的表现.

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

MongoDB数据库探查器

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

@AlexandruOlaru我们运行多个mongoDB集群,而WiredTiger比MMAPv1更适合引擎,所以我的回答是肯定的,几乎总是

2> Arka Ghosh..:

您应该使用由内存和WiredTiger存储引擎组成的副本集.你应该对内存存储引擎应该访问最常访问的数据并使用WiredTiger存储引擎进行分片.

在2014年收购WiredTiger之后,MongoDB将此存储引擎作为3.2版的默认存储引擎引入.此后,他们自己开始鼓励用户使用WiredTiger,因为它具有以下优于MMAPV1的优势:

WiredTiger使用文档级并发,而MMAPV1使用集合级锁定.这意味着多个用户可以使用WiredTiger同时写入集合,但不能使用MMAPV1.

由于WiredTiger管理自己的内存,它可以使用压缩,而MMPAV1没有任何这样的功能.

WiredTiger不允许任何就地更新.因此,最终它回收了不再使用的空间.

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

Solaris平台上不提供WiredTiger,而MMPAV1则不可用.

即使在仅使用单个元素更新大文档时,WiredTiger也会重写整个文档,使其变慢.

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

它比存储引擎具有以下优点:

与WiredTiger类似,内存存储引擎也允许文档级并发.

内存存储引擎比其他引擎快得多.

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

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

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

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

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

查看MongoDB手册,了解使用内存存储引擎的Deployment Architectures示例.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有