G__*_*G__ 31 erlang distributed scalability
A部分:
Erlang有很多关于运行并发代理的成功案例,例如数百万个同时进行的Facebook聊天.这是数以百万计的代理商,但当然不是网络中的数百万个CPU.当在LAN/WAN上进行"水平"扩展时,我无法找到Erlang扩展程度的指标.
让我们假设我有许多(数万个)物理节点(在Linux上运行Erlang)需要通过LAN/WAN进行通信和同步少量不常数据.在什么时候我会遇到通信瓶颈,而不是代理之间,而是物理节点之间?(或者这只是工作,假设一个稳定的网络?)
B部分:
我理解(作为一个Erlang新手,意思是我完全错了)Erlang节点尝试连接并相互了解,从而产生N ^ 2连接点对点网络.假设A部分不仅仅适用于N = 10K,可以轻松配置Erlang(使用开箱即用的配置或平凡的样板,而不是自己编写完整的分组/路由算法),将节点集群化为可管理的通过群集/组层次结构分组和路由系统范围的消息?
use*_*720 40
我们应该指出我们谈论物理机器的水平可扩展性 - 这是唯一的问题.一台机器上的CPU将由一台VM处理,无论其数量是多少.
node = machine.
首先,我可以说30-60个节点开箱即用(vanilla OTP安装),并在其顶部编写任何自定义应用程序(在Erlang中).证明:ejabberd.
优化的自定义应用程序可实现~100-150.我的意思是,它必须是良好的代码,用有关GC的知识,数据类型的特征,消息传递等编写.
超过+150是可以的,但是当我们谈论300,500这样的数字时,它将需要TCP层的优化和自定义.此外,我们的应用程序必须了解跨群集的同步调用的成本.
另一件事是DB层.Mnesia(内置)由于其功能将不会超过20个节点(我的经验 - 我可能是错的).解决方案:只需使用其他东西:dynamo DB,独立的MySQL集群,HBase等.
利用创建高质量应用程序和可伸缩性的成本的最常用技术是~20-50个节点集群的联合.所以在内部它是一个有效的~50个erlang节点的网格,它通过任何合适的协议连接到另外50个节点集群.总而言之,这样的系统是N erlang集群的联合.
分布式erlang旨在在一个数据中心中运行.如果您需要更多地理位置较远的节点,请使用联合.
有许多配置选项,例如,它们不会将所有节点相互连接.它可能会有所帮助,但在~50集群中,erlang开销并不重要.您还可以使用"隐藏"连接创建erlang节点的图形,该连接不会连接此完整网格,但也无法从连接到所有节点中受益.
在这种系统中,我看到的最大问题是将其设计为无主系统.如果你不需要,一切都应该没问题.