2012-11-03 39 views
15

我试图实现一个集群使用Erlang作为粘合剂,它将所有这些集中在一起。我喜欢这样的想法,即它创建了一个完全连接的节点图,但是在阅读了不同的在线文章之后,似乎没有很好地扩展(最多有50-100个节点)。 OTP的开发者是否实施了这种限制?我知道你可以设置节点只有明确的连接以及隐藏的节点等。但是,似乎默认的开箱即用的设置不是非常可扩展的。Erlang集群

所以对这些问题:

  1. 如果你有5个节点(A,B,C,d,E),所有有这样的A-B-C-d-E明确的连接。 Erlang/OTP是否允许A直接与E通话,或者A是否必须将消息从B传递到D才能到达E,因此这就是完全连通图的原因?再次,它是有道理的,但它不能从我看到的那么好。

  2. 如果有人想尝试去寻求一个可扩展的容错系统,您有什么选择?看起来,如果因为节点太多而无法创建完全连通的图,那么最好的办法是创建某种树。但是,这看起来并不是很容错,因为如果子节点的根或任何父节点都死掉了,你将会失去很大一部分集群。

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

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

感谢您的帮助,如果有一个我错过的半新网站或博文(大概1岁),我很乐意看看那些。但是,我在互联网上搜索得很好。

+0

相关问题:http://stackoverflow.com/questions/5044574/how-scalable-is-distributed-erlang? – Tilman

+0

你看过CloudI:http://cloudi.org/ – Tilman

回答

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

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

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

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

阅读http://learnyousomeerlang.com/更好。

+0

为什么要downvote?请给出意见。 – Tilman

7

分发协议是关于提供健壮性,而不是可伸缩性。你想要做的是把你的集群分成更小的区域,然后使用连接,这些连接在Erlang中不是分布式的,而是在TCP会话中。你可以运行5组10台机器。这意味着10台机器具有无缝Pid分布:您可以在另一台机器上调用一个PID。但分发到另一个组意味着你不能像这样无缝地处理这个组。

您通常需要某种“路由反射”,如在BGP中一样。

1

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

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

它也证明erlang节点的非完全连接图是当前的研究课题。 RELEASE Project目前正在研究,并提出了S组的概念,S组基本上是完全连接的组。但是,节点可以是多个S组的成员,并且不同的s组中的节点不必完全连接,但可以根据需要建立它们需要的连接以进行直接的节点到节点通信。因为这项研究非常有趣,所以值得找到他们的演讲。

另一件值得指出的事情是,有几个人发现在一个完全连接的集群中可以获得多达150-200个节点。你真的有一个用于更多节点的用例吗?当然,除非你有一个荒谬的项目,否则150-200个令人难以置信的强大的计算机可以完成大部分的事情。

3)虽然无法使用gen_server:start_link/3,4在不同节点上启动进程,但您可以非常轻松地在外部节点上调用服务器。看起来他们忽略了能够在外部节点上启动服务器,但是可能有很好的理由 - 例如一些荒谬的错误情况。

4)试着看看隐藏的节点,并有一个不完全连接的群集。他们应该允许您按照您认为合适的方式将节点分组。

TL; DR:缩放比较困难,我们去购物。

0

已经有一些很好的答案,所以我试图变得简单。

1)不,如果AE没有直接连接,A不能与E通话。分发协议在直接TCP连接上运行 - 不包含路由。

2)我认为一个树结构足够好 - 权衡总是存在的。

3)没有'节点监督员',但erlang:monitor_node是你的朋友。

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

0

1) 是的。他们彼此交谈

2)3)和4) 一般而言,在构建可扩展和容错系统时,您希望或更多地需要将工作负载划分为不同的“区域”或“集群”。主管/工人模型具有这种构想,因此拓扑结构。您需要的是协调集群和单个集群内所有工作人员之间工作的一些流程将彼此交谈以在集团内部实现平衡。

正如您所看到的,通过这种拓扑结构,只要您以平衡的方式小心谨慎地划分任务,“限制”并不是真正的限制。就我个人而言,我认为像大型系统这样的树状结构对监督者流程来说是不可避免的,而这正是我所遵循的做法。原因各不相同,但可归结为可扩展性,容错性,降低策略实施,群集的维护需求和可移植性。

所以最后,

2)使用树形拓扑为您的主管。让工作人员明确地互相联系,并在其领域内与主管进行交谈。 3)虽然这是本机设计的环境,但我敢肯定,我很确定主管可以与另一台机器上的工作人员交谈。我不建议这样做,因为在远程工作者情况下容错可能是地狱。

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