Mnesia异步事务

时间:2009-12-13 15:20:37

标签: erlang mnesia

我希望有一个Erlang节点的主从设置,其中读写操作仅在主节点上进行。从节点只保留为热备用。

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

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

3 个答案:

答案 0 :(得分:2)

如果您使用消息队列系统(也许是rabbitmq)从消息队列提要中自行更新已复制的数据库,那么我认为您会更高兴。 WAN链接更有可能变得拥挤或崩溃,并且消息队列协议有办法处理它。 Erlang发行版只是放弃了,您必须将更新溢出到文件中,直到副本出现并可以使用它。

为了获得最佳对称性,将post-to-the-message队列作为更新db的主要方法。因此,即使通过使用消息队列来更新主服务器也是如此。如果需要响应,则当前主服务器可以将消息发送回消息的发布者。

Mnesia确实有几种不同的mnesia transaction contexts,但没有任何东西与你想要的完全吻合。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

基本上,你所暗示的,基督徒,是拥有gen_server - 序列化对数据库的访问。 我第一次这样做然后我意识到:坚持下去! Mnesia是事务性的,所以首先序列化访问然后通过事务更新数据库再次进行排序听起来有点奇怪。

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

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

HTH, haavee