我知道, Network Load BalancingFailover Clustering我们可以做的 被动的服务 高度可用。但是什么有关 活动的应用程序?

例如:我的一个应用程序检索的某些内容从一个外部资源,在一个固定的时间间隔。我有想到以下情况:

  1. 运行它在一个单一的机。问题:如果这个落实例,内容不会被检索
  2. 运行它在每个机算的集群。问题:该内容将以检索多次
  3. 它在每个机群的,但是运行只有在他们中的一个。每个实例中会有一种共同的资源,以决定是否反过来要做的任务或没有。

当我思考的方案#3我想知道什么应该是公共资源。我有想过创造一个表中的数据库,在那里我们可以用它来获得全球锁。

这是最好的解决办法吗?怎么人们通常这么做?

通过它的一个。净WCF上运行的应用的Windows服务器2008年

有帮助吗?

解决方案

对于这样的问题,他们发明了信息的队列。想象的情况时,集群的应用的所有听到消息队(聚集本身:-)).在某一时间点的一个实例让您最初的命令下载你的外部资源。如果成功,您的实例刷新信息,而不是它的职位的另一个用于后来的执行时间,就等于'的运行时间'+'的时间间隔.但在情况下的实例死亡,在处理期间,这不是一个问题。消息是回滚队(后超时)和其他一些实例可以把它捡起来。一位的交易,一点点的消息队列

我在Java EE侧的世界,这样可以帮你编码的详细信息

其他提示

我们一旦实施类似的东西利用你的解决方案#3.

创建一个表叫做喜欢的东西 resource_lock, 与列(例如 locking_key)将包含一个锁定的关键。

然后在每个间隔期间,所有实例应用程序将:

  1. 运行查询像'update resource_lock set resource_key = 1 where resource_key is null'.(当然,你也可以插入一个服务器特有的标识、时间戳,等等。)
  2. 如果0行更新:什么都不做-另一个应用程序的实例是已经获取的资源。
  3. 如果1行更新:获取资源和设置 locking_key 回到 null.

有两个优点:

  • 如果你的一个服务器发生故障,资源仍将被取通过服务器仍在运行。
  • 你离开的锁定的数据库,这样可以节省你的实施它自己。

有一些要求,你可能知道,但并未描述的问题,使给予通知的答复的具有挑战性。这些问题是:

  • 不会的任务已成功完成?
  • 如果任务不/未成功完成,"谁"需要知道什么类型的行动需要执行?
  • 什么样的行为如果任务尚未完成时的时间来执行任务了?它应该跑或不?
  • 怎样重要的是它的工作运行在指定的时间间隔?如果时间间隔是,每5分钟,它必须每5分钟或可能的任务后运行的有5分钟10秒钟?

第一步是要回答如何定期的任务将是计划运行。一种选择是Windows计划的任务,但这不是固有的高度,但它可能是可能的工作。如果您使用的是SQL服务器上,另一个替代办法将是使用SQL Server剂作为一个计划程序,因为它将转移的一部分SQL服务器。

下一个步骤,以确定是如何援用周转基金应用程序。最简单的选择就是引发工作,以援引WCF服务,通过一个N的IP地址。这可以被认为是一个没有没有如果数据库服务器(或其他服务器在该区域)是打电话来应用区(当然总有例外如MSDTC).

另一个选择是使用排队的模式。这将是最可靠的,在大多数情况下。例如SQL服务器代理执行存储的过程进入一个记录在队列表。然后在每个应用程序服务器服务的可能调查寻找一个排队记录到处理。访问记录在队列中将列化的数据库,以使中的第一个服务器运行的作业(以及这项工作将只运行一次)。

根据答复的开放问题,在这个答案你可能需要添加更多一些错误的处理。如果检索的外部资源通常是相当短,您可能想要简单地保持队列记录锁定 select for update 和在任务完成时更新的地位(或删除的记录,如果你希望的).这将阻止其他服务实例,从处理记录,同时它正在处理的另一个服务器和如果发生崩溃时在处理事务应该滚回和另一个服务于集群可以拿起记录。(虽然,你可能会增加交易超时只要你认为你的需要。)

如果保持一个数据库的锁很长一段时间是不可行的,然后你可以改变的逻辑,并添加了一些监控的服务。现在,当一个工作是开始处理,其地位将改变从排队要运行和服务器处理的记录将更新的记录。某种服务的状况表可以建立和每个服务实例,将更新目前的时间,每次他们投票。这将允许其他服务的群集中到重新处理的工作中显示为在运行,但服务,他们应该上运行还没有"检查"在一定时期。

这种方法还具有局限性:如果有什么任务实际完成的但不知何故数据库连接失去了--的工作可能再次运行。当然,我不认为问题的具有原子数据库的行动与其他非事务资源(例如网页的请求,文件系统)的要容易得到解决。我假设你正在写的文件或事--如果外部内容也是放置到一个数据库,然后一个单一的交易将保证一切都是一致的。

从简单点来看,最/最简单的方法来完成你在寻找什么会以为'循环'群集使每一个请求,一个机选择的(由一个集群的管理服务或某一类)处理请求。实际客户的要求不直接去机处理;相反,他们指向一个终点,它作为一个代理分布进入请求的机器基于性以及负荷。引用下面引用的链路,

网络负载平衡的方式配置一个游泳池的机,使他们轮流回答的请求。这是最常见的实施的服务器群:配置相同的计算机传播出的载于一网站,或者终端服务器的农场。你也可以使用它,对防火墙(ISA)农场,vpn接入点,真的,任何时候你有TCP/IP通讯,已经成为过多的负载于一个单一的机器,但是你仍然想要表现为一个单一的机访问的目的。

作为你的应用程序"活动",这一要求并没有考虑到这个方程式是否由于"主动"或"被动",应用程序仍然请求您的服务器。

商业负载平衡器的存在对于服务HTTP式请求,所以这可能是值得探讨,但与负载均衡设的W2k8,你可能被最好的服务窃听到的那些。

更多信息,说明如何配置,在Win2k8,请参阅 文章。

这篇文章 是更多的技术,并侧重于使用N与交流,但该原则仍应适用于你的情况。

看看这里 另一个详细步行通过的N的安装和配置。

如果做不到这一点,你也可以很好地服务于通过搜索/张贴在ServerFault,由于应用程序的代码不是(而不应)严格意识到,在N甚至存在。

编辑:增加的另一个链接。

编辑(2):OP已纠正我的错误结论的"活跃"与"被动"的概念。我的答案是非常类似于我原来的答案,节省的'主动'的服务(其中,因为你使用WCF,可以很容易地windows服务)可以分为两个部分:实际的处理部分和管理部分。管理部将在单个服务器上运行,并作为一个循环负载均衡用于其他的服务器做实际的处理。这是稍微复杂一些,比原来的情况,但我认为它将提供一个良好的交易的灵活性以及提供清洁的分之间处理和管理的逻辑。

在一些情况下,人们发现它很有用,有3个机器做所有的请求,然后将结果进行比较的结束,以确保结果是绝对正确并且没有硬件故障引起的任何问题,同时处理它。这是他们做什么对例如飞机。

在其他时候,你可以住在一起具有一个单一的坏的结果和一个小型的停机时间切换到一个新的服务,但只是想下一个被确定。在这种情况下解决方案3号有一个心跳监测是一个很好的设置。

其他时候再次,人们只需要通知的短信,他们的服务和应用程序将只使用一些过时的数据,直到你手进行某种故障切换。

在你的情况我会说后者可能更有用。因为你不能真正取决于该服务的另一端是可用的,你仍然会拿出一个解决方案为什么要做在这种情况。回过时的数据可能是什么是对你有好处,它可能不是。抱歉不得不说:它依赖。

动物园管理员让一个很好的使用情况的分布锁。动物园管理员有z节点像目录数据。

甚至netflix长有很多菜谱已经完成和使用。如:领导人选举,分发锁和更多。

我认为,我们有客户的动物园管理员为。你绝对应该试试这个选项。#Option3

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top