9

我正在使用复制的 mnesia 数据库运行两个 erlang 节点。每当我尝试启动其中一个而 mnesia 未在另一个上运行时,mnesia:wait_for_tables(?TABS,?TIMEOUT) 会挂在调用它的节点上。我需要有一个结构(如果两个节点都没有运行),我可以在另一个节点关闭时开始使用一个节点,然后决定启动另一个节点但继续正常工作。我需要确保正在运行的第一个节点在稍后启动时已更新。这是否一定要求我有一个作为主人?

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

哦,我明白了。我使用的数据库有几个零散的表。一些片段已经分布在网络上以实现负载平衡。因此,一台主机上的 Mnesia 会尝试通过网络加载它们,但由于另一台主机上的 mnesia 已关闭而失败!

我想这与 mnesia 主节点无关。但是我仍然很想了解它的意义,因为我以前没有使用过它,但是,我总是使用分布式模式。

再次感谢...

4

1 回答 1

5

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

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

于 2010-10-10T16:22:38.953 回答