Erlang/OTP 分布式编程

Erlang/OTP 最初是爱立信为开发电信设备系统设计的编程语言平台,电信设备(路由器、接入网关、…)典型设计是通过背板连接主控板卡与多块业务板卡的分布式系统。

Erlang/OTP 语言平台的分布式程序,由分布互联的 Erlang 运行系统组成,每个 Erlang 运行系统被称为节点(Node),节点(Node) 间通过 TCP 互联,消息传递的方式通信:

image

节点(Node)

Erlang 节点由唯一的节点名称标识,节点间通过名称进行通信寻址。 例如在本机启动四个 Erlang 节点,节点名称分别为:

  1. erl -name node1@127.0.0.1
  2. erl -name node2@127.0.0.1
  3. erl -name node3@127.0.0.1
  4. erl -name node4@127.0.0.1

node1@127.0.0.1 控制台下建立与其他节点的连接:

  1. (node1@127.0.0.1)1> net_kernel:connect_node('node2@127.0.0.1').
  2. true
  3. (node1@127.0.0.1)2> net_kernel:connect_node('node3@127.0.0.1').
  4. true
  5. (node1@127.0.0.1)3> net_kernel:connect_node('node4@127.0.0.1').
  6. true
  7. (node1@127.0.0.1)4> nodes().
  8. ['node2@127.0.0.1','node3@127.0.0.1','node4@127.0.0.1']

epmd

epmd(Erlang Port Mapper Daemon) - Erlang 端口映射服务程序,在 Erlang 节点运行主机上自启动,负责映射节点名称到通信 TCP 端口号:

  1. (node1@127.0.0.1)6> net_adm:names().
  2. {ok,[{"node1",62740},
  3. {"node2",62746},
  4. {"node3",62877},
  5. {"node4",62895}]}

安全

Erlang 节点间通过一个相同的 cookie 进行互连认证。

Erlang 节点 Cookie 设置:

  1. 1. $HOME/.erlang.cookie 文件
  2. 2. erl -setcookie \<Cookie>

本节内容来自: http://erlang.org/doc/reference_manual/distributed.html Erlang/OTP 分布式编程 - 图2 (opens new window)

连接

Erlang 集群节点可通过 TCPv4, TCPv6 或 TLS 方式连接,EMQ X 支持在 etc/emqx.conf 中配置连接方式:

  1. ## Specify the erlang distributed protocol.
  2. ##
  3. ## Value: Enum
  4. ## - inet_tcp: the default; handles TCP streams with IPv4 addressing.
  5. ## - inet6_tcp: handles TCP with IPv6 addressing.
  6. ## - inet_tls: using TLS for Erlang Distribution.
  7. ##
  8. ## vm.args: -proto_dist inet_tcp
  9. node.proto_dist = inet_tcp
  10. ## Specify SSL Options in the file if using SSL for Erlang Distribution.
  11. ##
  12. ## Value: File
  13. ##
  14. ## vm.args: -ssl_dist_optfile \<File>
  15. ## node.ssl_dist_optfile = /ssl_dist.conf