linux - ldirectord 在真实服务器死机时不传输连接

标签 linux networking load-balancing administration

我正在使用 ldirectord 对两个 IIS 服务器进行负载平衡。 ldirectord.cg 看起来像这样:

autoreload = yes
quiescent = yes
checkinterval = 1
negotiatetimeout = 2
emailalertfreq = 60
emailalert = Konstantin.Boyanov@mysite.com
failurecount = 1

virtual = 172.22.9.100:80
    checktimeout = 1
    checktype = negotiate
    protocol = tcp
    real = 172.22.1.133:80 masq 2048
    real = 172.22.1.134:80 masq 2048
    request = "alive.htm"
    receive = "I am not a zombie"
    scheduler = wrr

负载平衡工作正常,真实服务器可见等等。不过我在简单测试中遇到了问题:

  1. 我打开一些从客户端浏览器 (IE 8) 到托管在真实服务器上的网站的连接
  2. 我将服务于上述连接的真实服务器的权重设置为 0,只让其他真实服务器保持事件状态
  3. 我重新加载页面以重新生成连接

我在 ipvsadm -Ln 中看到的是连接仍在“死”服务器上。我必须等待最多一分钟(我假设浏览器端有一些 TCP 超时)才能将它们传输到“事件”服务器。如果在这一分钟内我继续按下重新加载按钮,连接将停留在“死”服务器上,并且它们的 TCP 超时计数器将重新启动。

所以我的问题是:有没有办法告诉 NAT 模式下的负载均衡器立即(或接近立即)终止/重定向现有连接到死服务器?

在我看来,客户端的重新加载会使连接变成“僵尸”,这是一个错误,例如尽管未使用持久性且另一台服务器已准备就绪且可用,但绑定(bind)到死掉的真实服务器。

我发现影响此超时的唯一一件事是更改运行我用于测试的 IE8 的 Windows 机器中的 keepAliveTimeout。当我将它从 60 秒的默认值更改为 30 秒时,连接可以在 30 秒后转移。在我看来,客户端设置会影响作为负载平衡器的网络组件的运行,这似乎很奇怪。

还有一件事——在 ipvsadm 的输出中名为“Inactive Conenctions”的列是做什么用的?哪些连接被视为不活动?

而且在 ipvsadm 的输出中,我还看到了几个状态为 TIME_WAIT 的连接。这些有什么用?

非常感谢任何见解和建议!

干杯, 康斯坦丁

P.S:这里有一些关于配置的更多信息:

# uname -a
Linux 3.0.58-0.6.2-default #1 SMP Fri Jan 25 08:31:01 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lb-mysite.com wrr
  -> spwfe001.mysite.com:h Masq    10     0          0
  -> spwfe002.mysite.com:h Masq    10     0          0

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  anywhere             anywhere            to:172.22.9.100
SNAT       all  --  anywhere             anywhere            to:172.22.1.130


# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    inet 127.0.0.2/8 brd 127.255.255.255 scope host secondary lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN         qlen 1000
    link/ether 00:50:56:a5:77:ae brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.216/22 brd 192.168.11.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN         qlen 1000
link/ether 00:50:56:a5:77:af brd ff:ff:ff:ff:ff:ff
inet 172.22.9.100/22 brd 172.22.11.255 scope global eth1:1
inet 172.22.8.213/22 brd 172.22.11.255 scope global secondary eth1
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:a5:77:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.22.1.130/24 brd 172.22.1.255 scope global eth2


# cat /proc/sys/net/ipv4/ip_forward
1
# cat /proc/sys/net/ipv4/vs/conntrack
1
# cat /proc/sys/net/ipv4/vs/expire_nodest_conn
1
# cat /proc/sys/net/ipv4/vs/expire_quiescent_template
1

最佳答案

首先 - 您不能通过将权重更改为 0 来进行测试... 您必须从 ipvs 表中完全删除条目以模拟发生故障的服务器。

您已经告诉 ldirectord 使死掉的服务器保持事件状态: 静止 = 是 您需要将其更改为: quiescent = no(这会将条目从表中删除)

看起来您确实正确设置了以下值: expire_nodest_conn - bool 值 expire_quiescent_template - bool 值

此处解释:https://www.kernel.org/doc/Documentation/networking/ipvs-sysctl.txt

关于linux - ldirectord 在真实服务器死机时不传输连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16281091/

相关文章:

amazon-web-services - 即使使用 LoadBalancer 公开后也无法访问我的 kubernetes 服务

c++ - 为什么这个延迟循环在没有 sleep 的几次迭代后开始运行得更快?

linux - node.js 找不到模块 xml2js

linux - Docker 命令无法连接到 Docker 守护进程

linux - Unix/Linux 文件系统

java - 在 Android 中建立 FTP 连接

Azure 中的 Tomcat 负载平衡

c# - TCP 客户端断开连接

bash - 在 Mac 上使用 bash 脚本连接到网络共享?

c# - DotNetOpenAuth - 如何使其在负载均衡器后面工作?