2010-08-26 31 views
8

我正在运行两个具有复制mnesia数据库的erlang节点。每当我尝试启动其中一个,而mnesia不在另一个上运行时,mnesia:wait_for_tables(?TABS,?TIMEOUT)将挂起其调用的节点上。我需要一个结构(如果两个节点都没有运行),我可以开始使用一个,而另一个停止运行,然后决定让另一个节点继续运行。我需要确保运行的第一个节点在启动后更新。这是否一定要我有一个作为主人?集群中Mnesia主节点的重要性

%%%编辑.......................................... .................................

哦,我明白了。我使用的数据库有一些碎片表。一些片段已经在网络中分布以进行负载平衡。所以,一个主机上的Mnesia会尝试通过网络加载它们,并且会失败,因为另一个主机上的mnesia已经关闭了!

我想这与mnesia主节点没有任何关系。但我仍然很想理解相同的意义,因为我之前没有使用它,但是我总是玩分布式模式。再次

谢谢...

回答

4

的Mnesia主节点用于解决一个相当残酷的方式脑裂的情况。如果mnesia发现裂脑情况,它会发出一个事件,“运行分区网络”。对此做出响应的一种方法是将主节点设置为要保留的“岛”,然后重新启动其他节点。当它们恢复时,它们将无条件地从主节点加载表。

mnesia中有另一种机制,称为force_load。一个人应该非常小心,但是在有两个节点A和B的情况下,终止B(A日志B为关闭),然后终止A,然后重新启动B,B将不知道A何时停止,所以会拒绝加载在A上有副本的表。如果你知道A很快就不会回来,你可以选择在B上调用mnesia:force_load_tables(Ts),这会导致它以它自己的副本运行。一旦A恢复正常,它会检测到B已启动,并会从中加载表格。正如您所看到的,还有其他几种可能导致数据库不一致的情况。 Mnesia不会解决这个问题,但会尝试提供工具来解决这种情况。在上面的情况中,不幸的是,mnesia会给你提示,但是可以创建一个检测问题的应用程序。

+0

谢谢user6834 – 2010-10-11 10:39:51

+0

uwiger,谢谢。你认为(在未来),mnesia会根据最近的更新机制或某种类型的签名来合并两个副本,特别是当检测到“正在运行的分区网络”致命错误时? – 2011-05-31 16:06:25

+1

今天可以做到这一点,虽然没有非常好的记录或在所有部分进行测试。 http://github.com/esl/unsplit是一个在netsplits之后自动合并mnesia表的库。最近的mnesia版本已被仔细地增强以支持这一点,并且R14B03还增加了一种法定检查形式('多数')来减少难以解决的不一致性的风险。 – uwiger 2011-06-11 14:26:33