Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 心跳协议/算法或最佳实践_Sockets_Network Programming_Network Protocols_Distributed Computing - Fatal编程技术网

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

Sockets 心跳协议/算法或最佳实践,sockets,network-programming,network-protocols,distributed-computing,Sockets,Network Programming,Network Protocols,Distributed Computing,最近,我在我编写的一个软件中添加了一些负载平衡功能。它是一个网络应用程序,根据来自SQL数据库的输入执行一些数据处理。由于处理可能非常密集,我添加了在不同服务器上运行此应用程序的多个实例的功能,以分割负载,但现在的负载平衡是手动操作。用户必须指定哪个实例占用输入域的哪个部分 我希望将其提升到下一个级别,并对实例进行编程,以自动协商输入数据的上升,并识别其中一个是否“消失”(崩溃或断电),以便其余实例可以承担失败实例的工作负载 为了实现这一点,我正在考虑在实例之间使用一个简单的心跳协议来确定谁在线

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

我希望将其提升到下一个级别,并对实例进行编程,以自动协商输入数据的上升,并识别其中一个是否“消失”(崩溃或断电),以便其余实例可以承担失败实例的工作负载

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

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

编辑

根据答案,似乎要么没有完善的心跳协议,要么没有人知道这些协议(这意味着它们根本就没有那么完善),在这种情况下,我就要自己动手了

虽然没有一个答案能提供我想要的,但我会投赞成票,因为这是最接近的,他指出了一个使用多播的好主意


感谢大家抽出时间~

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

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


如果合适的话,我建议使用。这将节省大量工作。

我不确定这是否能回答这个问题,但您可能会对Weblogic服务器集群在幕后的工作方式感兴趣。书中:

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


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


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

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

(DIS),它是根据标准1278定义的,通过UDP广播使用默认的5秒心跳。DIS心跳实质上是一个实体状态PDU,它完全定义了给定实体的状态,包括位置。由于其在仿真界的应用,DIS还使用称为航位推算的概念,以在实际位置(例如)超出其预测位置的给定阈值时提供更高频率的心跳

在您的情况下,DIS实体状态PDU将是过度杀伤力。我提到它只是为了说明一个事实,即心跳的频率可以根据环境的不同而变化。我不知道您所描述的应用程序是否需要这样的东西,但您永远不知道

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

关于UDP b需要记住的事情