我们使用 Mnesia 作为一个非常大的系统的主数据库。Mnesia Fragmented Tables 在测试期间表现得非常好。系统有大约 15 个表,每个表在 2 个站点(节点)上复制,每个表都高度碎片化。在测试阶段(专注于可用性、效率和负载测试),我们接受了 Mnesia 及其复杂结构的许多优势,因为我们在服务之上运行的所有应用程序都是 Erlang/OTP 应用程序。我们正在运行 Yaws 1.91 作为主 WebServer。
为了有效地配置 Fragmented Tables,我们使用了许多在大型系统中使用过 mnesia 的参考资料:
它们是:Mnesia 一年后的博客,博客的第 2 部分,甚至在这里也关注了它,关于散列。这些博客文章帮助我们在这里和那里微调以获得更好的性能。
现在,问题。Mnesia 有表格大小限制,是的,我们同意。但是,任何地方都没有提到对片段数量的限制。出于性能原因,并且为了满足大数据的需要,大约有多少片段可以让 mnesia 保持“正常”?
在我们的一些表中,我们有 64 个片段。withn_disc_only_copies
设置为集群中的节点数,以便每个节点每个片段都有一个副本。这帮助我们解决了如果给定节点瞬间无法访问的 mnesia 写入失败的问题。同样在上面的博客中,他建议the number of fragments should be a power of 2
,这个声明(他说)是从 mnesia 对记录进行散列的方式进行调查的。然而,我们需要对此进行更多解释,这里讨论的是两个的哪个幂:2,4,16,32,64,128,...?
该系统旨在在 HP Proliant G6 上运行,包含 Intel 处理器(2 个处理器,每个 4 个内核,每个内核的速度为 2.4 GHz,8 MB 缓存大小),20 GB RAM 大小,1.5 TB 磁盘空间。现在,我们可以使用其中两台大功率机器。系统数据库应该在两者之间复制。每台服务器都运行 64 位的 Solaris 10。
mnesia 的性能会在多少个片段时开始下降?如果我们将给定表的片段数从 64 增加到 128 是否可以?65536 个片段 (2 ^ 16) 怎么样?我们如何通过使用碎片来扩展我们的 mnesia 以利用 Terabyte 空间?
请务必提供问题的答案,您可以就可能增强系统的任何其他参数提供建议。
注意:所有要保存数百万条记录的表都是按disc_only_copies
类型创建的,因此没有 RAM 问题。对于我们运行的几个 RAM 表,RAM 就足够了。其他 DBMS,如 MySQL Cluster 和 CouchDB 也将包含数据,并且使用与我们的 Mnesia DBMS 相同的硬件。MySQL 集群在两台服务器上复制(每台服务器都有两个 NDB 节点,一个 MySQL 服务器),管理节点位于不同的主机上。