代码之家  ›  专栏  ›  技术社区  ›  Mike Dinescu

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

  •  19
  • Mike Dinescu  · 技术社区  · 15 年前

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

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

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

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

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

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

    谢谢大家抽出时间~

    5 回复  |  直到 7 年前
        1
  •  10
  •   Matt Davis    15 年前

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

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

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

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

        2
  •  6
  •   Jonathan Graehl    15 年前

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

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

    MapReduce 如果合适的话。这将节省大量工作。

        3
  •  3
  •   Pascal Thivent    15 年前
        4
  •  2
  •   PaulMcG    15 年前

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

        5
  •  1
  •   yfeldblum    15 年前

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