【问题标题】:Erlang: How to remove node from Mnesia clusterErlang:如何从 Mnesia 集群中删除节点
【发布时间】:2016-09-20 12:20:58
【问题描述】:

我正在编写一个分布式记忆应用程序并使用模式。 当一个新节点加入集群时,它会通过 rpc 调用(从启动模式的主节点)添加到 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(TabList, Node)

【问题讨论】:

  • 为什么要删除这个节点?当它恢复时,它将重新加入 mnesia 集群。
  • 当一个节点发生故障时,另一个(备份)节点将启动并完成他的工作。因此,我需要旧节点(已关闭)离开集群,并且在它再次加入时应该设置干净。 (然后他将成为一个备份节点,直到另一个节点发生故障)
  • 你有一个答案 - 所以我不会添加任何东西。问题是,我的印象是你在这种情况下可能滥用了记忆力。本地表还不够吗?你需要集群吗?
  • 是的,我需要集群,因为我正在编写一个分布式应用程序,需要在不同节点之间交换信息。
  • 你让它工作了吗?怎么样?

标签: erlang schema distributed mnesia


【解决方案1】:

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

del_table_copy(Tab, Node) -> {aborted, R} | {原子的,好的}

删除节点Node处表Tab的副本。当最后一个副本 用这个函数删除,表格就完全消失了。

这个函数也可以用来删除一个名为的表的副本 架构。然后删除 Mnesia 节点。请注意,Mnesia 必须是 先停在节点上。

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2011-04-11
    • 2016-07-09
    • 1970-01-01
    • 2018-07-19
    • 2019-03-05
    • 1970-01-01
    • 2021-01-22
    • 2010-10-21
    相关资源
    最近更新 更多