Erlang确保Mnesia架构复制

时间:2016-06-25 22:29:38

标签: erlang synchronization schema replication mnesia

我有一个分布式应用程序。 在此,主节点启动具有4个表的mnesia模式。其中一些被复制到其他节点,有些则没有。 当一个节点产生时,它在主节点上注册并被添加到模式中,数据被复制到该节点。

如何确保复制完成? 我尝试了以下方法:

Timeout=60000,
TabList = [tab1, tab2, tab3, tab4],
mnesia:wait_for_tables(TabList, Timeout).

然而,在我收到错误之前,它不需要60秒,甚至不需要5秒:

{{badmatch,{aborted,{no_exists,tab1}}}

显然它不起作用..

当新节点加入群集时,来自主节点的rpc调用会在新节点上执行以下功能:

start_Mnesia(MasterNode) ->
mnesia:start(),
mnesia:change_config(extra_db_nodes, [MasterNode]),
Tabs=mnesia:system_info(tables) -- [schema], 
[mnesia:add_table_copy(Tab, node(), ram_copies) || Tab <- Tabs].

是否还要等到写入ram_copies?

感谢。

1 个答案:

答案 0 :(得分:1)

当一个节点加入你的mnesia集群时,它已经被同步,无论它或其他节点的表副本有没有。

您应该看到新节点在向主节点注册并添加到集群后,已经可以访问所有表。无论该副本的状态/阶段如何,添加表的副本都不会改变它。

在新节点上添加表的副本时,可以在复制期间和之后继续运行事务,并且将或未复制到发起事务的节点的数据对正确性的正确性没有影响。结果。

因此,如果您只关心保持交易ACID的同步,那么请不要担心。

如果您担心何时实际复制数据并将数据安全地存储在其他节点上,那就不一样了。在这种情况下,我观​​察到当你运行mnesia:add_table_copy(Table, NewNode, disc_copies)时它会阻塞,并且仅在NewNode将数据复制到文件系统时返回。

请记住,除非您在事务完成后无法保证数据实际存在于任何光盘上,否则您将始终运行mnesia:sync_transaction/3