Mnesia 数据库的存储容量是多少?
Posted
技术标签:
【中文标题】Mnesia 数据库的存储容量是多少?【英文标题】:What is the storage capacity of a Mnesia database? 【发布时间】:2010-09-30 02:34:23 【问题描述】:有些地方规定 2GB 期限。有些地方说这取决于节点的数量。
【问题讨论】:
【参考方案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 S3 或 Tokyo Cabinet。在这种情况下,表的容量受到后端存储的限制。
【讨论】:
这是完美的。非常感谢。 据我所知,dets 只能处理 2GB 文件而不是 4GB,这将是 disc_copies 的限制。有一个实验性的 64 位 dets 可以处理更大的文件,但还没有人在生产中使用它。 可以确认它是 2GB,目前在生产中遇到问题,因为我指望 4GB - 小心。【参考方案2】:TL;DR:Mnesia 数据库的存储容量仅受可用 RAM 限制*。
* 假设您使用表类型ram_copies
或disc_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.erl
和mnesia_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 月仍然如此以上是关于Mnesia 数据库的存储容量是多少?的主要内容,如果未能解决你的问题,请参考以下文章
有一主存/Cache层次的存储器,其主要容量1Mb,Cache容量64Kb,每个数据块的大小16B若采用两路组相联映射方式