AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 121160
Accepted
Buzut
Buzut
Asked: 2015-11-16 10:52:35 +0800 CST2015-11-16 10:52:35 +0800 CST 2015-11-16 10:52:35 +0800 CST

MongoDB MMAPv1 vs WiredTiger 存储引擎

  • 772

在 mongoDB3 中出现了一个新的存储引擎:WiredTiger。然而,MMAPv1仍然是 Mongo 的默认选择。

一个可能并不比另一个更好,这通常是用例和为工作​​选择正确工具的问题。但是哪个引擎适合什么工作呢?

事实上,虽然 MMAPv1 是默认引擎,但 WiredTiger 似乎在几乎所有领域都更好。它具有与 MMAPv1 相同的功能以及:

  • 更好的写入性能,
  • 文档级并发,
  • 压缩,
  • 快照和检查点系统。

我在MongoDB 的博客上找到了一个比较表:

WiredTiger 和 MMAPv1 比较

因此,除非您使用 Solaris,否则是否有理由不选择 WiredTiger?


编辑

这里有两个视频详细解释了 WiredTiger和MMAPv1的内部结构。

mongodb storage-engine
  • 3 3 个回答
  • 23615 Views

3 个回答

  • Voted
  1. Best Answer
    Markus W Mahlberg
    2015-11-16T14:31:11+08:002015-11-16T14:31:11+08:00

    就个人而言,到目前为止,我更喜欢 mmapv1 存储引擎,原因有三个。

    原因一:成熟

    并不是 WiredTiger 不成熟。但是 mmapv1 很容易理解,并且经过了上下、来回和超越的所有战斗测试。WiredTiger 最近遇到了一些严重的问题(有关详细信息,请参阅http://jira.mongodb.com),我不愿意让我的客户以艰难的方式找到下一个问题。

    原因二:特点

    鉴于,WT 有一些非常棒的功能。问题是:我没有看到任何人从中受益。压缩?无论哪种方式,您都很难牺牲相当便宜的磁盘空间来实现性能。扩展文档缺少文档迁移问题?好吧,我们仍然有 16MB 的大小限制并增加了嵌入文档的复杂性,尤其是当嵌入过度时。

    还有其他功能,但总的来说:到目前为止,我认为它们并没有太大的好处。

    原因 3:总拥有成本

    对于新项目,WT 可能没问题,尤其是从 3.2 开始,因为以下内容不适用。

    进行数据迁移很昂贵. 它需要进行规划,该计划需要得到所有利益相关者的同意,必须制定和商定紧急应变计划,需要准备、执行和审查迁移。现在,与参与此过程的利益相关者一起增加所需的时间,以及数据迁移的成本飙升。另一方面,投资回报似乎相当小。如果考虑到这些因素,您可以进行相当多的扩展而不是进行迁移。给你一个印象:如果迁移计划、执行和审查正确,我估计每个利益相关者大约需要一个“人周”。以每人每小时 100 美元的成本计算,并且只涉及三个人(经理、DBA 和开发人员),这相当于 12.000 美元。请注意,这是一个保守的估计。

    结论

    以上所有这些因素使我得出结论,无论如何不要使用 WT。眼下。


    更新

    这篇文章现在已经有几个月了,所以它值得更新

    到期时

    我最初对成熟度的评论有点过时了。WiredTiger 暂时没有出现什么大问题,自 MongoDB 3.2 起已成为默认存储引擎

    关于功能

    恕我直言,我最初的评论仍然有效。

    压缩

    但是,当预算紧张,或者更一般地说,性能不是主要关注点时,性能权衡相当小,并且您基本上用轻微的性能影响(与未压缩的 WT 相比)换取磁盘空间,利用其他情况下空闲的空间周围:CPU。

    加密

    MongoDB 3.2 Enterprise 引入了对 WiredTiger 存储进行加密的能力。对于具有增强安全需求的数据,这是一个杀手级功能,使 WT 成为唯一选择的存储引擎,无论是技术上(MMAPv1 不支持加密)还是概念上。当然,撇开加密磁盘分区的可能性不谈,尽管在某些环境中您可能没有该选项。

    文档级锁定

    我不得不承认,我在上面的分析中基本上省略了 WT 的那个特性,主要是因为在我写原始答案时它并不适用于我或我的客户。

    根据您的设置,主要是当您有许多并发写入客户端时,此功能可能会提供很大的性能提升。

    关于总拥有成本

    进行迁移仍然很昂贵。但是,考虑到成熟度的变化和对功能的改变看法,如果满足以下条件,迁移可能值得投资:

    • 您需要加密(仅限企业版!)
    • 性能不是您最关心的问题,从长远来看,您可以使用压缩来节省资金(保守计算)
    • 您有很多同时写入的进程,因为性能的提高可能会为您节省垂直或水平扩展。

    更新结论

    对于新项目,我现在使用 WiredTiger。由于从压缩到未压缩的 WiredTiger 存储迁移相当容易,因此我倾向于从压缩开始以提高 CPU 利用率(“物有所值”)。如果压缩对性能或用户体验有明显影响,我会迁移到未压缩的 WiredTiger。

    对于有很多并发作者的项目,是否迁移的答案也几乎总是“是”——除非项目的预算禁止投资。从长远来看,如果部署是经过合理规划的,性能提升应该会收回成本。但是,您需要在计算中添加一些开发时间,因为在某些情况下需要更新驱动程序,并且可能存在需要处理的问题。

    对于预算紧张且暂时无法提供更多磁盘空间的项目,可以选择迁移到压缩的 WiredTiger,但压缩会给 CPU 带来一点负载,这在 MMAPv1 中是闻所未闻的。此外,对于这样的项目,迁移成本可能非常昂贵。

    • 26
  2. gabrielgiussi
    2016-02-27T12:57:13+08:002016-02-27T12:57:13+08:00

    我的两分钱:

    WiredTiger中的日志在硬关机时可能会丢失更新,因为它使用内存中的缓冲来存储日志记录。

    在写入操作之间,虽然日志记录保留在 WiredTiger 缓冲区中,但在 mongod 硬关闭后更新可能会丢失。

    MMAPv1中的日志记录将更改写入磁盘日志文件。

    如果 mongod 实例在没有将写入应用到数据文件的情况下崩溃,则日志可以将写入重播到共享视图以最终写入数据文件。

    • 5
  3. Anand
    2016-09-29T07:04:20+08:002016-09-29T07:04:20+08:00

    我们从 MMAPv1 转移到 WiredTiger 是为了获得 7 到 10 倍的性能提升。我们不得不恢复到 MMAPv1,因为当 WiredTiger 缓存达到 100% 时,MongoDB 会锁定。我们在这里记录了我们的经验 - https://blog.clevertap.com/sleepless-nights-with-mongodb-wiredtiger-and-our-return-to-mmapv1/

    • 4

相关问题

  • 分片对小集合有效吗?

  • **不**在 MySQL 中使用 MEMORY 存储引擎的原因是什么?

  • 关于操作/管理 MongoDB 的良好资源

  • 加快 MyISAM 到 InnoDB 的转换

  • 使用 Sphinx 存储引擎的优点和缺点是什么?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve