【问题标题】:Erlang: How can I remove a node from other nodes' nodes()?Erlang:如何从其他节点的节点()中删除节点?
【发布时间】:2011-02-22 14:24:15
【问题描述】:

我想动态地模拟erl -sname example -hidden 的行为。如何使节点在集群中不可见?

请参阅@Mwt at @Yasir Arsanukaev 的 cmets,以进一步了解我正在尝试做的事情。

【问题讨论】:

    标签: networking configuration erlang cluster-computing erlang-otp


    【解决方案1】:

    试试erlang:disconnect_node/1:

    (bar@dt)1> nodes().
    []
    (bar@dt)2> net_adm:ping('foo@dt').          
    pong
    (bar@dt)3> nodes().               
    [foo@dt]
    (bar@dt)4> erlang:disconnect_node('foo@dt').
    true
    (bar@dt)5> nodes().                         
    []
    

    或者如果你想让一个节点从其他节点的nodes()中删除自己:

    (bar@dt)1> nodes().
    [foo@dt]
    (bar@dt)2> rpc:eval_everywhere(erlang, disconnect_node, [node()]).
    abcast
    (bar@dt)3> nodes().
    []
    

    如果节点以密钥 -hidden 启动:

    (bar@dt)1> nodes(hidden).
    [foo@dt]
    (bar@dt)2> rpc:eval_everywhere(nodes(hidden), erlang, disconnect_node, [node()]).
    abcast
    (bar@dt)3> nodes(hidden).
    []
    

    【讨论】:

    • 不幸的是,这并没有达到我的预期。当您将节点启动为隐藏然后 ping 它时,它不会显示在节点()中。使用上面的方法,如果断开后再次ping,节点会再次出现在nodes()中。
    • @mwt: nodes/1 有其他参数可供您选择:visiblehiddenconnectedthisknownping/1 的目的是尝试“..建立与Node 的连接。如果失败则返回pang,如果成功则返回pong。”我认为您可以使用这些原语来实现所需的行为。
    • 也许,但我还不太明白怎么做。现在,我有一个集群。每当有新节点加入时,它都会尝试通过 ping 连接集群中的每个节点。如果这些节点之一是隐藏的,则 ping 不会将新节点连接到隐藏节点,这正是我想要的。但是,仅断开我想要隐藏的节点就可以通过直接 ping 连接它,然后它再次出现在 nodes() 中。现在,如果有一种方法可以改变节点的状态,即使在直接 ping 之后,使用任何参数调用 nodes() 仍然会排除它,我想知道这种方法是什么。
    • 上面,当我说“使用任何参数调用nodes()”时,我的意思是“使用一些参数调用nodes()”。例如,如果有一种方法可以使节点不显示在节点(可见)中,即使节点 net_adm:ping() 彼此也不会显示,那么这很完美,因为类似于 -隐藏的行为。
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多