How can I connect two Erlang/Elixir-nodes of two different machines via network connection?
2 回答
您必须命名您的节点并在两个节点上使用相同的 cookie。
在机器 1 中:
iex --name node1@machine1.com --cookie a_cookie_string
在机器 2 中:
iex --name node2@machine2.com --cookie a_cookie_string
现在两台机器可以通信了。要对其进行测试,您可以在 machine1 上执行以下操作:
iex(node1@machine1.com)1> Node.connect :"node2@machine2.com"
true
iex(node1@machine1.com)2> print_node_name = fn -> IO.puts Node.self end
#Function<erl_eval.20.80484245>
iex(node1@machine1.com)3> Node.spawn(:"node2@machine2.com", print_node_name)
node2@machine2.com
#PID<7789.49.0>
域名machine1.com
和machine2.com
机器的IP地址也可以更改。
如果您尝试通过代码连接节点:您需要将正在运行的代码变成分布式节点。为此运行Node.start(:fullNameOfServer)
。
例如:如果你的 IP 是 192.168.0.1,你可以有一个完整的节点名称,如:"foo@192.168.0.1"
一旦你把你的节点变成一个分布式节点,你就可以设置 cookie:
Node.set_cookie :cookie_name
最后,您需要与远程节点建立连接。(您还需要远程节点上的 Node.start 和 Node.set_cookie)为此,您需要远程节点的名称。让我们假设远程节点的名称是 bar@192.168.0.2(假设该节点是同一本地网络上的另一台计算机)。执行此操作的代码看起来像Node.connect :"bar@192.168.0.2"
您现在可以运行 Node.list 来查看bar@192.168.0.2
可用的foo@192.168.0.1
,反之亦然。
总结以上几点,您的代码应该类似于
在 Foo 机器上
Node.start :"foo@192.168.0.1" #this is the IP of the machine on which you run the code
Node.set_cookie :cookie_name
Node.connect "bar@192.168.0.2"
在酒吧机器上
Node.start :"bar@192.168.0.2"
Node.set_cookie :cookie_name