全局最大连接数和服务器最大连接数haproxy之间的区别

101

我有一个关于我的haproxy配置的问题:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 syslog emerg
    maxconn     4000
    quiet
    user        haproxy
    group       haproxy
    daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode        http
    log         global
    option      abortonclose
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor
    option      redispatch
    timeout connect 10000 # default 10 second time out if a backend is not found
    timeout client 300000 # 5 min timeout for client
    timeout server 300000 # 5 min timeout for server
    stats       enable

listen  http_proxy  localhost:81

    balance     roundrobin
    option      httpchk GET /empty.html
    server      server1 myip:80 maxconn 15 check inter 10000
    server      server2 myip:80 maxconn 15 check inter 10000

正如您所看到的那样,这很简单,但是我对maxconn属性的工作原理有点困惑。

有全局的和在listen块中的服务器的maxconn,我的想法是:全局的管理haproxy作为服务一次排队或处理的连接总数。如果数字超过了这个数字,它会杀死连接,还是在某些Linux套接字中池化?如果数字超过4000,我不知道会发生什么。

然后你有设置为15的服务器maxconn属性。首先,我将其设置为15,因为我的php-fpm,这是转发到另一台服务器上的,只能使用有限数量的子进程,因此我确保在这里汇集请求,而不是在php-fpm中。我认为这更快。

但是回到主题,我对这个数字的理解是,此块中的每个服务器一次只会发送15个连接。然后连接将等待一个开放的服务器。如果我打开cookie,则连接将等待正确的开放服务器。但我没有。

那么问题是:

  1. 如果全局连接超过4000会发生什么?他们会死亡吗?还是在Linux上池化?
  2. 除了不能拥有大于全局连接的总服务器连接数之外,全局连接与服务器连接有关系吗?
  3. 在计算全局连接时,不应该是在服务器部分中添加的连接总数再加上一定比例的汇集吗?显然,您还有其他连接限制,但实际上是要发送到代理的连接数量吗?

提前谢谢。

1个回答

182

Willy通过电子邮件为我解答了问题。我想分享一下。他的答案以粗体字显示。

我有一个关于我的haproxy配置文件的问题:

   #---------------------------------------------------------------------
   # Global settings
   #---------------------------------------------------------------------
   global
       log         127.0.0.1 syslog emerg
       maxconn     4000
       quiet
       user        haproxy
       group       haproxy
       daemon
   #---------------------------------------------------------------------
   # common defaults that all the 'listen' and 'backend' sections will 
   # use if not designated in their block
   #---------------------------------------------------------------------
   defaults
       mode        http
       log         global
       option      abortonclose
       option      dontlognull
       option      httpclose
       option      httplog
       option      forwardfor
       option      redispatch
       timeout connect 10000 # default 10 second time out if a backend is not found
       timeout client 300000 # 5 min timeout for client
       timeout server 300000 # 5 min timeout for server
       stats       enable

   listen  http_proxy  localhost:81

       balance     roundrobin
       option      httpchk GET /empty.html
       server      server1 myip:80 maxconn 15 check inter 10000
       server      server2 myip:80 maxconn 15 check inter 10000

如您所见,这很简单,但我对maxconn属性的工作方式有些困惑。

有全局的和在服务器中listen块内的maxconn。

还有另一个在listen块中,默认为2000左右。

我的想法是这样的:全局的管理haproxy作为服务时将同时排队或处理的连接总数。

正确。它是每个进程可并发连接的最大数量。

如果连接数超过此限制,它会杀死连接,或者在linux socket中保持连接?

后者,它仅停止接受新连接,并在内核中的套接字队列中保留它们。可排队套接字的数量由(net.core.somaxconn,net.ipv4.tcp_max_syn_backlog 和listens块的maxconn)的最小值决定。

如果连接数超过4000会发生什么,我不知道。

多余的连接等待另一个连接完成,然后才被接受。但只要内核队列没有饱和,客户端甚至不会注意到这一点,因为连接在TCP层被接受,但未被处理。因此,客户端只会注意到一些延迟来处理请求。但实际上,listen块的maxconn更重要,因为默认情况下比全局的更小。 listen的maxconn限制每个侦听器的连接数。通常明智地为服务所需的连接数配置它,并将全局maxconn配置为haproxy处理的最大连接数。当您只有一个服务时,两者可以设置为相同的值。但是,当您有很多服务时,您可以很容易地理解它会产生巨大的差异,因为您不希望单个服务占用所有连接并防止其他服务正常工作。

然后您在服务器中设置了maxconn属性为15。首先,我将其设置为15,因为我转发到的php-fpm在另一台服务器上,只有这么多个子进程可以使用,因此我确保在这里汇集请求,而不是在php-fpm中。我认为这样更快。

是的,不仅应该更快,而且可以让haproxy在可能的情况下找到另一个可用的服务器,还可以在将连接转发到服务器之前取消队列中的请求,如果客户端在连接被转发到服务器之前点击“停止”。

但回到主题,我对这个数字的理解是:此块中的每个服务器一次只会收到15个连接。然后连接将等待打开的服务器。如果我有cookies,则连接将等待CORRECT打开的服务器。但我没有。

这正是原则。有每个代理和每个服务器队列。具有持久性cookie的连接转到服务器队列,其他连接转到代理队列。但由于在您的情况下未配置cookie,所有连接都转到代理队列。如果您想了解如何/在哪里做出决策,请查看haproxy源中的doc / queuing.fig图表。

所以问题是:

  1. 如果全局连接超过4000会发生什么?它们会死亡吗?或以某种方式在Linux池中?

    它们在linux中排队。一旦您压倒内核队列,它们就会在内核中被删除。

  2. 除了不能使总服务器连接


12
我有一个haproxy,代理了约200个其他后端。一旦某个后端遭受大约每秒300,000个连接的DDOS攻击,所有其他后端都会崩溃。在后端服务器(在DDOS下)上设置maxconn 2048值后,我们的haproxy可以正常运行。非常感谢你,你救了我一个晚上 :) - hungnv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接