9.分布式应用

定义

在一个包含了若干Erlang节点的分布式系统中,可能需要以分布的方法来控制应用。如果某个节点——上面运行了某个应用——挂了,应用要在另一个节点上被重启。

这样一个应用被称之为一个分布式应用。注意是对于应用的控制是分布的,所有应用当然都可以是分布——比如,使用其它节点上的服务。

因为一个分布式应用可能会在节点之间移动,所以必须有某种寻址机制来确保它可以被其他应用找到,无论它当前运行于哪个节点上。这里不会讨论这个问题,Kernel模块 global 和STDLIB模块 pg 都可以用于这个目的。

指定分布式应用

分布式应用同时由应用控制器和一个分布式应用控制进程 dist_ac 来控制。这些进程都是 kernel 应用的一部分。因此,分布式应用要通过配置 kernel 应用来指定,使用以下配置参数(参见 kernel(6) ):

distributed = [{Application, [Timeout,] NodeDesc}]
指定应用 Application = atom() 可以在何处执行。 NodeDesc = [Node | {Node,...,Node}] 是节点名称的列表,按照优先级顺序排列。在一个元组内的节点的优先级则是不确定的。 Time = integer() 指定了在另一个节点上重启应用之前要等待多少毫秒。

为了应用控制的分布能正常工作,分布式应用所运行的节点必须互相联系并商定在何处启动应用。这是使用以下 kernel 配置参数来完成的:

sync_nodes_mandatory = [Node]
指定哪些其他的节点必须被启动(在 sync_nodes_timeout 指定的超时时间之内)
sync_nodes_optional = [Node]
指定哪些其他的节点可以被启动(在 sync_nodes_timeout 指定的超时时间之内)
sync_nodes_timeout = integer() | infinity
指定在其他节点启动之前等待多少毫秒

当启动之后,节点要等待所有由 sync_nodes_mandatory 和 sync_nodes_optional 指定的节点就绪。当所有节点就绪,或者当所有强制的节点就绪同时已经经过由 sync_nodes_timeout 指定的时间,然后所有的应用将被启动。如果不是所有的强制节点都就绪了,那么这个节点就会终止。

例如:一个应用 myapp 应该运行于节点 [email protected] 上。如果该节点挂了,那么 myapp 应该在 [email protected] 或者 [email protected] 上重启。那么针对 [email protected] 的一个系统配置文件应该为:

[{kernel,
  [{distributed, [{myapp, 5000, [[email protected], {[email protected], [email protected]}]}]},
   {sync_nodes_mandatory, [[email protected], [email protected]]},
   {sync_nodes_timeout, 5000}
  ]
 }
].

[email protected] 和 [email protected] 的系统配置文件是一样的,除了强制节点的列表,对于 [email protected] 来说应该是 [[email protected], [email protected]] ,对于 [email protected] 来说应该是 [[email protected], [email protected]] 。

启动和停止分布式应用

当所有参与的(强制)节点启动后,就可以在所有这些节点上调用 application:start(Application) 来启动分布式应用。

当然也可以用启动脚本(参见 发布 )自动启动应用。

应用会在第一个——由 distributed 配置参数指定的、已经启动并运行的——节点上启动。应用按正常的方式启动。也就是说,创建了应用主程序并调用了应用回调函数:

Module:start(normal, StartArgs).

例如:继续前一节的例子,三个节点都启动了,并指定了以下系统配置文件:

> erl -sname cp1 -config cp1
> erl -sname cp2 -config cp2
> erl -sname cp3 -config cp3

当所有的节点都起来并运行了,就可以启动 myapp 了。这是通过在所有三个节点上调用 application:start(myapp) 来完成的。然后,它被启动于 cp1 上,如下图所示。

类似地,应用必须通过在所有相关节点上调用 application:stop(Application) 来停止应用。

故障转移

如果运行应用的节点挂了,应用会在指定的超时之后被重启,于由 distributed 配置参数指定的第一个启动且运行的节点。这个过程称之为故障转移(Failover)。

应用会以正常的方式在新节点上启动,也就是,通过应用主程序调用:

Module:start(normal, StartArgs)

注意特例:如果应用定义了 start_phases 键(参见 被包含的应用 ),那么应用要另外使用以下调用:

Module:start({failover, Node}, StartArgs)

其中 Node 是被终止的节点。

例子:如果 cp1 挂了,然后系统检查其他节点—— cp2 或 cp3 ——哪个运行的应用数最少,但还要等待5秒钟让 cp1 重启。如果 cp1 没有重启,同时 cp2 运行的应用比 cp3 少,那么 myapp 则会在 cp2 上重启。

假设现在 cp2 也挂了并在5秒内没有重启。那么现在 myapp 会在 cp3 上重启。

接管

如果一个节点启动了,根据 distributed ,它有着比分布式应用当前所运行的节点更高的优先级,那么应用首先会在新的节点重启,并在老的节点停止。这个过程称之为接管

这种情况是通过以下应用主程序调用来启动应用的:

Module:start({takeover, Node}, StartArgs)

其中 Node 是老节点。

例如:如果 myapp 目前运行在 cp3 ,现在如果 cp2 重启了,那么它不会重启 myapp ,因为节点 cp2 和 cp3 之间的次序是不确定的。

然而,如果 cp1 也重启了, 函数 application:takeover/2 会将 myapp 移动到 cp1 ,因为 cp1 对此应用的优先级比 cp3 要高。在这种情况下,会在 cp1 执行 Module:start({takeover, [email protected]}, StartArgs) 来启动该应用。

时间: 2024-11-08 17:31:09

9.分布式应用的相关文章

跟我一起学WCF(3)——利用Web Services开发分布式应用

一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 Web Services 概述 Web Services是支持客户端与服务器通过网络互操作的一种软件系统,是一组可以通过网络调用的应用程序API.在Web Services中主要到SOAP/UDDI/WSDL这三个核心概念,下面分别介绍下这三个概念的定义. SOAP:SOAP(Simple Object

Masstransit开发基于消息传递的分布式应用

使用Masstransit开发基于消息传递的分布式应用 Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用. 值得一提的是Masstransit的源码写的非常优秀,值得每个想提高自己编程能力的.Net选手阅读,整个代码看起来赏心悦目.反之,每次打开自己公司项目的时候心情都异常沉重.所以不是.Net不行,还是咱们水平不行. 学会了Masstransit你再也不用羡慕别人有Dubbo

RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

RDIFramework.NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为指导思想,作为异质系统整合与互操作性.分布式应用提供了可行的解决方案. 1.SOA平台简介 1.1.概述 SOA(service-oriented architecture,也叫面向服务的体系结构或面向服务架构)是指为了解决在Inte

asp.net 分布式应用开发

Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案.其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于Web的ASP.NET页面开发技术和SQL Server数据存储技术(或Xml文档),在.Net下开发N层应用程序也不再困难. 一.分布式处理概述 分布式处理是将应用程序逻辑分布到2台或者更多台计算机上,在物理上或逻辑上分离的单元中.这一概念并不是新生事物,在大型工程已经得到广泛使用.只不过,Inter

Java分布式应用技术架构介绍

分布式架构的演进 系统架构演化历程-初始阶段架构 初始阶段 的小型系统 应用程序.数据库.文件等所有的资源都在一台服务器上通俗称为LAMP 特征: 应用程序.数据库.文件等所有的资源都在一台服务器上. 描述: 通常服务器操作系统使用linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用Mysql,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了. 系统架构演化历程-应用服务和数据服务分离 好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰

Akka.net开发第一个分布式应用

Akka.net开发第一个分布式应用 系列主题:基于消息的软件架构模型演变 既然这个系列的主题是”基于消息的架构模型演变“,少不了说说Actor模型.Akka.net是一个基于Actor模型的分布式框架.如果你对分布式应用还非常陌生,当别人在谈”分布式“.”云计算“等名词时你感到茫然,那么本篇文章将带你进行一次分布式开发之旅. 一.什么是Actor模型 Actor模型由Carl Hewitt于上世纪70年代早期提出并在Erlang语言中得到了广泛应用,目的是为了解决分布式编程中一系列问题.其主要

使用Akka.net开发第一个分布式应用

系列主题:基于消息的软件架构模型演变 既然这个系列的主题是”基于消息的架构模型演变“,少不了说说Actor模型.Akka.net是一个基于Actor模型的分布式框架.如果你对分布式应用还非常陌生,当别人在谈”分布式“.”云计算“等名词时你感到茫然,那么本篇文章将带你进行一次分布式开发之旅. 一.什么是Actor模型 Actor模型由Carl Hewitt于上世纪70年代早期提出并在Erlang语言中得到了广泛应用,目的是为了解决分布式编程中一系列问题.其主要特点如下: 系统由Actor构成 Ac

Zookeeper-5分钟快速掌握分布式应用程序协调服

一.Zookeeper 安装 1.zookeeper支持brew安装. ? ~ brew info zookeeper zookeeper: stable 3.4.10 (bottled), HEAD Centralized server for distributed coordination of services https://zookeeper.apache.org/ Not installed From: https://github.com/Homebrew/homebrew-co

跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 .NET Remoting简介 .NET REmoting与MSMQ不同,它不支持离线可得,另外只适合.NET平台的程序进行通信.它提供了一种允许对象通过应用程序域与另一个对象进行交互的框架..NET 应用程序都在一个主应用程序域中执行的,在一个应用程序域中的代码不能访问另一个应用程序域的数据,然而在

转载 Tomcat集群配置学习篇-----分布式应用

Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问量过大,就会出现服应用务器崩溃的情况,这个时候怎么办,难道就只能去重启服务器吗?好,如果是一般的小型公益网站到也无所谓,但如果是比如像大型航空公司售票等电子商务网站,每天每小时都有大量的订单业务,如果这些售票系统一旦崩溃后,再去重启,这些时间和客户的损失就直接会影响到航空公司的利益,这些损失如何去避