我已经在本地测试/测试了服务器集群一段时间,没有出现任何问题。我最近设置了我的服务器集群进行实时测试,我注意到了一些问题,并且认为我的集群中的 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 问题。