由于某种原因,在使用 wlc 或 lc 调度程序时,ipvsadm 似乎无法均衡我的真实服务器之间的连接。一台真实服务器被请求压得喘不过气来,而其他服务器收到的连接相对较少。
我的 ldirectord.cf 文件如下所示:
quiescent = yes
autoreload = yes
checktimeout = 10
checkinterval = 10
# *.example.com http
virtual = 192.0.2.111:http
real = 10.10.10.1:http ipip 10
real = 10.10.10.2:http ipip 10
real = 10.10.10.3:http ipip 10
real = 10.10.10.4:http ipip 10
real = 10.10.10.5:http ipip 10
scheduler = lc
protocol = tcp
service = http
checktype = negotiate
request = "/lb"
receive = "Up and running"
virtualhost = "site.com"
fallback = 127.0.0.1:http
我认为可能导致问题的奇怪原因(但我真的不确定)是 ipvsadm 似乎没有正确跟踪活动连接,它们都显示为非活动连接
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.0.2.111:http lc
-> 10.10.10.1:http Tunnel 10 0 10
-> 10.10.10.2:http Tunnel 10 0 18
-> 10.10.10.3:http Tunnel 10 0 3
-> 10.10.10.4:http Tunnel 10 0 10
-> 10.10.10.5:http Tunnel 10 0 5
如果我这样做,ipvsadm -Lnc
那么我会看到很多连接,但仅处于 ESTABLISHED 和 FIN_WAIT 状态。
我之前在基于 Gentoo 的负载均衡器上使用过 ldirectord,并且 activeconn 曾经是准确的,但自从迁移到 Ubuntu 10.4 LTS 后似乎有些不同。
# ipvsadm -v
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
那么,ipvsadm 是否没有正确跟踪活动连接,从而导致负载平衡工作不正确?如果是,我该如何让它再次正常工作?
编辑:它变得更加奇怪,如果我cat /proc/net/ip_vs
那么看起来正确的activeconns就在那里:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP C000026F:0050 rr
-> 0AB42453:0050 Tunnel 10 1 24
-> 0AB4321D:0050 Tunnel 10 0 23
-> 0AB426B2:0050 Tunnel 10 2 25
-> 0AB4244C:0050 Tunnel 10 2 22
-> 0AB42024:0050 Tunnel 10 2 23
答案1
使用 lc(最少连接)时,如果所有服务器的连接数相同,则它将始终向列表中的第一个服务器提供新连接。这可能意味着,如果您的利用率非常低,并且只是偶尔连接,则该连接将始终转到列表中的第一个主机。
答案2
我最喜欢的是 wrr(加权循环)。我假设您使用的是 DR 方法(直接路由),对吗?
在这种情况下,ipvsadm 不会看到这样的连接,因为来自 RS(真实服务器)的答复将直接发送给客户端 - 而不是通过 LB 返回。
答案3
根据您的连接数来判断,这对您来说可能不是问题,但如果其中一个真实服务器的响应速度比其他服务器慢,则您可能会得到连接数分布不均匀的情况,由于它更快地堆积连接,因此每次它获得的新连接数会比其他服务器少。
答案4
David 的命令输出表明他正在使用隧道模式 (IPIP),该模式通常设置为 DR 的变体。我们需要查看一些路由表或图表才能更好地理解他的设置。
但我同意 LVS 中的连接跟踪可能会出现混乱,因为它看不到 TCP FIN 数据包。
ipvsadm 有一些设置可以更快地使过期连接超时。例如,以下命令将在 1 小时后使不活动的连接超时:
/sbin/ipvsadm --set 3600 120 300
客户端的来源应该仔细检查。LVS 的默认行为是通过客户端 IP 进行持久连接。因此,如果使用 wget 或 ab 从同一测试客户端 IP 进行压力测试,所有连接都将发送到同一 realserver。
哈普罗西是一种更智能的负载均衡器,但需要位于数据包的返回路径中才能完全透明地工作。