是否可以从mnesia集群中的网络分区恢复而无需重新启动任何涉及的节点?如果是这样,那怎么办呢?
我特别感兴趣的是:
虽然我很欣赏一般分布式系统理论的指针,但在这个问题上,我只对erlang/OTP mnesia感兴趣.
arc*_*lus 15
经过一些实验,我发现了以下内容:
force_load_table在网络分区后无法重新启动.因此,为了回答我的问题,可以通过mnesia:stop(), mnesia:start()在您决定丢弃其数据的分区中的节点上执行来执行半在线恢复(我将其称为丢失分区).执行mnesia:start()调用将使节点联系分区另一侧的节点.如果丢失分区中有多个节点,您可能希望将表加载的主节点设置为获胜分区中的节点 - 否则我认为它有可能从丢失分区中的另一个节点加载表,从而返回分区网络状态.
遗憾的是,mnesia不支持在启动表加载阶段合并/协调表内容,也不提供在启动后返回表加载阶段.
合并阶段特别适合于ejabberd,因为节点仍然具有用户连接,因此知道它拥有/应该是哪个用户记录是最新的(假设每个群集有一个用户连接).如果存在合并阶段,则节点可以过滤用户数据表,保存连接用户的所有记录,按常规加载表,然后将保存的记录写回mnesia集群.
| 归档时间: |
|
| 查看次数: |
3564 次 |
| 最近记录: |