HAproxy 循环平衡似乎没有均匀分布

and*_*rew 6 configuration load-balancing haproxy

我知道在加载服务器的情况下,HAproxy (1.4.4) 中的 roundrobin 不会均匀分布,但我的服务器目前没有流量(测试设置),并且 roundrobin 平衡做了 www1,www1,www1,www1,www1,... www2,www2,www2,...,www1...

我通过在每台服务器 cat /etc/HOSTNAME (slackware) 上运行脚本来验证这一点。我每次都需要让它来回切换以测试一些会话内容(存储在共享的 memcached 中),但是在每次请求时让它在我的两个 Web 服务器之间切换时遇到问题。

global
    log     127.0.0.1 local0 warning
    maxconn     4096
    chroot      /usr/share/haproxy
    pidfile     /var/run/haproxy.pid
    uid     99
    gid     99
    daemon

defaults
    balance     roundrobin
    fullconn    100
    maxconn     4096
    mode        http
    option      dontlognull
    option      http-server-close
    option      forwardfor
    option      redispatch
    retries     3
    timeout     connect 5000
    timeout     client  20000
    timeout     server  60000
    timeout     queue   60000
    stats       enable
    stats       uri /haproxy
    stats       auth ***:***

frontend www *:80
    log     global
    acl     is_upload hdr_dom(host) -i uploads.site.com
    acl     is_api hdr_dom(host) -i api.site.com
    acl     is_dev hdr_dom(host) -i dev.site.com
    use_backend uploads.site.com if is_upload
    use_backend api.site.com if is_api
    use_backend dev.site.com if is_dev
    default_backend site.com

backend site.com
    option  httpchk HEAD /alive.php HTTP/1.1\r\nHost:site.com
    server  www1 1.1.1.1:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2
    server  www2 1.1.1.2:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2

backend api.site.com
    option  httpchk HEAD /alive.php HTTP/1.1\r\nHost:api.site.com
    server  www1 1.1.1.1:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2
    server  www2 1.1.1.2:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2

backend dev.site.com
    option  httpchk HEAD /alive.php HTTP/1.1\r\nHost:dev.site.com
    server  www1 1.1.1.1:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2
    server  www2 1.1.1.2:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2

backend uploads.site.com
    option  httpchk HEAD /alive.php HTTP/1.1\r\nHost:uploads.site.com
    server  www1 1.1.1.1:8080 weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2
    server  www2 1.1.1.2:8080 backup weight 10 minconn 5 maxconn 25 check inter 2000 rise 2 fall 2
Run Code Online (Sandbox Code Playgroud)

所以基本上,我有一些不同的后端(我已经验证了 ACL 正在工作),并选择了默认选项“roundrobin”。我尝试删除权重,删除所有服务器的 minconn/maxconn/fullconn 属性(不仅仅是我正在测试的后端),尝试删除 ACL 等。我一直在 dev.site.com 上进行测试。

任何人都知道为什么我不能得到像 www1,www2,www1,www2,... 这样的东西的原因吗?另外,这是我在这里的第一个问题,所以如果我在帖子中遗漏了任何需要的东西,请告诉我。

谢谢!

Wil*_*eau 2

您绝对应该观察您期望的负载。我怀疑您的某些服务器经常无法响应运行状况检查,并且它们会定期从服务器场中拔出,然后在负载下降后重新插入,并且可以再次响应。

另外,你如何观察不平衡?日志仅记录警告(基本上仅记录故障)。

您还可以检查统计页面,您将看到有多少会话发送到每个服务器,它们启动/关闭多少次,以及是否存在一些排队或至少是否已达到其 maxconn。

  • 这是因为您刷新的页面上有多个对象,并且请求一半是从一台服务器获取的,另一半是从另一台服务器获取的。如果您启用基于 cookie 的持久性,您会发现一旦您访问服务器,只要它保持运行状态,您就会坚持使用它。 (3认同)