负载平衡UDP服务器

我有一个udp服务器,这是我业务stream程中的核心部分。 为了处理我在生产环境中所期望的负载,我可能需要2到3个服务器实例。 服务器几乎是完全无状态的,它主要收集数据,而它上面的层知道如何处理可能来自多个服务器实例的最小数量的陈旧数据。

我的问题是,我怎样才能实现服务器之间的负载平衡? 我宁愿尽可能均匀地在服务器之间分配请求。 我也希望有一些保真度,我的意思是如果客户端X被路由到服务器y,那么我希望X的所有后续请求都去服务器Y,只要它是明智的,不会超载Y.

顺便说一下,这是一个.NET系统…你会推荐什么?


状态是服务器内部的,而不是某种事务。 状态是服务器从接收的数据中汇集的一些数据,并且通过一个简单的WCF WebService来查询。 该应用程序是基于UDP,虽然我不同意这个决定,但是“高于我的工资等级”

我目前正在尝试MS的NLB,它工作正常,开箱即用的保真度的东西,但它会在整个networking上产生噪音…

也没有DNS …哦,这是一个完全服装协议。

我有一个udp服务器,服务器几乎是完全无状态[…]有一定的保真度,我的意思是如果客户端X被路由到服务器y,那么我想X的所有后续请求去服务器Y只要它是明智的,不会超载Y.

那么,你使用的是一个未公开的应用程序协议,保持一些应用程序的状态,并运行在UDP之上? 你有点困难。 UDP不是一个可靠的数据传输,这就是它的全部重点 – 对于可靠的数据传输来说,看看它的stream行朋友TCP。 你可以得到你的“保真度”的唯一方法是有一个负载均衡代理,它理解你的应用层协议,并知道你当前的应用程序状态是什么,并可以采取相应的行动。

我看到3种方法接近提供您所寻求的:

  • 基于 (最终用户)IP地址,将传入连接静态分散到3个IP地址之外。 这样一个给定的用户将总是被定向到相同的服务器。 大多数专业的防火墙都可以为你做到这一点。 您可能必须自己使3台服务器高度可用,因为大多数防火墙不会为您执行后端运行状况检查。

  • 使用DNS,并使用DNS循环,正如Matt Simmons所build议的那样。

  • 使用Windows内置的networking负载平衡(NLB) 。 老实说,我不知道如何使用NLB和半状态的基于UDP的服务来实现故障转移场景 – 您必须根据您的应用程序处理状态来自行调查。 从好的方面来说,NLB非常容易设置,免费的Windows许可证,成熟和良好的performance。

Linux虚拟服务器是构build在真实服务器集群上的高度可扩展且高度可用的服务器。 LVS支持UDP协议和源哈希algorithm(当您希望客户端总是出现在同一个realserver上时使用此algorithm)。

我使用LVM来平衡DNS(rr),SIP(sh)。

有趣。 我见过的大多数代理软件都是基于TCP的。

在我微薄的体验中,大部分UDP特定的负载平衡都是基于DNS的(即:时间服务器,DNS服务器等)。 有没有办法提供多个Alogging? 如果这样做的话,正常的DNS Round Robin将确保请求的公平分配(无论如何可能是公平的),并且客户端caching将确保保真度被保留(假设您在客户端使用基于caching的平台)。

您可以使用任何types的负载均衡器执行此操作,无论是硬件还是软件,您都可以根据您的需要从不同的负载均衡器中进行select。

3级负载均衡器:仅通过查看inputIP和可用后端IP来负载均衡,这种负载均衡器通过总是将相同的inputIP地址发送到相同的后端来确保粘性,尽pipe这种策略可以超载如果很多客户端来自同一个IP(无论是代理还是公司网关)

7级负载均衡器: 7级负载均衡器不仅可以平衡为3级平衡器,还可以查看包的内容,这将为您的平衡策略提供更多的灵活性。

考虑到你正在使用UDP,两个平衡器都应该提供良好的性能,UDP中的深度数据包检测也比TCP更有限(仅仅是出于协议原因)。

根据您的预算,您可以先使用软件负载平衡器(例如linux + IPVS),然后开始升级到硬件负载平衡器,如Cisco或Netapp

开源的NGINX和应用交付平台NGINX Plus现在支持UDP负载均衡。 新function基于我们现有的TCP和HTTPfunction,使NGINX成为一个function更强大,易于使用和一致的前端,可用于更广泛的互联网应用和设备。

在发行版nginx-1.9.13中可用