3

我想有一个 Erlang 节点的主从设置,其中读写操作只发生在主节点上。从节点仅保留为热备份。

据我了解,Mnesia 的默认行为是在执行写操作之前在所有节点上同步获取锁。这将导致高延迟,尤其是对于地理分布的节点。

我的问题是:Mnesia 是否支持异步事务,仅在主节点上获取锁,然后将写入操作传播到从节点?

4

3 回答 3

2

我认为,如果您使用消息队列系统(也许是rabbitmq)构建此异地复制,您会更高兴自己从消息队列提要中更新复制的数据库。WAN 链接更有可能变得拥塞或出现故障,而消息队列协议有办法处理这种情况。Erlang 发行版就放弃了,您必须将更新溢出到一个文件中,直到副本出现并可以使用它。

为了获得最佳对称性,将发布到消息队列作为更新数据库的主要方法。因此,即使是 master 也会通过从消息队列中消费来更新。如果需要响应,当前主机可以将消息发送回消息的发布者。

Mnesia 确实有几种不同类型的mnesia 事务上下文,但没有什么能真正符合您的要求。

于 2009-12-13T21:20:21.640 回答
1

也许您的应用程序可以使用粘滞锁受益。我想它非常接近您的需求,但是......不完全是您想要的http://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/ Mnesia_chap4.html#id70700

于 2011-04-10T12:40:49.023 回答
0

有趣的 Q 和同样有趣的 A!

基本上,克里斯蒂安,您所建议的是例如拥有一个 gen_server - 序列化对数据库的访问。我第一次这样做,然后我意识到:坚持下去!Mnesia 是事务性的,因此首先对访问进行序列化,然后通过事务更新数据库来再次执行此操作听起来有点奇怪。

然而,我仍然有点困惑,因为 mnesia 强制执行事务语义,我倾向于将其视为您不必自己序列化访问的暗示,特别是因为 mnesia 的实现者可能比我更了解系统;)

我知道这不是您问题的直接答案,但是,我会说使用 mnesia + memorynodes + disknodes。用于快速接管的内存节点和用于在崩溃/备份后恢复的磁盘节点。

HTH,哈维

于 2009-12-14T12:48:21.500 回答