2016-05-23 44 views
4

我正在编写分布式mnesia应用程序并使用模式。 当一个新节点加入集群时,它是由一个RPC调用(从中开始模式中的masternode)加入到Mnesia模式运行于以下功能:Erlang:如何从Mnesia集群中删除节点

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]. 

当节点崩溃或断开时,主节点收到一个nodedown事件,并且该节点应该从群集中删除。我怎样才能做到这一点?

编辑: 我结束了以下解决方案: TabList是我的节点正在使用的模式中的所有表的列表。

Mnesia的:del_table_copy(标签列表,节点)

+0

为什么要删除此节点?当它回来时,它将重新加入mnesia集群。 – user425720

+0

当一个节点发生故障时,另一个(备份)节点启动并完成他的工作。因此,我需要旧节点(下降)离开集群,并且它应该在重新加入时设置为干净。 (然后他将成为备份节点,直到另一个节点失败) – muehsi

+0

你有一个答案 - 所以我不会添加任何东西。事情是,我有这样的印象,你可能会滥用mnesia。本地表将不够用?你需要集群吗? – user425720

回答

1

This should do what you want。根据文档:

del_table_copy(Tab,Node) - > {aborted,R} | {atomic,ok}

删除节点Node处的表Tab的副本。当使用此功能删除最后一个副本 时,该表完全消失。

该函数也可用于删除名为 模式的表的副本。 Mnesia节点然后被删除。注意Mnesia必须先在节点上停止 。

+0

我会尝试这一点,在此先感谢。 – muehsi