Mnesia数据库的存储容量是多少?

时间:2009-01-07 18:39:46

标签: erlang mnesia

有些地方表示2GB期间。有些地方说它取决于节点的数量。

3 个答案:

答案 0 :(得分:62)

如果您的问题是“由大量disc_only_copies表组成的mnesia数据库的存储容量是多少”,那么你会很大 - 你很大程度上受到可用磁盘空间的限制。

更容易回答的问题是,不同类型的单个mnesia表的最大容量是多少。 ram_copies表受可用内存的限制。 disc_copies表受dets后端(Hakan Mattsson on Mnesia)限制 - 此限制目前为4Gb数据。

所以简单的答案就是简单的disc_copies表在遇到问题之前可以存储多达4Gb的数据。 (如果超过磁盘大小限制,Mnesia实际上不会崩溃 - 表的ram_copies部分继续运行,因此您可以通过删除数据或在运行时进行其他安排来修复此问题) p>

但是如果你考虑其他的mnesia功能,那么答案会更复杂。

  • local_content表。如果 table是local_content表, 那么它可以有不同的内容 在mnesia集群中的每个节点上, 所以表的容量是 4Gb * <number of nodes>
  • fragmented tables。 Mnesia支持使用表碎片进行用户可配置的表分区或分片。在这种情况下,您可以通过许多基本表有效地分发和重新分配表中的数据。这些原始表可以各自具有自己的配置 - 例如一个ram_copies表和其余的disc_only_copies表。这些原始表具有与前面提到的相同的大小限制,现在分段表的有效容量为4Gb * <number of fragments>。 (可悲的是,如果您将表格分段,则必须修改表格访问代码以使用mnesia:activity/4代替mnesia:write和朋友,但如果您事先计划好这是可管理的
  • external copies如果你喜欢生活在最极端的边缘,你可以将mnesiaex补丁应用到mnesia并将你的表格数据存储在外部系统中,例如Amazon S3或{{3 }}。在这种情况下,表的容量受后端存储的限制。

答案 1 :(得分:9)

当涉及到disc_copies类型的表时,这个答案与现有的两个答案相矛盾。首先让我先谈谈几点:

  • 类型ram_copies的mnesia表仅受可用RAM的限制(除非您使用的是32位计算机)。数据存储在ETS表中。
  • 类型为disc_only_copies的mnesia表存储在Dets表中。由于文件格式的限制,Dets表限制为2 GB。
  • 绕过该限制的显而易见的方法是创建更多表,可能通过table fragmentation
  • 架构也存储在Dets表中,因此描述所有现有表的信息也限制为2 GB。但是,在你碰到那个之前,你可能会遇到其他限制。
  • 类型为disc_copies的mnesia表存储在存储在RAM和磁盘上,因此它受可用内存限制 - 可能还有其他内容?

我将尝试在下面显示Mnesia对disc_copies表的大小施加的 no 特定限制。但请注意,许多Erlang程序员认为disc_copies表限制为2 GB。这个问题在the accepted answer中有说明,在撰写本文时,这个问题的得分超过了7倍。

disc_copies在2001年从dets移动到disk_log

通常认为disc_copies表由Dets表支持。据我所知,直到Erlang / OTP R7B-4(2001年9月30日发布)才是这种情况。来自the README

  -- mnesia -----------------------------------------------------------------

        OTP-3712 - Speed/load improvements disc_copies tables are not 
                   implemented with dets anymore.

请查看the diff了解详情,尤其是mnesia_lib.erlmnesia_loader.erl

支持dets和2/4 GB限制的来源

archelaus's answer来自http://erlang.org/~hakan/mnesia_consumption.txt,这解释了disc_copies表位于ets和dets表中。但是,看the index for the directory,我们看到这份文件的日期是1999年:

[TXT] mnesia_consumption.txt  26-Oct-1999 10:57    10k  

它是有意义的,因为它是在改变前两年写的。

Ray Boosen's answer来自the Erlang FAQ

  

11.5在Mnesia中可以存储多少数据?

     

Dets使用32位整数进行文件偏移,因此最大可能的mnesia表(现在)是4Gb。

     

实际上,在达到此限制之前,您的机器会慢慢爬行。

常见问题解答已经说过,至少从2001年1月开始(见the earliest copy in the Wayback Machine)。这意味着此FAQ条目的日期是从切换到disk_log之前的日期,并且很长时间没有更新。 (无论如何,Dets表的大小限制为2 GB,而不是4 GB。)我提交了a pull request来解决常见问题。

支持更高限制的来源

The Learn You Some Erlang chapter on Mnesia说:

  

<强> ram_copies
      这个选项使得所有数据都只存储在ETS中,因此只有内存。对于以32位编译的虚拟机,内存应限制在理论上4GB(实际上约为3GB),但假设可用内存超过4GB,这个限制会在64位虚拟机上进一步推迟。

     

<强> disc_only_copies
      此选项表示数据仅存储在DETS中。仅限光盘,因此存储仅限于DETS的2GB限制。

     

<强> disc_copies
      此选项意味着数据既存储在ETS中又存储在磁盘上,因此存储器和硬盘都存储在内。 disc_copies表不受DETS限制的限制,因为Mnesia使用复杂的事务日志和检查点系统,允许在内存中创建表的基于磁盘的备份。

我不确定这是什么时候编写的,但上面的文字存在于2012年4月的earliest Wayback Machine copy中。

在2005年11月7日的a post on erlang-questions titled "beating mnesia to death (was RE: Using 4Gb of ram with Erlang VM)"中,Ulf Wiger写道:

  

在16 GB的计算机上,您可以:

     
      
  • 同时运行600万个进程   (通过使用erlang:hibernate,我实际上是   能够运行2000万 - 产卵时间:6.3 us,   消息传递时间:5.3我们,我有   1.8 GB备用。)

  •   
  • 使用至少12 GB的数据填充mnesia,但是   想想你想要如何表达它,因为   64位的字大小会让事情变得更糟。

  •   
  • 在mnesia中保留一个10 GB + disc_copy表。该   加载时间和日志转储成本似乎可以接受   (加载10分钟,倾倒需要一段时间,但是   很好地在后台运行。)

  •   

结论

混淆似乎源于官方消息来源缺失或过时的信息:

  • Mnesia文档未提及任何表格大小限制
  • Erlang常见问题解答说Mnesia受到4 GB Dets大小限制,但是这个答案是在对disk_log进行更改之前编写的
  • 关于erlang.org域名的唯一其他文件是HåkanMattsson的文档,可以追溯到从disk_log更改之前的文件

LYSE似乎是第一个提及disc_copies表格不受Dets表格大小限制的“权威”来源。

答案 2 :(得分:7)

根据文档,这是4GB。第11.5节

http://erlang.org/faq/mnesia.html