我正在使用复制的mnesia数据库运行两个erlang节点。每当我尝试启动其中一个而mnesia不在另一个上运行时,mnesia:wait_for_tables(?TABS,?TIMEOUT)将挂在它调用的节点上。我需要有一个结构(如果两个节点都没有运行),我可以开始使用一个而另一个停止运行,然后决定将另一个运行起来但继续运行良好。我需要确保正在运行的第一个节点在启动时更新了后一个节点。这是否一定要我让一个人作为主人?
%%%已编辑........................................... ................................
哦,我知道了。我使用的数据库有几个碎片表。一些片段已经分布在整个网络中以实现负载平衡。因此,一个主机上的Mnesia会尝试通过网络加载它们并因为另一个主机上的mnesia停机而失败!
我猜这与mnesia主节点无关。但是我仍然很想理解它的重要性,因为我之前没有使用它,但是,我总是使用分布式模式。
再次感谢...
答案 0 :(得分: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不会给你任何提示,但是可以创建一个检测问题的应用程序。