AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1169769
Accepted
hack4mer
hack4mer
Asked: 2025-01-04 14:10:20 +0800 CST2025-01-04 14:10:20 +0800 CST 2025-01-04 14:10:20 +0800 CST

每个后端服务器的 HAProxy 连接限制仅限于 port_range

  • 772

我正在为 WebSocket 服务器运行 HAProxy 负载均衡器。

如果我把一个后端服务器

backend pieproxy
  option http-keep-alive
  timeout tunnel 0ms

  balance leastconn

  server s1 IP:3001

HAproy 只能处理 28,000 个已建立的连接。

我可以通过添加另一台服务器来解决这个问题并建立更多的连接。

backend pieproxy
  option http-keep-alive
  timeout tunnel 0ms

  balance leastconn

  server s1 IP:3001
  server s2 IP:3001

现在 HAproxy 可以建立两倍数量的连接。

当我降低

sysctl net.ipv4.ip_local_port_range

HAproxy 能够建立的最大连接数为

number of backend server * ip_local_port_range

请帮忙,我遗漏了什么吗?

如何让一台后端服务器提供比 ip_local_port_range 值更多的连接

haproxy
  • 2 2 个回答
  • 47 Views

2 个回答

  • Voted
  1. Best Answer
    Steffen Ullrich
    2025-01-04T14:23:36+08:002025-01-04T14:23:36+08:00

    TL;DR:您看到的限制是 TCP 工作方式所固有的。

    每个 TCP 连接都由一个唯一的三元组 (source_ip, source_port,destination_ip, destination_port) 定义,这意味着不能同时存在多个具有相同三元组的连接,因为它们无法明确区分。destination_ip 和 destination_port 在您的情况下是恒定的,因为您有一个固定的目标服务器。source_ip 是恒定的,因为这是运行 haproxy 的本地系统的 IP 地址。

    因此唯一的变量是 source_port,它取自 ip_local_port_range。

    这意味着您不能从同一个源 ip 到同一个目标 ip:port 建立超过 ip_local_port_range 个并行连接。而且 ip_local_port_range 受限于端口号仅为 16 位(即最大为 65535)。

    请注意,“并行”不仅指同时发生的连接,因为在相同的 source_ip 可以再次被重用之前也可能需要一些时间 - 有关更多信息,请阅读有关 TCP 中的 TIME_WAIT 状态。

    • 2
  2. Willy Tarreau
    2025-01-04T17:35:20+08:002025-01-04T17:35:20+08:00

    一些运行大量连接的人倾向于为此在负载均衡器上设置多个 IP 地址,并声明指向同一地址但来源不同的多台服务器。其他人则作弊,拥有一台带有“源 0.0.0.0 usesrc clientip”的服务器,但他们有一个“set-src”规则,允许从本地地址中选择一个地址。但如上所述,每个源地址的端口数始终被限制为约 64k,因此连接数为 64k。

    请注意,如果您的服务器支持 HTTP/2,您可以通过 HTTP/2 将 WebSocket 作为单独的流传递。每个连接的流限制通常为 100,因此每个服务器可以有 64k 个连接,每个连接有 100 个 websocket 流,因此有 6.4M 个 websocket 流。这可能是一个值得考虑的解决方案。

    • 2

相关问题

  • 是否可以使用负载均衡器加密内部网络服务器之间的流量[关闭]

  • HAProxy 和后端服务器之间丢失一半的数据

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve