Erlang中的分布式编程

Erlang分布式是语言內建的,从用户角度看,它是完全透明的。通过进程ID存取进程,不管是引用在本地计算机上的一个进程,还是在世界其他地方的系统上的一个进程,操作都一样。

Erlang中的分布式系统

1.分布式系统的实质是通过一些用网络连接起来的计算机、处理器或者内核以一种透明的方式提供某种服务。服务可以是特定的,比如分布式文件系统或数据库提供的存储功能;也可以是通用的,比如分布式操作系统通过计算机网络提供通常操作系统所具有的功能。分布式可以看做是连接紧密的并行处理器,或者更明确的说是松散耦合的电子科学系统网格。Erlang提供分布式程序设计能力,使得Erlang系统可以跨越Erlang节点联网运行。

2.分布式系统:

Ejabbered:这是一个Erlang开源的基于Jabber的即时消息(IM)服务器。它实现分布于两个或更多Erlang节点组成的集群。这些节点位于同一或不同的机器上,通过信息和事件负载均衡来相互支援。如果其中的一个节点因为软件或者硬件错误,或简单的因为内存泄漏而终止,其他的节点将接管其流量,并且对最终用户隐藏了这个错误。最坏的情况是,最终用户在套接字重新连接新节点时,可以意识到它们经理了一个网络小故障,但他们察觉到的只是其他用户的退出和登录。

Erlang Web框架:这是一个基于Erlang的Web应用的开源应用程序,通过使用分布式获取可伸缩性和可靠性。一个典型的集群由前端和后端节点组成。前端节点包括Web服务器(在Erlang节点中运行)、一个高速缓存层和为内层处理请求的XML分解。它还包含处理XHTML动态生成的功能。两个或更多的后端节点包含数据库和所有生成动态内容所需的粘合剂和逻辑性。真正的负载在前端,因为它处理套接字链接和大部分的解析。为了扩展系统,所需要做的只是添加硬件和前端节点,只有在必需的时候才增加对后端的支持。如果任何节点失效了,负载平衡器都会自动把流量转接到仍然存活的节点上。

AXD301 ATM切换器(Erlang旗舰产品中的一个):最小的Erlang集群由两个节点组成,一个称为呼叫建立节点,另一称为操作维护(O&M)节点。如果O&M节点失效,会产生一个故障切换,并且O&M应用程序会在呼叫建立节点重启。当O&M节点恢复正常,通过自动恢复和手动干涉,会产生一次接管,O&M应用程序会重新转移回原节点继续运行。

呼叫建立节点的失效属于紧急情况,因为它们会影响ATM通信。如果一个呼叫建立调用设置节点失效,那么一个故障切换会把所有呼叫建立应用程序转移到O&M节点。分布式数据保证,任何呼叫的简历是在故障切换之前初始化的,呼叫都不会丢失。在O&M节点上运行的新的呼叫建立应用程序会接管它们。当原始节点被重启,为保证不会扰乱通信并且没有呼叫建立请求丢失,一个O&M应用程序的接管会把O&M的功能迁移到新的已重启的节点上,并且呼叫建立功能保留在以前的O&M节点上。

3.并发性是所有分布式系统的核心,因为运算和通信会并行地运行在处理器和网络所组成的系统中。分布式系统主要的挑战是在错误事件发生时系统的健壮性。

4.构建分布式系统有众多好处:

可以提供按需增长的性能。一个典型的例子是Web服务器:如果计划发布一个软件的新的部分版本,或者计划用实时流媒体传送足球比赛视频,那么可以把这些服务器分不到许多机器上,分布式使之成为可能并且没有问题。

这种性能可以通过服务的复制来保障---在这种情况下是一个Web服务器---这通常会在分布式系统架构中出现。

复制也可以提供容错性:如果其中一个被复制的Web服务器失效或因为某些原因无法使用,HTTP请求仍可以由其他服务器处理,尽管是以一个较低的速率实现。这种容错性使得系统更具健壮性、更可信赖。

分布式允许透明地存取远程资源,并且以此为基础,通过把不同的系统联合为一个整体来对全体用户提供服务。现代电子商务系统提供这种方法集合,例如Amazon.com网站。

最后,分布式系统架构使系统具有可扩展性,并且通过远程存取使其他服务变为可能。

Erlang的分布式计算:基础

1.一个Erlang节点是以已命名的正在运行的Erlang运行时系统。多个节点可以运行在同一主机上,但是也可以在不同的主机上。

2.为运行一个节点,erl命令需要sname标签(也可以使用name标签)。注意Erlang终端中的提示信息显示了节点名和主机名,这被称为节点的唯一标识符。

erl -name foo.

为了理解下面发生什么,需要查看一下dist.erl模块,它包含函数t:

t(From)->From!node().

这个函数把进程标识符From作为一个参数,并且它的单一动作是发送一个消息到这个标识符代表的进程。这个消息是调用node()的结果,该函数返回该调用所在的节点的标识符。

3.spawn/4函数(第一个参数spawn应该发生的节点,其余的三个类似于spawn/3:模块、方法和初始化参数)

1.进程在节点bar@STC上生成,并且开始执行函数t,其他以在foo@STC运行的终端的进程标识符作为参数。

2.这样的效果是发送node()函数的值(即当前节点的标识符,在此处是bar@STC)到进程标识符,函数t然后终止。

3.这里可以通过刷新在foo@STC余留的消息进行的测试,这里显示出它已经发送标识符bar@STC。

4.在两个节点之间通过命令发送消息的格式与在非分布式情况下是完全一样的:Pid!Message.此外,消息从一个节点到另一个节点的传输保持与发送时相同的顺序。这与非分布式情况下的唯一区别是远程节点可能无效。

5.注意:发送消息给一个已命名进程不同于非分布式的情形,因为在非分布式环境中,命名是针对本地的。因此,如果要发送消息给位于节点foo@STC的一个叫做frequencey的进程,需要采用{frequency,foo@STC}!Message。

节点名和可见性

1.如果一个节点可以与其它节点通信,它被称为存活节点;另一种说法是这个节点是可命名的,所以可参与通信。

2.函数erlang:is_alive()会测试本地运行时系统是否为存活状态。

3.使用net_kernel模块函数可以改变一个正在运行时系统的存活状态(net_kernel:start([节点名])将系统的存活状态设置为true,net_kernel:stop()将系统的存活状态设置为false),也可以使用node/0内置函数找出当前节点的名字(node())。

4.任何存活的节点都要命名:在那台主机上,这些名称必须是唯一的,但是在不同的主机上,名字是可以重复的。这种名字/主机对称为节点的标识符,用来唯一识别网络中的节点。

5.名字有两种形式:

短名字:erl -sname foo ...

sname会在局域网中命名一个主机,并以name@host的形式(比如foo@STC)给出。

长名字:erl -name foo...

这个名字给出主机的完整IP地址:它可以是[email protected]或者(在局域网中)[email protected]。如果使用net_kernel:start函数来启动一个分布式节点,这个节点会被赋予一个长名字。

6.注意长名字节点只能与其它具有长名字的节点通信,短名字只能与其它具有短名字的节点通信。

7.注意:为了使用server.keng.ac.uk形式的主机名,而不是原始IP地址如[email protected],需要把主机名解析为IP地址。一个域名服务器(DNS)可以做到这个,但若不能访问DNS服务器,名字可以通过使用包含在主机文件的信息而在本地解析。具体完成的步骤取决于不同的平台。

通信和安全

1.对于两个节点之间的通信,不仅需要两个节点同为存活节点,还需要在被称为安全标识信的基元中包含共享信息。每个节点在任意时刻只有一个cookie,共享同一值的节点可以进行通信。

2.每个节点在启动时可以指定一个确定的cookie,比如

erl -sname foo -setcookie blah

如果启动时没有预设值,Erlang运行时系统会选择存储在.erlang.cookie文件中的一个值。如果该文件不存在,它会在用户账户的主目录中创建一个。一个随机产生的安全cookie会存储在那里。这样,用同一用户账户创建的节点在默认情况下共享同一cookie。如果已经在分布式Erlang做过试验而没有设置cookie,查看一下erlang.cookie文件。可以用需要的值来编辑它。

3.当计算机上的一个分布式节点通过共享cookie与另一个远程节点建立连接,远程节点的拥有者同样拥有获得和本地Erlang节点运行所用的账号相同的用户访问权限。

所以永远不公开Erlang节点名和cookie给任何人,除非已经调整了网络核心来应对严重的安全问题,或者明确地相信这个人不会做任何恶意的事情。

通信和消息

1.最基本的通信是一个节点测试其是否可以与其它节点建立链接,也就是非正式说pinging其他节点。

2.通过net_adm:ping/1:进行通信,pang回复表示通信失败,这个被ping的节点也会给出一个错误报告来给连接请求发信号,通过警告的方式表示一个潜在的安全问题发生了,pong回复指示ping成功了:这样一个成功的尝试不会通知bar节点。

节点连接

1.只要分布式Erlang节点共享相同的cookie信息,它们之间就可以进行通信,Erlang运行时系统在一个节点第一次被引用时建立连接。这可以通过调用net_adm:ping/1或通过发送一个消息到它的一个注册过的进程上来做到。连接在一起的节点,信息默认是共享的。所以,如果A知道B,B知道C,那么A也能够找到C。

2.每个节点在任意一个时刻都有一个cookie。在分布式Erlang中安全基于共享cookie信息。

 

猜你喜欢

转载自yansxjl.iteye.com/blog/2361449
今日推荐