我有一个 udp 服务器,它是我业务流程的核心部分。为了处理生产环境中预期的负载,我可能需要 2 或 3 个服务器实例。该服务器几乎完全无状态,它主要收集数据,其上层知道如何处理可能来自多个服务器实例的最少量的陈旧数据。
我的问题是,如何在服务器之间实现负载平衡?我希望在服务器之间尽可能均匀地分配请求。我还希望具有一定的保真度,我的意思是,如果客户端 X 被路由到服务器 y,那么我希望 X 的所有后续请求都转到服务器 Y,只要这是合理的并且不会使 Y 过载。
顺便说一下,它是一个.NET 系统...您会推荐什么?
状态是服务器内部的状态,而不是某种类型的事务。状态是服务器从其接收的数据中聚合的一些数据,并且可以通过简单的 WCF WebService 进行查询。该应用程序基于 UDP,虽然我不同意这个决定,但它“超出了我的能力范围”
我目前正在尝试 MS 的 NLB,它运行良好,可以实现开箱即用的保真度,但它会在整个网络上产生噪音......
也没有 DNS...哦,这是一个完全的服装协议。
答案1
我有一个 udp 服务器,[...] 服务器几乎完全无状态 [...] 具有一定的保真度,我的意思是如果客户端 X 被路由到服务器 y,那么我希望 X 的所有后续请求都转到服务器 Y,只要它是合理的并且不会使 Y 过载。
那么,您使用的是未公开的应用程序协议,该协议可保存某些应用程序状态,并在 UDP 上运行?您的方向有点困难。UDP 不是一种可靠的数据传输,这就是它的全部意义所在——可靠的数据传输请参见其流行的朋友 TCP。获得“保真度”的唯一方法是拥有一个负载平衡代理,它理解你的应用层协议,并且知道你目前的申请状态是什么并能采取相应行动。
我发现有三种方法可以满足您的需求:
根据以下情况将传入连接静态分散到 3 个 IP 地址上来源(最终用户)IP 地址。这样,给定用户将始终被定向到同一台服务器。大多数专业防火墙都可以为您做到这一点。您可能必须自己使 3 台服务器高度可用,因为大多数防火墙不会为您进行后端健康检查。
使用 DNS,并使用 DNS Round Robin,正如 Matt Simmons 所建议的那样。
使用 Windows 内置的网络负载平衡 (NLB)。老实说,我不知道故障转移方案在 NLB 和半状态 UDP 服务的情况下会如何发挥作用——您必须根据应用程序处理状态的方式自行调查。从好的方面来看,NLB 非常容易设置,使用 Windows 许可证免费,成熟且性能良好。
答案2
Linux 虚拟服务器是建立在真实服务器集群上的高可扩展性和高可用性的服务器。LVS 支持 UDP 协议和源哈希算法(当你希望客户端始终出现在同一个真实服务器上时使用)。
我使用 LVM 来平衡 DNS(rr)、SIP(sh)。
答案3
有趣。我见过的大多数代理软件都承认是基于 TCP 的。
在我有限的经验中,我见过的大多数特定于 UDP 的负载平衡都是基于 DNS 的(即:时间服务器、DNS 服务器等)。有没有办法提供多个 A 记录?如果可行,正常的 DNS 循环将确保公平分配请求(无论如何可能足够公平),而客户端缓存将确保保留保真度(假设您在客户端使用基于缓存的平台)。
答案4
开源 NGINX 和应用交付平台 NGINX Plus 现支持 UDP 负载平衡。新功能以我们现有的 TCP 和 HTTP 功能为基础,使 NGINX 成为功能强大、易于使用且一致的前端,适用于更广泛的互联网应用和设备。
nginx-1.9.13 版本中可用