从网络分区进行在线记忆恢复[关闭]

Posted

技术标签:

【中文标题】从网络分区进行在线记忆恢复[关闭]【英文标题】:Online mnesia recovery from network partition [closed] 【发布时间】:2010-10-12 02:15:15 【问题描述】:

是否可以在不重新启动任何相关节点的情况下从 mnesia 集群中的网络分区中恢复?如果是这样,如何处理?

我特别想知道:

如何使用标准 OTP mnesia (v4.4.7) 完成此操作 如果有人需要编写什么自定义代码来实现这一点(例如订阅 mnesia running_paritioned_network 事件,确定新的主服务器,将非主服务器的记录合并到主服务器,从新主服务器强制加载表,清除正在运行的分区网络事件 -- 示例代码将不胜感激)。 或者,mnesia 绝对不支持在线恢复,需要重新启动属于非主分区的节点。

虽然我很欣赏一般分布式系统理论的指针,但在这个问题上,我只对 erlang/OTP mnesia 感兴趣。

【问题讨论】:

@Gortok: infoq.com/news/2007/08/mnesia 【参考方案1】:

经过一些实验,我发现了以下内容:

如果两个节点之间存在节点断开连接和重新连接而没有重新启动 mnesia,则 Mnesia 认为网络是分区的。 即使在断开连接期间没有发生 Mnesia 读/写操作也是如此。 必须重新启动 Mnesia 本身才能清除分区网络事件 - 网络分区后不能force_load_table。 仅需要重新启动 Mnesia 才能清除网络分区事件。您不需要重新启动整个节点。 Mnesia 通过让新重新启动的 Mnesia 节点用来自另一个 Mnesia 节点的数据覆盖其表数据来解决网络分区问题(启动表加载算法)。 通常节点会从运行时间最长的节点复制表(这是我看到的行为,我还没有证实这是明确编码的,而不是其他东西的副作用)。如果你从集群中断开一个节点,在两个分区(断开的节点和它的旧对等节点)中进行写入,关闭所有节点并重新启动它们,首先启动断开的节点,断开的节点将被认为是主节点和它的数据将覆盖所有其他节点。没有表比较/校验和/仲裁行为。

所以要回答我的问题,可以通过在您决定丢弃其数据的分区(我将其称为丢失分区)中的节点上执行mnesia:stop(), mnesia:start() 来执行半在线恢复。执行mnesia:start() 调用会导致节点联系到分区另一端的节点。如果丢失分区中有多个节点,您可能希望将主节点设置为将表加载到获胜分区中的节点 - 否则我认为它有可能从丢失分区中的另一个节点加载表,因此返回分区网络状态。

不幸的是,mnesia 不支持在启动表加载阶段合并/协调表内容,也不支持在启动后返回表加载阶段。

合并阶段尤其适用于 ejabberd,因为该节点仍然具有用户连接,因此知道它拥有/应该是最新的用户记录(假设每个集群有一个用户连接)。如果存在合并阶段,节点可以过滤用户数据表,保存连接用户的所有记录,照常加载表,然后将保存的记录写回 mnesia 集群。

【讨论】:

不要让我接受我自己的答案阻止你 - 我想要更好的解决方案或更正。 你看到乌尔夫的未分裂了吗? github.com/esl/unsplit【参考方案2】:

它是这样工作的。想象一下满天飞鸟。拍照,直到你得到所有的鸟。 把图片放在桌子上。将图片相互映射。所以你看到每只鸟一次。你看到每只鸟吗?好的。那你知道,那个时候。系统稳定。 记录所有鸟儿的声音(信息)并拍摄更多照片。然后重复。

如果你有一个节点拆分。返回到最新的常用稳定快照。并尝试** 重播之后附加的内容。 :)

更好地描述在 “分布式快照:确定分布式系统的全局状态” K. MANI Chandy 和 LESLIE LAMPORT

** 我认为在尝试重播发生的事情时决定谁的时钟存在问题

【讨论】:

理论上可以排除一般情况下的自动解决方案,但我并不要求这样做。我很乐意让人类做出决定来打破关系、挑选主人、丢失数据等。我想知道 mnesia 大师是否可以在不重启节点的情况下从分区中恢复(但手动)。【参考方案3】:

Sara 的回答很棒,甚至可以查看有关 CAP 的文章。 Mnesia 开发人员为 CA 牺牲了 P。如果你需要 P,那么你应该选择你想要牺牲的 CAP,而不是选择另一个存储。例如CouchDB(牺牲 C)或Scalaris(牺牲 A)。

【讨论】:

这是废话;你不能“牺牲P”。具有分区的网络中唯一的选项是 CP 或 AP。 Mnesia 不是那些(在碎片表的上下文中 - 它可能是非碎片表的 CP。)

以上是关于从网络分区进行在线记忆恢复[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

VB 让窗口位置及大小有记忆功能

直观理解LSTM(长短时记忆网络)

理解长短期记忆网络

唤起你对c#曾经的记忆

长短记忆神经网络

LSTM(长 短期记忆网络)简单理解