【问题标题】:UDP load balancing using customised balancing method with session id inside UDP body使用自定义平衡方法的 UDP 负载平衡,会话 ID 在 UDP 主体内
【发布时间】:2016-06-11 09:49:32
【问题描述】:

我正在尝试设置一个能够对 UDP 流量进行负载平衡的负载平衡解决方案。就我而言,我有几个不同的服务器,它们将 UDP 包发送到负载平衡器。在每个 UDP 包体内,都有一个 MSG-ID 字段。理想情况下,我想根据该 MSG-ID 将 UDP 流量负载平衡到一组服务器。换句话说,两个具有相同 MSG-ID 的 UDP 包应该被发送到同一个服务器(因为我想将两个具有相同 MSG-ID 的 UDP 包组装成一个完整的包以供进一步处理)。但如果不可能,那么基于源/发送方 IP 的解决方案可能就足够了。

Haproxy 不支持 UDP,所以我正在检查 nginx。但似乎只有 nginx-plus(不是免费解决方案)允许您基于 ip_hash 方法进行负载平衡?

我想知道:

  1. 什么是最好的开源解决方案,可以帮助我根据 UDP 正文中的自定义 MSG-ID 处理负载平衡。
  2. nginx(免费/开源)版本是否至少支持基于 ip_hash 方法的 UDP 负载均衡。
  3. 无论如何我可以欺骗 UDP 源/发送方 IP。基本上,如果我有服务器(例如服务器 A)从多个服务器(服务器 D)接收 UDP 包并将其转发到一组服务器(服务器 B,C);我希望服务器 B、C 接收 IP 为服务器 D 的包,而不是 A。
  4. 编写自定义层的缺点是什么,该层读取 UDP 然后形成 TCP 包,然后与负载平衡器保持 TCP 连接以转发新形成的 TCP 包。在这种情况下,nginx 或 haproxy 都可以使用。

谢谢。

【问题讨论】:

  • 负载平衡会造成数据包交付乱序的情况。 TCP 可以处理这个问题,但它会导致性能下降。这真的会弄乱UDP。 UDP 是一种即发即弃协议,无法保证交付。许多实时协议,例如VoIP,使用 UDP。 VoIP 存在乱序数据包传送问题。

标签: networking nginx tcp udp load-balancing


【解决方案1】:

nginx 在开源 nginx(自 v1.19.13 起)和 NGINX Plus 中都支持 UDP 负载平衡。阅读来自 nginx.com 的 post

并且 nginx 提供了基于 ip_hash 的 UDP 负载均衡,请查看docs

所以我认为问题 2 的答案是肯定的。

在文档here 中也提到过,nginx 上游模块在自定义密钥上提供哈希算法,在您的情况下可能是 MSG-ID,但我不知道如何从您的 UDP 中获取 MSG-ID数据报,我想这并不容易。我试图搜索一段时间,但没有运气。如果您找到了解决方案,希望您可以在此问题下分享。

【讨论】:

    【解决方案2】:

    你通常会使用 proxy_bind $remote_addr transparent;在您的服务器 {} 上下文中。请注意,您需要一个(非常)具有上游 / udp 负载平衡支持的最新 nginx 才能工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      相关资源
      最近更新 更多