在 mongoDB3 中出现了一个新的存储引擎:WiredTiger。然而,MMAPv1仍然是 Mongo 的默认选择。
一个可能并不比另一个更好,这通常是用例和为工作选择正确工具的问题。但是哪个引擎适合什么工作呢?
事实上,虽然 MMAPv1 是默认引擎,但 WiredTiger 似乎在几乎所有领域都更好。它具有与 MMAPv1 相同的功能以及:
- 更好的写入性能,
- 文档级并发,
- 压缩,
- 快照和检查点系统。
我在MongoDB 的博客上找到了一个比较表:
因此,除非您使用 Solaris,否则是否有理由不选择 WiredTiger?
编辑
这里有两个视频详细解释了 WiredTiger和MMAPv1的内部结构。
就个人而言,到目前为止,我更喜欢 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 中是闻所未闻的。此外,对于这样的项目,迁移成本可能非常昂贵。
我的两分钱:
WiredTiger中的日志在硬关机时可能会丢失更新,因为它使用内存中的缓冲来存储日志记录。
MMAPv1中的日志记录将更改写入磁盘日志文件。
我们从 MMAPv1 转移到 WiredTiger 是为了获得 7 到 10 倍的性能提升。我们不得不恢复到 MMAPv1,因为当 WiredTiger 缓存达到 100% 时,MongoDB 会锁定。我们在这里记录了我们的经验 - https://blog.clevertap.com/sleepless-nights-with-mongodb-wiredtiger-and-our-return-to-mmapv1/