IPvsadm 在 wlc 调度程序上不均衡平衡

IPvsadm 在 wlc 调度程序上不均衡平衡

由于某种原因,在使用 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。

哈普罗西是一种更智能的负载均衡器,但需要位于数据包的返回路径中才能完全透明地工作。

相关内容