19

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

我想将其提升到一个新的水平并对实例进行编程以自动协商输入数据的潜水并识别其中一个是否“消失”(已崩溃或已断电),以便剩余的实例可以使用在失败实例的工作负载上。

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

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

编辑

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

虽然没有一个答案提供了我正在寻找的具体内容,但我将投票支持Matt Davis 的答案,因为它是最接近的,并且他指出了使用多播的好主意。

谢谢大家的时间~

4

5 回答 5

10

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

在您的情况下,DIS Entity State PDU 将是矫枉过正。我提到它只是为了说明心跳的频率可能会因情况而异。我不知道您描述的应用程序是否需要这样的东西,但您永远不知道。

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

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

于 2009-09-18T06:44:45.163 回答
6

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

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

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

于 2009-09-18T01:38:49.873 回答
3

我不确定这会回答这个问题,但您可能会对 Weblogic Server 集群在后台工作的方式感兴趣。从《掌握 BEA WebLogic Server 》一书中:

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

于 2009-09-18T01:52:46.210 回答
2

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

这些交换机的零售价在 3 到 1 万美元之间,尽管我的商业伙伴一年前在 eBay 上以大约 300 美元的价格购买了一个。如果您负担得起,它们确实代表了一种经过验证的硬件解决方案,可以解决如何让服务透明地分布在多个服务器上的问题。Redhat 包含一个内置端口配置,因此您可以使用便宜的 RedHat 盒子实现自己的 Cisco 交换机。谷歌搜索“虚拟 IP 地址”和“思科内容路由器”以获取更多信息。

于 2009-09-18T02:11:37.327 回答
1

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

于 2009-09-18T02:18:21.157 回答