Chr*_*oph 8 reverse-proxy load-balancing tcp f5-big-ip high-load
过去几天我一直在挠头,试图为以下问题提出解决方案:
在我们的数据中心,我们有一个运行在 BigIP 硬件上的 F5,它充当来自全国各地不同办公地点的客户端机器的 HTTPS 请求的单一入口点。F5 终止 TLS,然后将所有请求转发到两个 Traefik 负载均衡器,后者将请求路由到各种服务实例(Traefik 节点在 Red Hat Enterprise 上的 Docker 中运行,但我认为这与我的问题无关)。从吞吐量、CPU 和内存的角度来看,这三个网络组件完全有能力处理大量请求和流量,并有足够的备用容量。
但是,我们注意到客户端发出的 HTTP(S) 请求频繁出现 1000 毫秒的延迟,尤其是在高负载时间。我们将问题跟踪到以下根本原因:
显然,那些 1000 毫秒的延迟是绝对不能接受的。所以到目前为止我们已经考虑了以下解决方案:
我会丢弃#1,因为那只是创可贴。延迟仍然发生,只是不太明显。#3 无论如何都不会产生任何影响,#4 很可能会使系统无法正常工作。剩下#2和#5。
但根据我看了几十篇帖子和技术文章后了解到的,两者最终只会减少那些“碰撞”的机会。因为,最终阻止发送方 F5(伪)随机选择在目标 Traefik 主机上仍处于 TIME_WAIT 状态的临时端口、源 IP 和目标端口的组合,无论 fin_timeout 设置有多短(哪个无论如何都应该保持在几秒范围内)?我们只会减少碰撞的可能性,而不是消除它。
经过我所有的研究和巨大的 Web 应用程序时代,我真的很惊讶这个问题在 Web 上没有更多的讨论(和可用的解决方案)。我非常感谢您关于在 TCP 领域是否有更好、更系统的解决方案来推动碰撞发生接近零的想法和想法。我正在考虑 TCP 配置的思路,该配置将允许 Traefik 主机立即接受新连接,尽管旧连接处于 TIME_WAIT 状态。但截至目前,没有运气找到。
随意的想法和要点:
更新:根据星实验,net.ipv4.tcp_fin_timeout 设置不影响 TIME_WAIT 状态,只影响 FIN_WAIT_2 状态。根据Samir Jafferali 的说法,在 Linux 系统(包括我们的 Red Hat Linux)上,TIME_WAIT 时间段在源代码中是硬编码的,无法配置。根据来源,在 BSD 上它是可配置的,但我还没有验证这一点。
在我们的数据中心,我们有一个在 BigIP 硬件上运行的 F5,它充当来自我们全国各地办公地点的客户端计算机的HTTPS 请求的单一入口点。
如果这个单点(前端)在将连接向下传递到后端时保持单一,为什么您想知道这些问题?特别是如果连接强度“可能每秒超过 100 个”。
您的设置基本上是将一组基数较高的集合压缩到另一组基数明显较低的集合中。
最终只会减少那些“碰撞”的机会
这是分组交换网络如何工作的基础。比如说,在以太网级别也存在冲突。随机性是不可避免的,TCP/IP 正在处理它。事实上,IP 协议本身的构建并没有考虑到 LAN(但在那里仍然可以很好地工作)。
所以是的,“添加更多源 IP 和/或让 Traefik 监听多个端口”是相当合理的遵循方式。