为什么大公司使用Mnesia而不是Riak或CouchDB?

19

我发现像Klarna和Whatsapp这样的两个大公司正在使用Mnesia作为他们的内存数据库(不确定他们如何使用Mnesia进行持久化,因为其有2GB的限制)。我的问题是:为什么像这些公司一样,甚至可能还有其他我不知道的公司,使用Mnesia而不是Riak或CouchDB?这两个都是Erlang编写的数据库,支持更快的内存数据库、更好的无痛持久性和更多功能。我是否漏掉了什么?


实际上,Klarna同时使用Mnesia和Riak。 - joaomilho
3个回答

43
您忽略了几个重要的点:
首先,mnesia没有2GB的限制。它在32位架构上有限制,但现在几乎没有真正的工作需要使用32位架构。而64位架构上,您不受2GB的限制。我见过数百GB级别的数据库。唯一的问题是这些数据库的初始启动时间。
Mnesia被设计用于处理以下内容:
- 非常低的延迟K/V查找,不一定是线性化的。 - 带有线性化更改的适当事务(CAP理论中的C)。这些事务可以以更差的延迟运行,因为它们预计相对较少。 - 在线模式更改 - 即使群集中的节点失败(其中群集最多为10-50台机器),也可以保持存活状态。
其设计使您避免使用单独的进程,因为数据已经在Erlang系统中。您可以使用QLC进行类似Datalog的查询。您还可以存储任何Erlang术语。
如果您需要以上内容,则Mnesia表现良好。它的限制是:
- 您无法获得具有超过2TB内存的计算机。从头开始加载2TB将很慢。 - 由于它是一个CP系统而不是AP系统,因此需要手动干预才能恢复丢失的节点。您可能也不需要事务。您可能还希望能够无缝添加更多节点到系统中等等。对于此,Riak是更好的选择。 - 它使用乐观锁定,在事务中许多进程尝试访问同一行会出现问题。
我通常的方法是在Erlang系统中首先使用Mnesia,然后随着数据规模的增长而切换到另一个系统。如果数据大小增长缓慢,则可以将所有内容保持在Mnesia中的内存中,并使其快速启动运行。

1
哦,还要查阅旧的mnesia系统描述论文,这篇论文详细解释了它的构建目的! - I GIVE CRAP ANSWERS
非常好的解释..根据你之前所说,工程师通常更喜欢在同一个过程中使用数据而不是跳转到另一个过程(Riak提供了一种使用Erlang编写的具有极低延迟的内存数据库,并可持久化到硬盘),我的问题是:你是否看到有公司将Mnesia用于大于4GB的磁盘持久性?我仍然很难想象Mnesia在持久性方面的优势。 - securecurve
在阅读了你的出色答案之后,Mnesia是一个非常适合用于内存数据库(由ETS支持)的工具。简而言之,我的问题是:如何将Mnesia用于可靠的持久化,类似于Riak或CouchDB? - securecurve
在将该表上线之前,必须将磁盘副本读入内存。假设n为存储的字节数,则这需要O(n)时间。通常避免这种情况的方法是准备多台机器来服务相同的数据集,这样可以填补重新启动漏洞,除非整个集群都宕机。 - I GIVE CRAP ANSWERS
@securecurve - 在我们公司中是这样的。我们有一个跨越了4GB界限的表格,还有几个接近界限的表格。当网络分区或服务器崩溃时,情况并不好,恢复需要一些时间和努力,但最终还是会恢复的。 "生产友好"这个术语是相对的;Mnesia 对我们来说已经足够了,但我们也没有太多网络分区或崩溃服务器的实例。 - Soup d'Campbells
显示剩余3条评论

10
  • 关于Mnesia的持久存储容量,“磁盘表的2GB限制”是一个常见的错觉。请仔细阅读这篇文章,没有任何实际上的限制可以设置Mnesia磁盘表大小。
  • Mnesia是免费的,不像Riak(用于商业用途需要付费)。
  • 了解CAP定理。你可以使用普通的Mnesia作为后端构建自己的CA、CP或AP数据库。但是如果你采用特定的DBMS,比如CouchDB,它从设计上就是AP的。据我所知,你无法将其转换成CA。

请注意,将数据存储在4GB以上的磁盘上据报会导致问题,但Mnesia不会失败;我没有听说过有人在生产系统中使用超过4GB的Mnesia,你听说过吗? - securecurve
2
你不能创建任何数据库CA。CP或AP(或者通常情况下,实际上也是)是你唯一的选择。 - macintux
@macintux。CAP概念对我来说有点新奇,为什么我不能制作CA系统呢? - securecurve
1
@securecurve http://codahale.com/you-cant-sacrifice-partition-tolerance/ @securecurve http://codahale.com/you-cant-sacrifice-partition-tolerance/ - macintux
@macintux 感谢您提供的参考! - securecurve
显示剩余4条评论

5
据我所知,Riak和CouchDB都不支持内存数据库(关于BitCask的注释请见下文)。我可能对Riak有所错误,但我从事CouchDB工作,所以非常确定。
工程师们选择mnesia而不是Riak或CouchDB,因为它解决了不同的问题。
无论他们是大公司还是小公司,在这件事上都没有影响。

1
实际上你是对的,Riak不支持内存数据库,但Mnesia解决了哪些问题(除了内存数据库),这是Riak和CouchDB所没有的...请记住存储限制(无论是2GB存储还是无限存储的争议)并且需要考虑加载时间过长。 - securecurve
你并不完全正确,Riak使用了一个名为Bitcask的后端,它允许你在内存中进行存储,并具有非常低的访问延迟时间,你可以查看这个链接:http://basho.com/hello-bitcask/。 - securecurve
Riak肯定支持通过内存后端进行内存操作。Bitcask是基于磁盘的存储后端,keys在内存中,依赖于操作系统磁盘缓存来获取值。 - Brian Roach
Brian Roach:没错,我刚刚弄明白了,根据你提供的链接,Riak中的内存存储也是基于ETS表的。 - securecurve
感谢您对Riak的澄清。 - Jan Lehnardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接