如何为MongoDB选择MMAPV1,WiredTiger或In | 您所在的位置:网站首页 › mongodb并发控制 › 如何为MongoDB选择MMAPV1,WiredTiger或In |
在MongoDb文档3.2中,我看到它们支持3个存储引擎,MMAPV1,WiredTiger,In-Memory,这是一个非常令人困惑的选择. 我从描述中感受到了WiredTiger更好MMAPV1,但在其他来源中他们说MMAPV1更适合重读...而WiredTiger适合重写... 是否有一些限制何时选择一个而不是另一个?例如,有人可以提出一些最佳做法 当我有这种类型的应用程序通常是最好的,否则选择其他... 1> Tim..: 这是来自个人经验,但请看一下这篇博客文章,它解释了不同类型的引擎: Mongo Blog v3 比较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 实验室设备网 版权所有 |