Database 生产中的超大记忆表

Database 生产中的超大记忆表,database,erlang,solaris,mnesia,yaws,Database,Erlang,Solaris,Mnesia,Yaws,我们使用Mnesia作为一个大型系统的主数据库。Mnesia碎片表在测试期间表现良好。系统有大约15个表,每个表跨2个站点(节点)复制,每个表都是高度碎片化的。在测试阶段(侧重于可用性、效率和负载测试),我们接受了Mnesia,因为它具有复杂结构的许多优点,可以为我们提供帮助,因为我们在服务之上运行的所有应用程序都是Erlang/OTP应用程序。我们正在运行Yaws 1.91作为主Web服务器。 为了有效地配置分段表,我们使用了大量在大型系统中使用mnesia的参考资料: 这些是:。这些博客文

我们使用Mnesia作为一个大型系统的主数据库。Mnesia碎片表在测试期间表现良好。系统有大约15个表,每个表跨2个站点(节点)复制,每个表都是高度碎片化的。在测试阶段(侧重于可用性、效率和负载测试),我们接受了Mnesia,因为它具有复杂结构的许多优点,可以为我们提供帮助,因为我们在服务之上运行的所有应用程序都是Erlang/OTP应用程序。我们正在运行Yaws 1.91作为主Web服务器。

为了有效地配置分段表,我们使用了大量在大型系统中使用mnesia的参考资料:
这些是:。这些博客文章帮助我们在这里和那里进行微调,以获得更好的性能

现在,问题来了。Mnesia有表格大小限制,是的,我们同意。然而,对碎片数量的限制在任何地方都没有提到。出于性能方面的原因,以及为了满足大数据的需要,大约有多少个片段可以保持mnesia“正常”

在一些表中,我们有64个片段。将
n\u disc\u only\u copies
设置为集群中的节点数,以便每个节点每个片段都有一个副本。这帮助我们解决了在给定节点瞬间无法触及时出现的mnesia写入失败问题。同样在上面的博客中,他建议
片段的数量应该是2的幂次方,这句话(他说)是从mnesia散列记录的方式来研究的。然而,我们需要更多的解释,这里讨论的是两种力量的哪一种:2,4,16,32,64128

该系统拟在HP Proliant G6上运行,包含Intel处理器(2个处理器,每个4核,每个核2.4 GHz速度,8 MB缓存大小),20 GB RAM大小,1.5 TB磁盘空间。现在,这些高功率机器中有两台在我们手中。系统数据库应跨这两个数据库进行复制。每台服务器都运行Solaris 10,64位

mnesia的绩效开始降级的碎片数是多少?如果我们将给定表的片段数从64增加到128,可以吗?65536个片段(2^16)怎么样?我们如何通过使用碎片来扩展我们的记忆能力以利用TB空间

请务必提供问题的答案,并且您可以就可能增强系统的任何其他参数提供建议


注意:所有要保存数百万条记录的表都是在
disc\u-only\u copies
类型中创建的,因此没有RAM问题。RAM将足以满足我们运行的几个RAM表。其他数据库管理系统,如MySQL Cluster和CouchDB,也将包含数据,并与我们的Mnesia数据库管理系统使用相同的硬件。MySQL集群跨两台服务器进行复制(每台服务器拥有两个NDB节点,一台MySQL服务器),管理节点位于不同的主机上。

具有两个片段的幂的提示只与默认片段模块
mnesia_frag
使用线性散列有关,因此使用2^n个片段可以确保记录在片段之间均匀分布(显然或多或少)

关于可用的硬件,更多的是性能测试。 降低性能的因素很多,而像Mnesia这样配置数据库只是一般问题的一部分。 我只是建议您对一台服务器进行压力测试,然后在两台服务器上测试该算法,以了解其扩展是否正确

谈到Mnesia碎片数量缩放时,请记住,通过仅使用光盘拷贝,大部分时间都花在两个操作上:

  • 决定哪个片段保存哪个记录

  • 从相应的dets表中检索记录(Mnesia后端)

第一个并不真正依赖于默认情况下Mnesia使用线性散列的片段数。 第二个因素更多地与硬盘延迟相关,而不是与其他因素相关


最终,一个好的解决方案可能是拥有更多的片段,每个片段拥有更少的记录,但同时要努力找到中间地带,不要失去一些硬盘性能提升的优势,如缓冲区和缓存。

也许你可以尝试在erlang问题邮件列表中提问。。它有很多经验丰富的大腕,你很可能会在那里得到这样一个开放式问题的好答案。谢谢@knutin,让我试试看嘿@MuzaayaJoshua,如果你在erlang问题上发帖,你介意分享链接吗?