【问题标题】:How do I run a cluster of nodes with both OTP-23.1 and R15B03-1?如何使用 OTP-23.1 和 R15B03-1 运行节点集群?
【发布时间】:2021-03-12 06:30:18
【问题描述】:

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

【问题讨论】:

    标签: erlang distributed-system erlang-otp


    【解决方案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,设置“兼容模式”:

    默认情况下分发机制不向后兼容。此标志将模拟器设置为与早期 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 -

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我可以不使用+R ReleaseNumber 来确保我兼容吗? erlang.org/doc/man/erl.html
      • @2240 +R 选项只能带您返回 2 个主要版本,因此 15 和 21 相差太大。 (事实上​​,这个选项目前没有做任何事情;我在答案中添加了一些细节)
      猜你喜欢
      • 2017-01-08
      • 2017-06-03
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多