为啥大公司使用 Mnesia 而不是使用 Riak 或 CouchDB [关闭]

Posted

技术标签:

【中文标题】为啥大公司使用 Mnesia 而不是使用 Riak 或 CouchDB [关闭]【英文标题】:Why big companies use Mnesia instead of using Riak or CouchDB [closed]为什么大公司使用 Mnesia 而不是使用 Riak 或 CouchDB [关闭] 【发布时间】:2014-06-04 12:27:56 【问题描述】:

我可以看到像 Klarna 和 Whatsapp 这样的 2 家大公司正在使用 Mnesia 作为他们的内存数据库(不确定他们如何使用 Mnesia 以 2GB 的限制来保存数据)。我的问题是:为什么像这样的公司(可能更多我不知道)使用 Mnesia 而不是 Riak 或 couchDB,它们都是 Erlang,这两个数据库都支持更快的内存数据库、更好的无痛持久性和更多功能。我错过了什么吗?

【问题讨论】:

其实Klarna同时使用了Mnesia和Riak。 【参考方案1】:

你遗漏了一些重要的观点:

首先,mnesia 没有 2 GB 的限制。它仅限于 32 位架构,但实际工作中几乎不再存在。而在 64 位上,您不仅限于 2 GB。我见过数百 GB 的数据库。唯一的问题是它们的初始启动时间。

Mnesia 旨在处理:

非常低延迟的 K/V 查找,不一定可线性化。 具有可线性化变化的正确事务(CAP 定理中的 C)。由于预计它们相对较少,因此允许它们以更短的延迟运行。 在线架构更改 即使集群中的节点出现故障(集群很小,例如最多 10-50 台机器)也能生存

该设计避免了单独的进程,因为数据已经在 Erlang 系统中。您有用于类似数据记录的查询的 QLC。而且您可以存储任何 Erlang 术语。

如果您需要以上内容,Mnesia 的表现会很好。它的限制是:

您无法获得内存超过 2 TB 的计算机。从头开始加载 2 teras 会很慢。 由于是CP系统而不是AP系统,节点丢失需要人工干预。您可能也不需要交易。您可能还希望能够无缝地将更多节点添加到系统等等。为此,Riak 是一个更好的选择。 它使用乐观锁定,如果许多进程试图访问事务中的同一行,这会带来麻烦。

我通常的 goto 技巧是从 Erlang 系统中的 Mnesia 开始,然后随着数据大小的增长切换到另一个系统。如果数据大小增长缓慢,那么您可以将所有内容都保存在 Mnesia 的内存中,并以极快的速度启动和运行。

【讨论】:

哦,看看旧的 mnesia 系统描述文件,它准确地解释了它的构建目的! 很好的解释..从你上面所说的工程师通常更喜欢在同一个进程中使用数据而不是跳转到另一个进程(Riak 在用 Erlang 编写的内存数据库中提供了非常低的延迟,并且可以持久化到硬盘),我的问题是:你有没有看到任何公司使用 Mnesia 来实现大于 4GB 的磁盘持久性?我仍然很难想象 Mnesia 的持久性有多好。 在阅读了您的精彩回答后,Mnesia 非常适合内存数据库(由 ETS 支持),简而言之,我的问题是:如何利用 Mnesia 实现可靠的持久性,如 Riak 或 CouchDB?跨度> Mnesia 有光盘副本。这还不够吗? kadaj:问题是:它可以占用多大,以及在大表的情况下它可以多快从故障中恢复。【参考方案2】: 对于 mnesia 的持久存储容量,“磁盘表的 2 GB 限制”是一种常见的错觉。 阅读这篇文章 What is the storage capacity of a Mnesia database?

非常用心。 mnesia 磁盘表大小没有实际限制。

Mnesia 是免费的,不像 riak(用于商业用途)。 了解上限定理。您可以使用普通的 mnesia 作为后端来构建自己的 ca 或 cp 或 ap 数据库。但是,如果您使用特定的 dbms,例如 couchdb,它的设计目的是开箱即​​用。而且你做不到,比如说,ca(据我所知)

【讨论】:

请注意,将数据存储在 4GB 以上的 Disk 上会出现问题,但 Mnesia 不会失败;而且我没有听说有人在生产系统中使用超过 4GB 的 Mnesia,是吗?? 好吧。确切地说,Riak 可以免费用于商业用途。但是,有可用的企业版本添加了多数据中心复制。 @securecurve ,我个人没有。 您不能制作任何数据库 CA。 CP 或 AP(或者,通常两者都不是)是您唯一的选择。 @securecurve codahale.com/you-cant-sacrifice-partition-tolerance【参考方案3】:

据我所知,Riak 和(请参阅 cmets 中有关 BitCask 的说明)CouchDB 支持内存数据库。我在 Riak 上可能是错的,但我在 CouchDB 上工作,所以我很确定。

工程师选择 mnesia 而不是 Riak 或 CouchDB,因为它解决了不同的问题。

他们是否是大公司不在此列。

【讨论】:

其实你说得对,Riak 不支持内存数据库,但是 Mnesia 解决了 Riak 和 CouchDB 不支持的哪些类型的问题(内存数据库除外)......注意存储限制(无论是 2GB 存储还是无限存储的争论)和加载时间过长 你不完全正确,Riak 使用了一个名为 Bitcask 的后端,它可以让你在内存存储中以非常低的访问时间延迟进行操作,你可以检查一下:basho.com/hello-bitcask Riak 通过the memory backend 肯定支持内存。 Bitcask 是基于磁盘的存储后端,keys 在内存中,依赖于 OS 磁盘缓存来获取值。 Brian Roach:是的,我刚刚发现,Riak 中的内存存储也是基于您提供的链接的 ETS 表。 感谢您对 Riak 的澄清。

以上是关于为啥大公司使用 Mnesia 而不是使用 Riak 或 CouchDB [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Riak 中存储二进制数据的缺点?

Mnesia 表复制/共享

为啥每个人都为 jQuery 选择 JSON 而不是 XML? [关闭]

RabbitMQ日志和Mnesia在环境变量中的位置没有反映?

为啥国内互联网公司都用centos而不是ubuntu?

Mnesia数据库设计,用于存储将来需要发送的消息