首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >心跳协议/算法或最佳实践

心跳协议/算法或最佳实践
EN

Stack Overflow用户
提问于 2009-09-18 01:27:16
回答 5查看 16.9K关注 0票数 19

最近,我在我写的一个软件中添加了一些负载平衡功能。它是一个网络应用程序,它根据来自SQL数据库的输入进行一些数据处理。由于计算可能相当密集,因此我添加了让此应用程序的多个实例在不同服务器上运行以分担负载的功能,但现在的负载平衡是手动操作。用户必须指定哪些实例采用输入域的哪一部分。

我想把它带到下一个级别,并对实例进行编程,以自动协商输入数据的分配,并识别其中一个是否“消失”(已崩溃或已关机),以便其余实例可以承担失败实例的工作负载。

为了实现这一点,我正在考虑在实例之间使用一个简单的心跳协议来确定谁在线,谁不在线,虽然这并不是特别复杂,但我想知道是否有任何已建立的心跳网络协议(基于UDP、TCP或两者)。

显然,这在集群、故障转移和高可用性技术的网络世界中经常发生,所以我想知道最后我想知道是否有任何我应该知道或实现的已建立的协议或算法。

编辑

根据答案,似乎要么没有建立良好的心跳协议,要么没有人知道它们(这意味着它们毕竟没有建立得很好),在这种情况下,我只会提出我自己的。

虽然没有一个答案明确地提供了我想要的东西,但我会投票给Matt Davis's answer,因为它离我最近,他指出了一个使用多播的好主意。

感谢大家抽出时间来~

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-18 06:44:45

IEEE标准1278中定义的分布式交互系统( Distribued Interactive Simulation )通过UDP广播使用5秒的默认心跳。DIS心跳实质上是一个实体状态PDU,它完全定义了给定实体的状态,包括位置。由于其在模拟社区中的应用,DIS还使用被称为航位推算的概念来在例如实际位置在其预测位置的给定阈值之外时提供更高频率的心跳。

在您的例子中,DIS实体状态PDU可能会被夸大。我提到它只是为了说明这样一个事实,即心跳的频率可以根据环境的不同而变化。我不知道你所描述的应用程序是否需要这样的东西,但你永远不会知道。

对于心跳,请使用UDP,而不是TCP。心跳本质上是一种无连接的装置,因此UDP (无连接)在这里比TCP (面向连接)更相关。

关于UDP广播需要记住的一点是,广播消息仅限于broadcast domain。简而言之,如果您的计算机由第3层设备(例如路由器)分隔,则广播将无法工作,因为路由器不会将广播消息从一个广播域传输到另一个广播域。在这种情况下,我建议使用多播,因为它将跨越广播域,前提是生存时间(TTL)值设置得足够高。它也是一种比定向单播更自动化的方法,后者需要发送方知道接收方的IP地址才能发送消息。

票数 10
EN

Stack Overflow用户

发布于 2009-09-18 01:38:50

使用UDP每隔t广播一次心跳;如果您在超过k*t的时间内没有收到机器的消息,则假定它已关闭。请注意,使用的总带宽不会消耗资源。您可以使用IP广播地址,或者保留您正在为其工作的特定IP的列表。

确保心跳包括“重新启动计数”和“机器ID”,这样您就知道以前的服务器状态不存在。

如果合适的话,我会推荐使用MapReduce。这将节省大量的工作。

票数 6
EN

Stack Overflow用户

发布于 2009-09-18 01:52:46

我不确定这是否能回答这个问题,但您可能会对Weblogic Server集群在幕后的工作方式感兴趣。出自《Mastering BEA WebLogic Server》一书

...WebLogic服务器集群提供了集群中服务器的松散耦合。集群中的每个服务器都是独立的,并且不依赖于任何其他服务器进行任何基本操作。即使失去了与其他所有服务器的联系,每个服务器仍将继续运行,并能够处理它收到的请求。集群中的每个服务器通过周期性的心跳消息维护自己的集群中其他服务器的列表。每隔10秒,每台服务器都会向集群中的其他服务器发送一条心跳消息,让它们知道自己仍然处于活动状态。心跳消息是使用JVM中内置的IP多播技术发送的,随着集群中服务器数量的增加,这种机制变得高效且可伸缩。每台服务器从其他服务器接收这些心跳消息,并使用它们来维护其当前的集群成员资格列表。如果服务器未能连续接收到来自任何其他服务器的三个心跳消息,它会将该服务器从其成员资格列表中删除,直到它从该服务器接收到另一个心跳消息。此心跳技术允许从集群中动态添加和删除服务器,而不会影响现有服务器的配置。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1442189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档