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