我们的基础架构由运行HAProxy和Apache的负载均衡器组成,负责将stream量转发到仅运行Apache的应用服务器。 在过去的几天里,我们已经看到负载均衡器高兴地传递连接洪水,但连接迅速压倒我们的应用服务器。 他们变得没有反应,我们唯一的缓解策略是推出更多的应用服务器来维持洪水。 起初,我们无法确定为什么这些服务器会因为负载平衡器上没有真正的峰值stream量而停止运行,但经过一番调查后,我们发现Apache连接的数量已经超出了预期。
附上一些似乎是洪水唯一指标的图表。 我已经将每个后端服务器的HAProxy maxconn指令降低到了一个更合理的数字(之前的默认值是255),但是我担心新的合法连接将被延迟,直到洪水平息。 该服务似乎对于具有现有连接的用户来说是起作用的,但是由于HAProxy是速率限制而不考虑主机,所以它将出现在新的连接和外部监视服务中。
我们还有什么可以做的(HAProxy或Apache)来帮助我们维持负载,还是应该在networking之外进行过滤? 由于stream量非常小,我觉得还有更多的事情可以做,但是我对HAProxy的所有function并不了解。 我也有兴趣探讨HAProxy是否可以基于IP进行速率限制,但是我还没有发现任何东西。
编辑:我们审计了其中一个负载平衡器的访问日志,最高IP的请求数如下:
1070 69.64.*.* 1227 1.9.*.* 1235 64.71.*.* 1376 69.64.*.* 1459 12.189.*.* 1572 1.9.*.* 1678 208.106.*.* 1982 5.15.*.* 2630 23.22.*.* 3300 76.125.*.* (our office) 3543 216.38.*.*
因此,我们可以dynamic地禁止在一个小窗口内build立太多会话的IP,但是我们不能根据总的请求来阻塞,因为这也能吸引我们。 这条路线有道理吗? 我们应该在负载平衡器上的iptables级别上执行此操作吗?
任何意见非常感谢!
谢谢,
克里斯






首先,如果你所得到的只是连接洪水,在服务器上设置maxconn就足够了,因为haproxy只会向服务器传递有效的请求,而不是没有请求的普通连接。 此外,使用较低的maxconn可以使服务器更快速,并且总体上为用户提供更快的服务(假设你不要太低,至less保持2-3倍于apache机器的CPU核心数量)。
如果你要求洪水,那么你需要更好的对策。 Haproxy 1.5-dev有许多这样的function,它可以将一些IP地址列入黑名单,这些IP地址的请求太多,连接速率太高,并发连接太多,或者出现太多的错误。
希望这有助于!