- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在使用 Mnesia 作为一个非常大的系统的主数据库。 Mnesia Fragmented Tables 在测试期间表现非常好。系统有大约 15 个表,每个表都跨 2 个站点(节点)复制,并且每个表都是高度碎片化的。在测试阶段(侧重于可用性、效率和负载测试),我们接受了 Mnesia,它复杂结构的许多优点将为我们提供帮助,因为我们在服务之上运行的所有应用程序都是 Erlang/OTP 应用程序。我们正在运行 Yaws 1.91 作为主要的网络服务器。
为了有效地配置碎片表,我们使用了许多在大型系统中使用过 mnesia 的引用资料:
它们是: Mnesia One Year Later Blog , Part 2 of the Blog , Followed it even here , About Hashing 。这些博文帮助我们在各个方面进行微调以获得更好的性能。
现在,问题来了。 Mnesia 有表大小限制,是的,我们同意。但是,任何地方都没有提到对片段数量的限制。出于性能原因,并为了满足大数据的需要,大约有多少片段可以使 mnesia “正常”?。
在我们的一些表中,我们有 64 个片段。 n_disc_only_copies
设置为集群中的节点数,以便每个节点的每个片段都有一个副本。如果给定节点瞬间无法访问,这帮助我们解决了 mnesia 写入失败的问题。同样在上面的博客中,他建议片段的数量应该是 2 的幂
,这个声明(他说)是根据 mnesia 对记录进行哈希处理的方式进行调查的。然而,我们需要对此进行更多解释,这里讨论的是 2 的哪个幂:2,4,16,32,64,128,...?
该系统旨在运行在 HP Proliant G6 上,包含 Intel 处理器(2 个处理器,每个处理器 4 个内核,每个内核 2.4 GHz 速度,8 MB 缓存大小),20 GB RAM 大小,1.5 TB 磁盘空间。现在,我们可以使用这些大功率机器中的 2 台。系统数据库应该在两者之间进行复制。每台服务器都运行 64 位 Solaris 10。
mnesia 的性能可能会在多少片段时开始下降?如果我们将给定表的片段数从 64 增加到 128 可以吗? 65536 个片段 (2 ^ 16) 怎么样?我们如何通过使用碎片来扩展我们的 mnesia 以利用 TB 空间?
请务必提供问题的答案,并且您可以就可以增强系统的任何其他参数提供建议。
注意:所有要保存数百万条记录的表都是以 disc_only_copies
类型创建的,因此没有 RAM 问题。 RAM 将足够我们运行的几个 RAM 表。其他 DBMS,如 MySQL Cluster 和 CouchDB 也将包含数据,并与我们的 Mnesia DBMS 使用相同的硬件。 MySQL Cluster 在两台服务器之间进行复制(每台服务器拥有两个 NDB 节点,一个 MySQL 服务器),管理节点位于不同的主机上。
最佳答案
片段数量为 2 次幂的提示与默认片段模块 mnesia_frag
使用线性散列的事实简单相关,因此使用 2^n 片段可确保记录均匀分布(更多或更多)更少,显然)片段之间。
关于可用的硬件,更多的是性能测试。可以降低性能的因素有很多,配置像 Mnesia 这样的数据库只是一般问题的一部分。我只是建议您对一台服务器进行压力测试,然后在两台服务器上测试算法以了解它是否可以正确缩放。
谈论 Mnesia 片段数量缩放请记住,通过使用 disc_only_copies 大部分时间花在两个操作上:
决定哪个片段保存哪个记录
从相应的 dets 表中检索记录(Mnesia 后端)
第一个并不真正依赖于默认情况下 Mnesia 使用线性哈希的片段数量。第二个与硬盘延迟的关系比其他因素更多。
最终,一个好的解决方案可能是拥有更多的片段和更少的每个片段的记录,但同时尝试找到中间立场,并且不会失去一些硬盘性能提升的优势,如缓冲区和高速缓存。
关于database - 生产中的超大型 Mnesia 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090193/
我已经阅读并重新阅读了文档 re: mnesia:activity/3、mnesia:activity/4 和 mnesia/transaction/2,但它们对我来说仍然像是一种晦涩难懂的外语。 在
似乎我们只能通过输入 iex --erl "--mnesia dir '~/doc/'"--name mynode 来启动 Mnesia。 我们可以直接启动它而不向 erl 传递参数吗? 最佳答案 您
我开始构建一个具有以下要求的项目: 整个系统将分布在 WAN 上的多个物理节点 每个节点将使用和操作一组通用的数据记录 对这些记录的操作必须能够适应网络中断 我正在考虑使用 Mnesia/Erlang
是否有将 mnesia 数据库放在 erlang 中的标准位置?目前我把它放在 priv 目录中。 最佳答案 默认情况下,Mnesia 将在名为 Mnesia. 的子目录中创建模式。模拟器进程的当前目
我定义了一个名为 log 的记录.我想创建一个名称为 log_table 的 mnesia 表.当我尝试将记录写入表时,我得到 bad_type错误如下: (node1@kitt)4> mnesia:
setup_mnesia(Name) -> ?VALUE(application:start(mnesia)), ?VALUE(mnesia:create_schema([node()
我试图有一个函数来确保我需要的表已经创建,如果没有创建它。这是示例: ensure_table_exists(Table, MnesiaTables, Nodes) -> case lists:mem
当我收到这样的消息时,像这样: ** WARNING ** Mnesia is overloaded: {dump_log, write_threshold} 什么是已知的方法 哪个表是否被密集使用?
我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从该表中获取过期时间小于现在的记录并将其删除。 Erlang 文档说,有四种类型的表类型:set、orde
我有一个带有整数键(时间戳)的表,其中包含应从数据库中删除特定记录的时间。还有一个清理查询,它从该表中获取过期时间小于现在的记录并将其删除。 Erlang 文档说,有四种类型的表类型:set、orde
我为表创建了索引,但有一个问题。 mnesia:select 是否使用二级索引? 最佳答案 来自 http://www.erlang.org/doc/efficiency_guide/tablesDa
我正在使用 rebar3 生成一个版本,但我如何在生产中初始化 mnesia? 如果我编写执行 mnesia:create_schema([node()]) 的“安装”脚本 - 它将使用与发布版本完全
问题: 如何从表中有效地选择记录,其中选择基于涉及两个索引列的条件。 例子 我有记录, #rec{key, value, type, last_update, other_stuff} 我有键(默认)
我正在开发一个需要大量数据库写入的 Erlang 应用程序。除了主键之外,我的模式还有另一个强制执行唯一约束的属性。 假设我有一个 ID、一个 unique_constraint_field 和一些其
问题陈述 我有一个 mnesia 备份文件,想从中提取值。有 3 个表(为简单起见),Employee、Skills 和 attendance。因此 mnesia 备份文件包含这三个表中的所有数据。
Mnesia 使用什么策略来定义哪些节点将存储特定表的副本? 我可以强制 Mnesia 为每个表使用特定数量的副本吗?这个数字可以动态改变吗? 是否有任何来源(除了源代码)对 Mnesia 内部算法的
我在很多文档中看到 Mnesia 已经被 Ericsson 开源了,但是直接谷歌搜索并没有帮助我找到带有代码的存储库...... Mnesia 仍然是开源的吗? 最佳答案 它是 Erlang/OTP
Mnesia 中是否有与此 SQL 语句等效的语句? alter table TABLE add foreign key (FIELD) references TABLE2 (FIELD2) 最佳答案
我有一个 erlang 应用程序,目前在四个节点上运行,并带有一个复制的 mnesia 数据库,该数据库存储有关连接客户端的最少数据。 mnesia 复制过去一直在无缝工作(据我所知),但最近一位客户
我在节点上安装了 mnesia a . 我已经定义了一个架构和一个表。 现在我不知道如何添加另一个节点 b以便 mnesia 现在可以分布式运行。 分布式我的意思是: 发出 insert来自节点 a
我是一名优秀的程序员,十分优秀!