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

现在,问题是.Mnesia有桌子大小的限制,是的,我们同意.然而,任何地方都没有提到对碎片数量的限制.出于性能方面的原因,并且为了满足 Big Data 的需要,大概有多少个片段才能使健忘症保持"正常"呢?

在我们的一些表中,我们有64个片段.将n_disc_only_copies设置为集群中的 node 数,这样每个 node 每个片段都有一个副本.这帮助我们解决了在给定 node 瞬间无法触及时出现的mnesia写入失败问题.同样在上面的博客中,他建议the number of fragments should be a power of 2,这个声明(他说)是从mnesia对记录进行散列的方式进行调查的.然而,我们需要更多的解释,以及这里讨论的两种力量的哪一种:2,4,16,32,64128,...?

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

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

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

注意:所有要保存数百万条记录的表都是以disc_only_copies种类型创建的,所以没有RAM问题.RAM足够我们运行的几个RAM表使用.其他DBMS,如MySQL集群和CouchDB也将包含数据,并与我们的Mnesia DBMS使用相同的硬件.MySQL群集跨两台服务器(每台服务器包含两个NDB node ,一台MySQL服务器)进行复制,管理 node 位于不同的主机上.

推荐答案

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

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

谈到Mnesia片段数量zoom ,请记住,使用DISC_ONLY_COPIES的大部分时间花在两个操作上:

  • 确定哪个片段包含哪个记录

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

第一个并不依赖于默认情况下Mnesia使用线性哈希的片段数.

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

Database相关问答推荐

如何将 Scylla DB 中的计数器列重置为零?

将数据库/后端添加到 android 应用程序

如何在我的 Rails 应用程序中避免竞争条件?

管理数据库中的产品计数

我应该为 Realm 中的每个实体定义主键吗?

按请求的可变事务隔离级别

苹果 ios 购买收据数据的可能最大长度是多少?

group by会自动保证order by吗?

skip bad record in redshift data load

在迁移中添加行

如何从 MySQL 行中修剪前导和尾随引号?

设计数据库时最重要的考虑因素是什么?

Hibernate、spring、JPS 和隔离 - 不支持自定义隔离

如何更改 MySQL DB 中所有表的前缀?

Oracle 的免费桌面客户端?

A QuerySet 按聚合字段值

什么是数据库中的死锁?

Django:将博客条目查看次数加一,这有效率吗?

Android 上的测试数据库:ProviderTestCase2 还是 RenamingDelegatingContext?

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)