【问题标题】:How build a very large cluster with Erlang?如何用 Erlang 构建一个非常大的集群?
【发布时间】:2014-05-11 12:25:46
【问题描述】:

我是 Erlang 的新手。在 Erlang 中,节点由一个原子表示,例如 'name@host'。我想问一个节点如何在不增加原子数的情况下与其他节点通信?

我想构建一个可能包含数千个节点的分布式存储系统。 对于指定的节点A,它可以向集群中的任何其他节点发送/接收消息,例如:

rpc:call(Node, Module, Method, [])

但是随着节点加入和离开集群,节点A可能已经与数千个节点通信, 这样,节点 A 的 atom 数量就会不断增加,最终达到极限。 如何避免这种情况发生? 如果我使用 Pid 而不是 Node 进行通信,例如,

Pid ! Message

这种方式会增加节点 A 中的原子数吗?据说Pid中包含了远程节点的信息。

【问题讨论】:

  • 请注意标签不是关键字。在标签列表中塞满与您的问题相同的词(规模、大、数字)将无助于对其进行分类。请务必阅读选择标签时出现的说明!
  • "Cluster" 在 Erlang 中有着非常特殊的含义。您可以使用 TCP 或 UDP 将节点联网而不是集群。

标签: erlang


【解决方案1】:

原子的最大数量是 1048576,你可以用 +t 来增加它。见:erlang docs

你没有机会达到 erlang 集群的极限。如果您要扩展到数千到数百万的范围,您很可能有几个单独的集群。

分布式 Erlang 使用节点之间的 tcp 心跳保持集群活跃。您可能真的不希望单个集群超过几千个节点。

【讨论】:

  • 在一个真实的系统中,是的,你是对的,几乎没有机会达到原子数的极限,原子数可以设置为一个非常大的数。但是,从理论上讲,如果节点 A 继续与可以加入或离开集群的不同节点通信,则节点 A 会在一段时间内崩溃。如何避免这种情况?
  • 你没有。目前全局原子表没有被垃圾回收(除非 R17 添加了这个)。另外,请记住,如果节点不断来来去去,当进程/主机重新启动时,表仍然会清除。一个节点不太可能运行很长时间而不重新启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多