【发布时间】:2021-03-12 06:30:18
【问题描述】:
我有一个运行 R15B03-1 的分布式 Erlang 节点集群。我开发了新代码,我想将其发布到新节点上并将它们放在当前集群中。如何启动运行 OTP 23.1 版本的新节点,以使运行 R15B03-1 和 OTP 23.1 的节点之间的分发协议兼容?
【问题讨论】:
标签: erlang distributed-system erlang-otp
我有一个运行 R15B03-1 的分布式 Erlang 节点集群。我开发了新代码,我想将其发布到新节点上并将它们放在当前集群中。如何启动运行 OTP 23.1 版本的新节点,以使运行 R15B03-1 和 OTP 23.1 的节点之间的分发协议兼容?
【问题讨论】:
标签: erlang distributed-system erlang-otp
这是不可能的。尝试建立这样的连接会导致此错误消息:
=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,设置“兼容模式”:
默认情况下分发机制不向后兼容。此标志将模拟器设置为与早期 Erlang/OTP 版本
ReleaseNumber的兼容模式。版本号必须在<current release>-2..<current release>范围内。
但事实上,这个标志目前并没有开启任何兼容性功能(参见the source code),并且自从R16B 中的compatibility for R9 was removed 以来它还没有开启任何兼容性功能。无论如何,由于它只允许返回 2 个主要版本,因此 R15B 和 21 仍然相距甚远。
此标志实际上不控制任何功能的原因是,如今分发协议更多地依赖于功能协商。例如,从 20 开始的所有版本都支持 UTF-8 atom 功能,因为如果另一个节点要求他们这样做,他们将准备使用它,但只有在 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
结果如下表所示。似乎第 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 的节点收到一些关于它不知道的某种类型的消息会发生什么。
当所有机器都具有相同的 OTP 版本时,将您当前的代码部署在 OTP23 中然后添加新代码可能更安全?
【讨论】:
+R ReleaseNumber 来确保我兼容吗? erlang.org/doc/man/erl.html
+R 选项只能带您返回 2 个主要版本,因此 15 和 21 相差太大。 (事实上,这个选项目前没有做任何事情;我在答案中添加了一些细节)