17

我正在尝试使用 Erlang 作为将所有这些结合在一起的粘合剂来实现一个集群。我喜欢它创建一个完全连接的节点图的想法,但是在在线阅读不同的文章时,似乎这不能很好地扩展(最多有 50 - 100 个节点)。OTP 的开发人员是否故意施加此限制?我确实知道您可以将节点设置为仅具有显式连接以及具有隐藏节点等。但是,似乎默认的开箱即用设置不是很有可扩展性。

所以对于问题:

  1. 如果您有 5 个节点(A、B、C、D、E),它们都有明确的连接,例如 ABCDE。Erlang/OTP 是否允许 A 直接与 E 对话,或者 A 是否必须将消息从 B 传递到 D 才能到达 E,因此这就是全连接图的原因?同样,这是有道理的,但从我所看到的情况来看,它并不能很好地扩展。

  2. 如果要尝试使用可扩展且容错的系统,您有什么选择?似乎,如果由于节点太多而无法创建完全连接的图,那么下一个最好的方法就是创建某种树。但是,这似乎不是很容错,因为如果根或子节点的任何父节点死亡,您将失去集群的很大一部分。

  3. 在研究主管和工作人员时,我看到的所有示例都将其应用于单个节点上的进程。它可以应用于节点集群以帮助实现容错吗?

  4. 节点可以是多个集群的一部分吗?

感谢您的帮助,如果我错过了一个半近期的网站或博文(大约 1 年前),我很乐意查看这些。但是,我已经很好地搜索了互联网。

4

5 回答 5

12
  1. 是的,您可以将消息发送到集群中任何远程节点上的进程,例如,通过使用其进程标识符 (pid)。这称为位置透明度。是的,它可以很好地扩展(参见 Riak、CouchDB、RabbitMQ 等)。

  2. 请注意,一个节点可以运行数十万个进程。Erlang 已被证明是非常可扩展的,并且是为容错而构建的。还有其他构建更大的方法,例如 CloudI 的 SOA 方法(见评论)。如果您真的需要, 您也可以构建使用隐藏节点的集群。

  3. 在节点级别,您将采用不同的方法,例如,构建相同的节点,如果它们发生故障则易于替换,并且工作由其余节点接管。查看 Riak 如何处理这个问题(查看riak_core并查看博客文章介绍 Riak Core)。

  4. 节点可以离开和进入一个集群,但不能同时成为多个集群的一部分。连接的节点共享一个用于识别连接节点的集群 cookie。您可以在 VM 运行时设置 cookie(请参阅Distributed Erlang)。

阅读http://learnyousomeerlang.com/以获得更大的好处。

于 2012-11-03T22:11:16.513 回答
8

分发协议是关于提供稳健性,而不是可扩展性。您要做的是将集群分组为更小的区域,然后使用连接,这些连接不是在 Erlang 中分布,而是在 TCP 会话中。您可以运行 5 组,每组 10 台机器。这意味着这 10 台机器具有无缝的 PID 分布:您可以在另一台机器上调用一个 pid。但是分发到另一个组意味着你不能像这样无缝地解决这个组。

您通常需要 BGP 中的某种“路由反射”。

于 2012-11-03T21:06:06.850 回答
2

1)我认为您需要节点之间的直接连接才能在进程之间进行通信。但是,这确实意味着如果两个节点永远不会通信(例如,如果它们只是工作人员,而不是协调员),则您不需要所有节点之间的持久连接。

2)您可以创建一个不完全连接的erlang节点图。该文档很难找到,并且存在问题 - 您禁用了global处理集群中全局名称的系统,因此您必须通过本地注册的名称或远程节点上的本地注册名称来完成所有操作。或者只是使用 Pids,因为它们也可以工作。要像这样启动一个 erlang 节点,请使用erl ... -connect_all false .... 我希望你知道你在做什么,因为我不能相信自己能做到这一点。

事实证明,不完全连接的 erlang 节点图是当前的研究课题。RELEASE 项目目前正致力于此,并提出了 S-groups 的概念,S-groups 本质上是完全连接的组。但是,节点可以是多个 S-group 的成员,并且不同 s-group 中的节点不必完全连接,但可以根据需要建立连接以进行直接的节点到节点通信。值得寻找他们的演示文稿,因为这项研究非常有趣。

另一件值得指出的事情是,有几个人发现你可以在一个全连接的集群中获得多达 150-200 个节点。你真的有比这更多节点的用例吗?除非你有一个荒谬的项目要做,否则 150 到 200 台非常强大的计算机肯定会做你可以扔给他们的大部分事情。

3)虽然您不能使用 启动不同节点上的进程gen_server:start_link/3,4,但您当然可以非常轻松地调用外部节点上的服务器。似乎他们忽略了在外部节点上启动服务器的能力,但这可能是有充分理由的——比如错误案例数量多得离谱。

4) 尝试查看隐藏节点,并查看未完全连接的集群。它们应该允许您根据需要对节点进行分组。

TL;DR:扩展很难,我们去购物吧。

于 2012-11-04T12:12:25.550 回答
1

已经有一些很好的答案,所以我尽量简单。

1) 不,如果AE不直接连接,A则无法与 交谈E。分发协议在直接 TCP 连接上运行 - 不包括路由。

2)我认为树结构已经足够好了——权衡总是存在的。

3) 没有“节点主管”,而是erlang:monitor_node你的朋友。

4) 是的。一个节点可以与来自不同“集群”的节点通信。在本地节点中,用于erlang:set_cookie(OtherNode, OtherCookie)访问具有不同 cookie 的远程节点。

于 2012-11-08T08:29:51.093 回答
0

1)是的。他们互相交谈

2) 3) 和 4) 一般来说,当构建一个可扩展和容错的系统时,你会希望,或者更多,需要将工作负载划分到不同的“区域”或“集群”。Supervisor/Worker 模型具有这样的构想,因此拓扑结构。您需要的是一些进程协调集群之间的工作,并且单个集群中的所有工作人员将相互交谈以在组内平衡。

如您所见,使用这种拓扑结构,只要您以平衡的方式仔细划分任务,“限制”就不是真正的限制。就个人而言,我相信在大型系统中,主管流程的树状结构是不可避免的,这就是我正在遵循的做法。原因各不相同,但归结为可伸缩性、作为回退策略实施的容错性、维护需求和集群的可移植性。

所以总而言之,

2)为您的主管使用树状拓扑。让员工明确地相互联系,并在自己的领域内与主管交谈。

3)虽然这是本机设计的环境,但我认为,我很确定主管可以与另一台机器上的工作人员交谈。我不建议这样做,因为在远程工作者场景中容错可能是地狱。

4)你不应该让一个节点同时成为两个不同集群的一部分。您可以将其从一个集群切换到另一个集群。

于 2013-12-17T14:35:09.250 回答