haproxy:在高负载下保留现有会话,为新来者提供“ 503”服务


12

尝试按照标题中的说明进行操作:在高负载下保留现有的会话,并为新到达的访客提供503消息。

问题:它可以工作,但是会话持续时间不会超过90秒。

目前的结果让我想知道是否缺少我想要的超时设置。

目的

我正试图让haproxy达到:

  • 当前端上的会话总数低于特定阈值时,将对会话的请求发送到backend-001。
  • 当前端上的会话总数超过该阈值时,向会话提供503错误
  • 即使会话数超过阈值,也允许请求现有会话

这样,正在填写多步骤表单的访客就不会对503错误感到惊讶,并且可以告诉新访客“请稍后再回来,因为我们现在很忙”。

设定

设置如下:

            {visitors}
                ↓ 
            [haproxy]
                ↓ 
[rails app on unicorn served by nginx]   (right now just one 
                                            backend: 'backend-001')

目前的方法

为了达到上述目的,我使用以下配置。

这是一个测试,具有非常低的限制(前端有10个连接(fe_conn gt 10)),以使测试更加容易。

为了使服务器承受一定的负载,我使用httperf,如下所示:

httperf --hog --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 --rate 2

global
    daemon
    maxconn 10000

defaults
    mode        http
    timeout connect 6s
    timeout client  60s
    timeout server  60s
    balance roundrobin
    option http-server-close

frontend http-in
    bind [PUBLIC_IP]:80

    default_backend backend-001

    acl too_many fe_conn gt 10
    use_backend b_too_many if too_many

backend backend-001
    fullconn 10
    appsession _session_id len 128 timeout 7200s

    cookie SERVERID insert maxidle 7200s
    server Server1 127.0.10.1:80 cookie backend-001 check

backend b_too_many
    errorfile 503 /var/www/50x.html

问题

如上所述,问题是:它几乎可以工作,但是会话持续时间不会超过90秒。

如果继续单击,即使有10个会话繁忙,您也可以保持会话状态。

尝试使用其他浏览器实例打开服务器上的页面会收到503错误。

因此,看来我快到了。有谁知道会导致短会话时间的原因吗?

特别是我该如何解决它:)

(编辑:从“服务器”行中删除“权重1 maxconn 10”,不相关,可能会造成混淆)(编辑第二条:将“前端的10个会话”更正为“前端的10个连接”)


可能是一个愚蠢的问题-nginx中的keep_alive设置是什么?显然默认情况下是75s-这可能是问题吗?
艾丹·凯恩

Answers:


4

不幸的是,您似乎完全混淆了应用程序级会话的连接。访问该网站的用户可能有一个cookie,使您认为他拥有一个连接,而事实并非一定如此。他可能会打开所需数量的连接以获取对象和浏览页面。

您肯定会观察到的90秒是浏览器的空闲连接超时。

可以实现您想要的功能,但是要复杂得多,因为您还必须考虑请求中是否存在持久性Cookie,以确定访问者是否是新访问者。

通常,依靠平均每服务器连接数比前端连接数更有效。原因是服务器死机时,您需要重新调整该数字。最有效的方法是设置服务器maxconn值以启用排队,并使用avg_queue,以便该限制适用于服务器上排队的请求的平均数量。这样,当由于现有访问者而导致负载增加时,您可以正确地处理已知访问者,同时将新用户轻轻地移动到另一个后端。


1
谢谢谢谢!这清除了很多。现在,我通过其他方法来检查它与hdr_sub的后端cookie(因此,“ hdr_sub(cookie)SERVERID = backend-001”)。完成后,我将发布一个有效的配置。
Apenootje 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.