通过UDP分散负载平衡

时间:2013-10-31 18:05:13

标签: networking load udp cloud load-balancing

我正在尝试使用以下方案实现一些分散的负载平衡和资源管理:

  • 每个服务器都会定期发送UDP广播或多播 间隔(例如每分钟或30秒),让附近的其他服务器知道 它提供的服务以及它的健康状况或负载(例如cpu%或内存) 用法或网络流量等。)

  • 具有可用于帮助重载服务器的资源的服务器 可以为其广播/多播添加额外的服务,从而减少 负载过载的服务器。

UDP流量的额外开销是否会降低已经忙碌的网络中的性能?更少冗余和更集中的方法会更好吗?

我打算使用它不仅仅是传统的负载平衡(例如,在必要时启动新的云服务器)。

另一种变化是在达到某个负载阈值时仅广播/多播。

任何建议或其他选项/建议都将受到赞赏,特别是关于对底层网络和相关设备等的影响。

1 个答案:

答案 0 :(得分:1)

具有服务器当前使用级别的小型UDP数据包不会导致网络崩溃,即使是已经忙碌的网络也是如此。由于丢失的数据包导致重传,TCP更擅长这样做,从而产生更多的流量,但即便如此,由于几个原因,这也不会成为问题。

首先,您的客户端流量可能来自与您的服务器用来相互通信的网络不同的网络。如果愿意,您可能决定创建一个心跳LAN。

即使所有流量都驻留在同一网络上,客户端流量也会受到WAN容量的限制,而WAN容量始终低于LAN容量。这意味着您将拥有LAN容量(除非其他东西正在为您的本地网络引入流量)。

我认为在分散模型中进行负载均衡很有意思,但是会带来许多挑战,事实上是否可行,更不用说取决于你试图加载平衡的应用程序......

我假设你知道正常的负载均衡是如何工作的。试图在没有首先理解它取代它的情况下这样做意味着你真的很难。

因此,作为第一次传递,其关键在于有一个应用程序可以将其客户端发送到另一台服务器。您描述的广播将允许服务器知道是否还有其他服务器可以重定向客户端,如果满足某些阈值。

正如您所说,如果服务器真的受到重创,它可能无法处理它正在接收的数据包。在理想状态下,服务器会在达到该限制之前将工作转移到另一台服务器,但是您可以选择,是否希望服务器在100%使用之前开始拒绝连接?不利的一面是,你从来没有充分利用你的硬件,你可以达到所有服务器都在转移用户的程度,同时你仍然需要使用cpu周期。请记住,即使使用IaaS,如亚马逊的AWS,也存在旋转时间,用户请求的突然跳跃并不罕见。

您将面临的另一项重大挑战是容错。

首先,如果服务器与实时客户端一起变暗,他们联系谁,他们与之交谈的最后一台服务器(假设有一台服务器)?如果客户端离开该服务器的原因是因为它被重载了怎么办?也许他可以用非常轻的“给我一个新的资源”请求去他的旧服务器。如果旧服务器的负载已经丢失,它可以指定自己,如果没有,它可以将其推送给其他人。但请记住,虽然发生了这一切,但用户却没有获得他们到达的服务。

容错的第二个方面是保持其他服务器的健康状态准确。你说你希望你的服务器广播或多播它们是健康状态,丢失的数据包有多少构成一个服务器?网络一直在丢弃数据包,这是它们的工作方式,但是如果你将客户端推送到duff服务器,只是让客户端请求超时,它再次回到你身边,这对客户来说是糟糕的服务。如果客户端和服务器位于同一个局域网上,那么您不会受到太大影响,但是您将在互联网上获得的延迟类型添加到客户端/服务器通信中,并且您的用户可能会感到无聊。

您必须克服的下一个问题是,仅仅因为服务器发送它的状态,并不意味着应用程序正常运行。通过集中式SLB,针对每个服务器运行测试请求,该服务器检查其所有应用程序是否正常运行,如果不是,则将服务器从池中取出。我认为您不希望每个服务器都在测试其他服务器的运行状况。这会吸引你很多资源。我一般不相信服务器能够提供自己的健康状态,但我认为如果你想让它发挥作用,你必须在某种程度上做到这一点。回过头来看,您正在刻录资源来运行查询,回答它们然后检查结果。这些都是可以为用户请求提供服务的周期。

我能想到的最后一个问题是初次接触。如果使用DNS循环,则必须确保这些地址上的服务器正常运行。您不希望用户在开始之前必须等待超时。我不确定在您的客户端写一个地址列表或DNS主机名也会有所帮助。客户端仍然会按照列表的方式工作,而不是按照他们到达的目的。

这一切都很有趣,我希望它有所帮助。但是我要问的问题是,你想通过分散负载平衡来实现什么目标?可能解决了我提出的所有问题,但是如果不了解你的目标,就很难说是否有更简单的解决方案。

仍然希望这有帮助, 亚历