分布式长生不老药示例不起作用



我有一个非常简单的Elixir代码示例,我想在不同的节点上运行。

第一个节点在我的笔记本电脑上,第二个是树莓派,通过SSH访问。

代码很简单:

# node1@my-computer
defmodule Hello do
    def world, do: IO.puts "hello world"
end
# node2@raspberrypi
iex> Node.spawn_link :"node1@my-computer", fn -> Hello.world end

我期望Node.spawn_link会在树莓派上打印"hello world",但它显示了一个错误,说** (EXIT from #PID<0.66.0>) no connect

在具有两个不同iex实例的同一台机器上,这段代码运行得很好。

我用iex --sname node1 --cookie secretnode1上开始IEx会话,用iex --sname node2 --cookie secretnode2上开始IEx会话。

同样值得注意的是,在我的树莓派上,iex以这个警告开始:

warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell) Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)

我认为您需要将@符号放在节点名称中,以使它们被解释为单独的网络机器

iex --name node@machinename1 --cookie mycookie
iex --name node@machinename2 --cookie mycookie

然后在第一个iex shell中连接节点:

Node.connect :"node@machinename2"

注意冒号语法,它将节点名变成一个elixir原子。由于@符号,需要引号。如果遇到问题,可以先尝试使用原始ip地址的机器名,然后再尝试dns名称注:我用--name而不是你的--sname

最新更新