是否可以从mnesia群集中的网络分区恢复而无需重新启动任何涉及的节点?如果是这样,那怎么办呢?
我特别感兴趣的是:
虽然我很欣赏一般分布式系统理论的指针,但在这个问题上,我只对erlang / OTP mnesia感兴趣。
答案 0 :(得分:15)
经过一些实验,我发现了以下内容:
force_load_table
。因此,为了回答我的问题,可以通过在您决定丢弃其数据的分区中的节点上执行mnesia:stop(), mnesia:start()
来执行半在线恢复(我将其称为丢失分区)。执行mnesia:start()
调用将导致节点联系分区另一侧的节点。如果丢失分区中有多个节点,您可能希望将表加载的主节点设置为获胜分区中的节点 - 否则我认为它有可能从丢失分区中的另一个节点加载表,从而返回分区网络状态。
不幸的是,mnesia不支持在启动表加载阶段合并/协调表内容,也不提供在启动后返回表加载阶段。
合并阶段特别适合ejabberd,因为节点仍然具有用户连接,因此知道它拥有/应该是最新的用户记录(假设每个群集有一个用户连接)。如果存在合并阶段,则节点可以过滤用户数据表,保存连接用户的所有记录,按常规加载表,然后将保存的记录写回mnesia集群。
答案 1 :(得分:0)
它的工作原理如下。想象一下充满了鸟儿的天空。拍照,直到你得到所有的鸟。 将图片放在桌子上。将图片映射到彼此上。所以你一次看到每只鸟。你是每只鸟吗?好。那时你就知道了。系统稳定。 记录所有鸟类的声音(消息)并拍摄更多照片。然后重复一遍。
如果您有节点拆分。返回最新的常见稳定快照。并尝试**重播之后附加的内容。 :)
更好地描述了 “分布式快照:确定分布式系统的全局状态” K. MANI CHANDY和LESLIE LAMPORT
**我认为在尝试重播发生的事情时,确定谁的时钟是有问题的
答案 2 :(得分:0)