Erlang 确保 Mnesia 模式复制

Erlang ensure Mnesia schema replication

我有一个分布式应用程序。 在此,主节点启动一个包含 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?

谢谢。

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

您应该看到一个新节点在向您的主节点注册并添加到集群后,已经可以访问您所有的 table。添加 table 的副本不会改变这一点,无论该副本的 state/stage 是什么。

当您在新节点上添加 table 的副本时,您可以在复制期间和之后继续 运行 事务,以及复制或不复制到原始节点的数据交易不会影响结果的正确性。

因此,如果您只关心保持事务 ACID 方面的同步,那么请不要担心。

如果您担心您的数据何时被实际复制并安全地存储在其他节点上,那就是另一回事了。在这种情况下,我观​​察到当您 运行mnesia:add_table_copy(Table, NewNode, disc_copies) 时它会阻塞,而 returns 只有当 NewNode 将数据复制到文件系统时才会阻塞。

不过请记住,除非您一直 运行 mnesia:sync_transaction/3,否则您无法保证在交易完成后数据实际存在于任何光盘上。