集群中一个 Mnesia Master Node 的意义是啥
Posted
技术标签:
【中文标题】集群中一个 Mnesia Master Node 的意义是啥【英文标题】:What is the significance of a Mnesia Master Node in a cluster集群中一个 Mnesia Master Node 的意义是什么 【发布时间】:2011-04-04 03:46:08 【问题描述】:我正在使用复制的 mnesia 数据库运行两个 erlang 节点。每当我尝试启动其中一个而 mnesia 未在另一个上运行时,mnesia:wait_for_tables(?TABS,?TIMEOUT) 会挂在调用它的节点上。我需要有一个结构(如果两个节点都没有运行),我可以在另一个节点关闭时开始使用一个节点,然后决定启动另一个节点但继续正常工作。我需要确保正在运行的第一个节点在稍后启动时已更新。这是否一定要求我有一个作为主人?
%%% 已编辑.................................................. ....................
哦,我知道了。我使用的数据库有几个零散的表。一些片段已经分布在网络上以实现负载平衡。因此,一台主机上的 Mnesia 会尝试通过网络加载它们,但由于另一台主机上的 mnesia 已关闭而失败!
我猜这与 mnesia 主节点无关。但我仍然很想了解它的意义,因为我以前没有使用过它,但我总是使用分布式模式。
再次感谢...
【问题讨论】:
【参考方案1】: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 不会给你任何提示,但是可以创建一个检测问题的应用程序。
【讨论】:
uwiger,谢谢。您是否认为(在未来),mnesia 将有一种基于最近更新机制或某种时间签名合并两个副本的方法,尤其是在检测到“运行分区网络”致命错误时? 这在今天是可能的,尽管没有很好的文档记录或所有部分的测试。 github.com/esl/unsplit 是一个用于在 netsplits 后自动合并 mnesia 表的库。最近的 mnesia 版本经过精心增强以支持这一点,R14B03 还添加了一种仲裁检查(“多数”)形式,以降低难以解决的不一致的风险。 我很想将 unsplit 与 ejabberd 一起使用......但我不知道从哪里开始! Ulf / 任何人 - 有没有关于我没有找到的文档?以上是关于集群中一个 Mnesia Master Node 的意义是啥的主要内容,如果未能解决你的问题,请参考以下文章