我如何 运行 具有 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 版本时添加新代码会更安全?
我有一个分布式 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 版本时添加新代码会更安全?