【问题标题】:What is the storage capacity of a Mnesia database?Mnesia 数据库的存储容量是多少?
【发布时间】:2010-09-30 02:34:23
【问题描述】:

有些地方规定 2GB 期限。有些地方说这取决于节点的数量。

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    如果您的问题是“由大量 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 表。如果 表是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 S3Tokyo Cabinet。在这种情况下,表的容量受到后端存储的限制。

    【讨论】:

    • 这是完美的。非常感谢。
    • 据我所知,dets 只能处理 2GB 文件而不是 4GB,这将是 disc_copies 的限制。有一个实验性的 64 位 dets 可以处理更大的文件,但还没有人在生产中使用它。
    • 可以确认它是 2GB,目前在生产中遇到问题,因为我指望 4GB - 小心。
    【解决方案2】:

    TL;DR:Mnesia 数据库的存储容量仅受可用 RAM 限制*

    * 假设您使用表类型ram_copiesdisc_copies。此外,如果您将大量数据存储在 disc_copies 表中,则需要在启动时从磁盘读取,这可能会增加启动时间,超出可接受的范围。


    当涉及disc_copies 类型的表时,此答案与现有的两个答案相矛盾。让我先说明几点:

    • ram_copies 类型的记忆表仅受可用 RAM 的限制(除非您在 32 位计算机上)。数据存储在 ETS 表中。
    • disc_only_copies 类型的记忆表存储在 Dets 表中。由于文件格式的限制,Dets 表的大小限制为 2 GB。
    • 绕过该限制的明显方法是创建更多表,可能通过table fragmentation
    • 架构也存储在 Dets 表中,因此描述所有现有表的信息也限制为 2 GB。不过,在达到其他限制之前,您可能会遇到其他限制。
    • disc_copies 类型的记忆表存储在 RAM 和磁盘上,因此它受到可用 RAM 的限制 - 或许还有其他东西?

    我将尝试在下面说明 Mnesia 对disc_copies 表的大小没有特定限制。但是请注意,许多 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 月开始,FAQ 就一直这么说(请参阅 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),但在 64 位虚拟机上,假设有超过 4GB 的可用内存,这个限制会被推得更远。

    disc_only_copies
    此选项意味着数据仅存储在 DETS 中。仅限光盘,因此存储空间仅限于 DETS 的 2GB 限制。

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

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

    a post on erlang-questions titled "beating mnesia to death (was RE: Using 4Gb of ram with Erlang VM)",日期为 2005 年 11 月 7 日,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 大小限制,但这个答案是在 dets 到 disk_log 更改之前编写的
    • erlang.org 域上唯一的其他文档是 Håkan Mattsson 的文档,可以追溯到 dets 到 disk_log 更改之前

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这是否受节点数量的影响? Mnesia 会自己分发/分片吗?
      • 截至 2017 年 6 月仍然如此
      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      相关资源
      最近更新 更多