Erlang VM实例又叫做节点。一旦两个或两个以上的Erlang节点能够互相感知,我们就说它们形成了一个集群。默认情况下,Erlang集群是一个全联通网络。
只要给erl加上命令行参数-name(长名称)或-sname(短名称)就可以以分布式模式启动Erlang节点。
长名称方式会以你起的名字加上本机的主机名形成一个完全限定域名(fully qualified domain names)形式的节点名。例如,本机主机名为'john.example.com',-name后的参数为'node1',则该节点的名称为'node1@john.example.com'。
以长名称或短名称启动,shell左边的提示字符串里包含了节点名,也可以在shell上输入'node()'查看。没有使用长名称或短名称启动,节点名为'nonode@nohost'。
短名称方式,就不会形成完全限定域名形式的节点名。还是以上述为例,-sname后的参数为'node2',则该节点的名称为'node2@john '。
采用短节点名和长节点名的节点所处的通信模式是不同的,它们之间无法形成集群。无论采用长名称或短名称,单台主机上的'@'前的名称不能相同,否则会崩溃。
一个节点不会主动检测其他节点。必须由应用告知本节点去连接某个其他节点。然而一旦探测到了别的节点,本节点便会跟踪它们并与之交换已经和自己建立了连接的其他节点的信息,从而促成全联通网络的形成。例如,假设节点A和B组成了一个集群,C和D组成了一个集群,如果A和D相遇,它们就会互相交换B和C的信息,最终4个节点会共同形成一个更大的网络。内置函数nodes()告诉你本节点连接上的其他节点。
EPMD代表Erlang端口映射守护进程(Erlang Port Mapper Daemon)。你每启动一个节点,它都会检查本地机器上是否运行着EPMD(开机是不会启动的),如果没有,节点就会自动启动EPMD。EPMD会追踪在本地机器上运行的每个节点,并记录分配给它们的端口。当一台机器上的Erlang节点试图与某远程节点通信时,本地的EMPD就会联络远程机器上的EMPD(默认使用TCP/IP,端口为4369),询问在远程机器上有没有叫相应名字的节点。如果有,远程的EMPD就会回复一个端口号,通过该端口便可以与远程节点通信。
本地节点如何知道远程节点所在的主机地址的?个人猜想和节点名称'@'后面的域名部分有关。可能通过系统API,gethostbyname(域名),获得远程节点的主机的IP地址。
分布式Erlang实现了一个简单的安全机制,防止未授权的远程机器上的节点访问本机节点。这个安全机制要求集群里的所有Erlang节点必须有相同的magic cookie。最简单的做法是在你的home目录(Windows下,被环境变量$HOME所指示,Unix下,cd命令所指示)下生成一个.erlang.cookie文件。该.erlang.cookie需要包含相同的一行atom。例如:
$ cd
$ cat > .erlang.cookiethis_is_very_secret
$ chmod 400 .erlang.cookie
Unix环境下,.erlang.cookie文件只能够被所有者读,这是强制要求的。