我如何 运行 具有 OTP-23.1 和 R15B03-1 的节点集群?

How do I run a cluster of nodes with both OTP-23.1 and R15B03-1?

我有一个分布式 Erlang 节点集群 运行 R15B03-1。我开发了新代码,我想将其发布到新节点上并将它们放入当前集群中。我如何以节点 运行 R15B03-1 和 OTP 23.1 之间的分发协议兼容的方式启动我的新节点 运行 版本 OTP 23.1?

这是不可能的。尝试建立这样的连接会导致此错误消息:

=ERROR REPORT==== 30-Nov-2020::22:24:57.725297 ===
** new@localhost: Connection attempt from node old@localhost rejected since it cannot handle
   ["BIG_CREATION",
    "UTF8_ATOMS"].**

节点早于 Erlang/OTP 20 19 无法连接到节点 运行 版本 23。一般来说,只承诺分发协议的向后兼容性两个方向的两个主要版本。


an option, +R,设置“兼容模式”:

The distribution mechanism is not backward compatible by default. This flag sets the emulator in compatibility mode with an earlier Erlang/OTP release ReleaseNumber. The release number must be in the range <current release>-2..<current release>.

但实际上这个标志目前并没有打开任何兼容性功能(参见 R16B 中的 the source code), and it hasn't done so since compatibility for R9 was removed。无论如何,由于它只允许返回 2 个主要版本,因此 R15B 和 21 仍然相差太远。

这个标志实际上不控制任何功能的原因是现在分发协议更多地依赖于功能协商。例如,从 20 开始的所有版本都支持 UTF-8 原子特性,如果另一个节点要求它们这样做,它们会准备好使用它,但只有在版本 23 中,此特性才成为强制性的。因此,无需任何手动配置即可在 ±2 个主要版本中实现兼容性 "compatibility window".


我想我会通过实验来测试它,使用我在本地安装的每个 Erlang 版本(使用 ASDF)启动一个节点并让它们尝试相互连接:

erlang_versions=$(asdf list erlang)
for x in $erlang_versions; do
  ~/.asdf/installs/erlang/$x/bin/erl -sname ${x//./-}@localhost -eval '
      timer:sleep(10000),
      {ok, Pairs} = net_adm:names(),
      [io:format("~p ~p ~p~n", [net_adm:ping(list_to_atom(Name++"@localhost")), node(), Name++"@localhost"])
        || {Name, _Port} <- Pairs],
      timer:sleep(10000),
      init:stop()' -noinput &
done

结果在table下面。似乎版本 19 是最早可以连接到版本 23 的版本。

Connecting to \ from R15B03-1 R16B03 17-5-3 18-3 19-1 19-3 20-3 20-3-8-11 21-0 21-0-4 21-2-2 21-3-8-1 21-3-8-2 22-0-2 22-0-4 22-0-7 22-1-1 22-1-2 22-2-8 22-3 22-3-3 23-0-2 23-0-rc3
R15B03-1 - yes yes yes yes yes no no no no no no no no no no no no no no no no no
R16B03 yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes no no
17-5-3 yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes no no
18-3 yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes no no
19-1 yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes
19-3 yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes
20-3 no yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes
20-3-8-11 no yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes
21-0 no yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes yes
21-0-4 no yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes yes
21-2-2 no yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes yes
21-3-8-1 no yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes yes
21-3-8-2 no yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes yes
22-0-2 no yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes yes
22-0-4 no yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes yes
22-0-7 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes yes
22-1-1 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes yes
22-1-2 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes yes
22-2-8 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes yes
22-3 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes yes
22-3-3 no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes yes
23-0-2 no no no no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes - yes
23-0-rc3 no no no no yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes yes -

编辑:检查 legoscia 的答案,因为它是正确的,我会把它留在这里供参考

您需要查看 External Term Format 以了解两个版本与您的代码之间可能存在的不兼容性(在该页面中搜索 OTP)。我不确定如果一个节点 运行 一个旧的 OTP 收到一些关于它不知道的某种类型的消息会发生什么。

也许将当前代码部署在 OTP23 中然后在所有机器都具有相同的 OTP 版本时添加新代码会更安全?