调试 HAProxy

调试 HAProxy

我已经在本地测试/测试了服务器集群一段时间,没有出现任何问题。我最近设置了我的服务器集群进行实时测试,我注意到了一些问题,并且认为我的集群中的 HAProxy 可能遇到了一些问题。

首先,我将简要介绍一下集群的结构,也许我的设置方式存在问题,也许我需要多个代理。

我有两个 HAProxy 正在平衡的服务器集群。我们将它们称为 SC1 和 SC2。主集群是 SC1,HAProxy 端口 80 上的任何内容都将发送到 SC1。SC1 将处理该请求,并通过端口 8080 上的代理向 SC2 发送另一个请求。我认为这不会是个问题,但我注意到我的服务器日志上经常显示 SC1 无法连接到 SC2,我相信这是因为我的 HAProxy 超载了。

我认为 HAProxy 超载的原因是,当我查看统计页面时,它通常需要 1 秒以上才能响应。因此,我决定查看 HAProxy 日志。我注意到日志中存在异常,我认为这可能与我的问题有关。每隔一分钟左右(有时多一点,有时少一点),我就会收到以下消息:

Oct  8 15:58:52 haproxy rsyslogd-2177: imuxsock begins to drop messages from pid 3922 due to rate-limiting
Oct  8 15:58:52 haproxy kernel: [66958.500434] net_ratelimit: 2997 callbacks suppressed
Oct  8 15:58:52 haproxy kernel: [66958.500436] nf_conntrack: table full, dropping packet

我想知道这会带来什么后果。这只会导致丢包,还是也会导致延迟?我该如何解决这个问题?我正在运行 Ubuntu 12.04LTS Server。

以下是我对 sysctl 的修改:

fs.file-max = 1000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

这是我的配置文件:

global
   log /dev/log   local0 info
   log /dev/log   local0 notice
   maxconn 50000
   user u1
   group g1
   #debug

defaults
   log     global
   mode    http
   option  httplog
   option  dontlognull
   option  forwardfor
   retries 3
   option redispatch
   option http-server-close
   maxconn 50000
   contimeout      10000
   clitimeout      50000
   srvtimeout      50000
   balance roundrobin

listen  sc1 255.255.255.1:80
    maxconn 20000
    server  sc1-1 10.101.13.68:80 maxconn 10000
    server  sc1-2 10.101.13.66:80 maxconn 10000
listen  sc1-1_Update  255.255.255.1:8181
    maxconn 20000
    server  sc1-1 10.101.13.66:80 maxconn 20000
listen  sc1-2_Update  255.255.255.1:8282
    maxconn 20000
    server  sc1-2 10.101.13.68:80 maxconn 20000
listen  sc2 255.255.255.1:8080
    maxconn 30000
    server  sc2-1 10.101.13.74:80 maxconn 10000
    server  sc2-2 10.101.13.78:80 maxconn 10000
    server  sc2-3 10.101.13.82:80 maxconn 10000
listen  sc2-1_Update 255.255.255.1:8383
    maxconn 30000
    server  sc2-2 10.101.13.78:80 maxconn 15000
    server  sc2-3 10.101.13.82:80 maxconn 15000
listen  sc2-2_Update 255.255.255.1:8484
    maxconn 30000
    server  sc2-1 10.101.13.74:80 maxconn 15000
    server  sc2-3 10.101.13.82:80 maxconn 15000
listen  sc2-3_Update 255.255.255.1:8585
    maxconn 30000
    server  sc2-1 10.101.13.74:80 maxconn 15000
    server  sc2-2 10.101.13.78:80 maxconn 15000
listen  stats :8888
    mode http
    stats enable
    stats hide-version
    stats uri /
    stats auth user:pass

sc1 和 sc2 是主集群。当我需要更新服务器时,我会使用其他所有集群(例如,在 haproxy 上将端口 80 转发到 8181,以更新服务器 sc1-1)。

任何关于此问题的帮助都将不胜感激。

谢谢

答案1

您的连接跟踪表似乎已满。删除使用连接跟踪的 iptables 规则可以解决问题。

如果这不是一个选项并且您有可用的 RAM,您可以增加表大小:

cat /proc/sys/net/netfilter/nf_conntrack_max
echo 131072 > /proc/sys/net/netfilter/nf_conntrack_max

您可能还应该增加哈希大小:

cat /sys/module/nf_conntrack/parameters/hashsize
echo 32768 > /sys/module/nf_conntrack/parameters/hashsize

这些数字只是我桌面上默认设置的两倍,我不确定你到底需要什么。你还需要将其添加到 sysctl.conf 中。

我会非常小心地使用net.ipv4.tcp_tw_recycle它,因为它会导致严重的 NAT 问题。

相关内容