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

时间:2009-09-18 01:27:16

标签: sockets network-programming network-protocols distributed-computing

最近我为我编写的一个软件添加了一些负载均衡功能。它是一个联网的应用程序,它根据来自SQL数据库的输入执行一些数据处理。由于压缩可能非常密集,我已经添加了在不同服务器上运行此应用程序的多个实例以分割负载的功能,但现在负载平衡是一种手动操作。用户必须指定哪些实例占用输入域的哪个部分。

我想把它提升到一个新的水平并对实例进行编程,以自动协商输入数据的跳跃并识别其中一个“消失”(已经崩溃或已经断电)以便其余实例可以承担失败实例的工作量。

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

显然,在集群,故障转移和高可用性技术的网络世界中,这种情况发生了很多,所以我想最后我想知道是否有任何已建立的协议或算法我应该注意或实施。

修改

根据答案,似乎没有完善的心跳协议或没有人知道它们(这意味着它们毕竟不是那么完善)在这种情况下我只是我要自己动手。

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

谢谢大家的时间〜

5 个答案:

答案 0 :(得分:7)

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

在您的情况下,DIS实体状态PDU将是过度杀伤。我只提到它,以记录心跳根据具体情况而变化的事实。我不知道你所描述的应用程序需要这样的东西,但你永远不知道。

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

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

答案 1 :(得分:5)

每次使用UDP广播心跳;如果你没有从超过k * t的机器听到,那么它就是假设的。请注意,使用的总带宽不是资源消耗。您可以使用IP广播地址,或保留您正在为其工作的特定IP列表。

确保心跳包括“重新启动计数”以及“计算机ID”,以便您知道以前的服务器状态不在。

如果适合,我建议使用MapReduce。这会节省很多工作。

答案 2 :(得分:2)

我不确定这会回答这个问题,但您可能对Weblogic Server集群工作的方式感兴趣。从书Mastering BEA WebLogic Server

  

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

答案 3 :(得分:2)

思科内容交换机是解决此问题的硬件解决方案。它们将虚拟IP地址实现为多个真实服务器的前端,其真实IP地址为交换机所知。交换机定期向Web服务器发送HTTP HEAD请求,以验证它们是否仍在运行(交换机软件称之为“keepalive”,尽管这不会使服务器本身保持活动状态)。 Cisco交换机接受虚拟IP上的流量,并使用可配置的负载平衡(例如循环或用户定义的负载平衡)将其转发到实际的Web服务器。

这些交换机零售价在$ 3-10K范围内,尽管我的商业伙伴在eBay上以一年前约300美元的价格收购了一款。如果您能负担得起,它们确实代表了一种经过验证的硬件解决方案,可以解决如何跨多个服务器透明地传播服务的问题。 Redhat包含内置端口配置,因此您可以使用廉价的RedHat盒实现自己的Cisco交换机。 Google提供“虚拟IP地址”和“cisco内容路由器”以获取更多信息。

答案 4 :(得分:1)

除了尝试使用硬件负载平衡器之外,您还可以尝试免费的开源负载平衡软件应用程序,例如HAProxy,可用于Linux和BSD。