我正在尝试使用Erlang作为粘合剂来实现一个集群。我喜欢它创建一个完全连接的节点图的想法,但是在网上阅读不同的文章时,似乎这不能很好地扩展(最多有50到100个节点)。 OTP的开发人员是否故意强制实施此限制?我知道你可以设置节点只有显式连接以及隐藏节点等。但是,似乎默认的开箱即用设置不是很可扩展。
所以问题:
如果您有5个节点(A,B,C,D,E),它们都有明确的连接,例如A-B-C-D-E。 Erlang / OTP是否允许A直接与E通信,或者A必须将消息从B传递到D才能到达E,这就是完全连接图的原因吗?同样,它有意义,但它不能从我所见过的那里很好地扩展。
如果要尝试使用可扩展且容错的系统,您有什么选择?好像,如果由于节点太多而无法创建完全连接的图形,那么下一个最好的方法就是创建某种树。但是,这似乎不是容错的,因为如果子节点的根节点或任何父节点死亡,您将丢失很大一部分集群。
在调查主管和工作人员时,我看到的所有示例都将此应用于单个节点上的进程。它是否可以应用于节点集群以帮助实现容错?
节点可以成为多个集群的一部分吗?
感谢您的帮助,如果有一个我最近错过的半新网站或博客帖子(大约1岁),我很乐意看看这些。但是,我已经很好地浏览了互联网。
答案 0 :(得分:12)
是的,您可以将消息发送到群集中任何远程节点上的进程,例如,使用其进程标识符(pid)。这称为位置透明度。是的,它可以很好地扩展(参见Riak,CouchDB,RabbitMQ等)。
请注意,一个节点可以运行数十万个进程。事实证明,Erlang具有很高的可扩展性,专为容错而打造。还有其他方法可以构建更大的方法,例如CloudI的SOA方法(参见评论)。如果你真的真的需要,你也可以构建使用hidden nodes的集群。
在节点级别,您将采用不同的方法,例如,构建相同的节点,如果它们失败并且其余节点接管工作,则易于替换。看看Riak如何处理这个问题(查看riak_core
并查看博文Introducing Riak Core)。
节点可以离开并进入群集,但不能同时成为多个群集的一部分。连接的节点共享一个群集cookie,用于标识连接的节点。您可以在VM运行时设置cookie(请参阅Distributed Erlang)。
阅读http://learnyousomeerlang.com/以获得更大的收益。
答案 1 :(得分:8)
分发协议是关于提供健壮性,而不是可伸缩性。您要做的是将群集分组到较小的区域,然后使用连接,这些连接不是在Erlang中分发,而是在TCP会话中分发。您可以运行5组,每组10台机器。这意味着10台机器具有无缝的Pid分配:您可以在另一台机器上调用pid。但是分发到另一个群体意味着你无法像这样无缝地解决这个群体。
您通常需要在BGP中进行某种“路由反射”。
答案 2 :(得分:1)
1)我认为您需要节点之间的直接连接才能在进程之间进行通信。但是,这确实意味着如果两个节点之间永远不会进行通信,则不需要所有节点之间的持久连接(例如,如果它们只是工作者,而不是协调者)。
2)您可以创建一个未完全连接的erlang节点图。文档很难找到,并且存在问题 - 您禁用了处理集群中全局名称的global
系统,因此您必须通过本地注册的名称或远程节点上的本地注册名称来执行所有操作。或者只是使用Pids,因为它们也可以工作。要启动像这样的erlang节点,请使用erl ... -connect_all false ...
。我希望你知道你在做什么,因为我不相信自己这样做。
事实证明,erlang节点的未完全连接图是当前的研究课题。 RELEASE Project目前正在研究这个问题,并提出了S组的概念,它们基本上是完全连接的组。但是,节点可以是多个S组的成员,并且不同的s组中的节点不必完全连接,但可以按需建立连接以进行直接的节点到节点通信。值得找到他们的演示文稿,因为这项研究非常有趣。
值得指出的另一件事是,有些人发现在完全连接的群集中最多可以获得150-200个节点。你真的有一个比这更多节点的用例吗?当然,除非你有一个荒谬的项目要做,否则150-200台令人难以置信的强大计算机可以完成你可以投入的大多数事情。
3)虽然您无法使用gen_server:start_link/3,4
在不同节点上启动进程,但您当然可以非常轻松地在外部节点上调用服务器。看起来他们忽略了能够在外部节点上启动服务器,但可能有充分的理由 - 例如一些荒谬的错误案例。
4)尝试查看隐藏的节点,以及拥有未完全连接的群集。它们应该允许您根据需要对节点进行分组。
TL; DR:缩放很难,我们去购物吧。
答案 3 :(得分:0)
已经有一些好的答案,所以我想要简单。
1)否,如果A
和E
未直接关联,A
无法与E
对话。分发协议在直接TCP连接上运行 - 不包括路由。
2)我认为树结构已经足够好了 - 权衡总是存在。
3)没有“节点主管”,但erlang:monitor_node
是你的朋友。
4)是的。节点可以与来自不同“集群”的节点通信。在本地节点中,使用erlang:set_cookie(OtherNode, OtherCookie)
访问具有不同cookie的远程节点。
答案 4 :(得分:0)
1) 是。他们互相交谈
2)3)和4) 一般来说,在构建可伸缩和容错系统时,您需要或者更多地需要将工作负载划分为不同的“区域”或“集群”。因此,主管/工人模型设想了拓扑结构。您需要的是协调集群之间工作的一些流程,并且一个集群中的所有工作人员将相互通信以在集团内部进行平衡。
正如您所看到的,使用此拓扑,“限制”并不是一个限制,只要您仔细地并以平衡的方式划分您的任务。就个人而言,我认为在大型系统中,监督过程的树状结构是不可避免的,这就是我所遵循的实践。原因各不相同,但归结为可扩展性,容错作为后备策略实施,维护需求和集群的可移植性。
总之,
2)为您的主管使用树状拓扑。让工人明确地相互联系,并在他们自己的领域与主管交谈。
3)虽然这是本土设计的环境,但正如我所设想的那样,我非常确定主管可以在不同的机器上与工作人员交谈。我不建议这样做,因为容错在远程工作者场景中可能是地狱。
4)你不应该让节点在同一时刻成为两个不同集群的一部分。您可以将它从一个群集切换到另一个群集。