ldirectord を使用して、2 つの 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
負荷分散は正常に機能しており、実際のサーバーは表示されています。それにもかかわらず、簡単なテストで問題が発生しています。
- クライアント ブラウザー (IE 8) から実サーバーでホストされているサイトへの接続をいくつか開いています。
- 上記の接続を行う実サーバーの重みを 0 に変更し、他の実サーバーのみを有効のままにします。
- ページをリロードして接続を再生成します
私が ipvsadm -Ln で見ているのは、接続がまだ「死んだ」サーバー上にあるということです。それらが「生きている」サーバーに転送されるまで、最大1分(ブラウザ側からのTCPタイムアウトがあると思います)待つ必要があります。そして、この 1 分間にリロード ボタンを押し続けると、接続は「デッド」サーバーにとどまり、TCP タイムアウト カウンターが再起動されます。
私の質問は次のとおりです。NATモードのロードバランサーに、既存の接続をすぐに(またはすぐに)終了/リダイレクトするように指示する方法はありますか?
クライアント側でリロードすると、接続が「ゾンビ」になる可能性があります。たとえば、永続性が使用されておらず、他のサーバーの準備ができて利用可能であるにもかかわらず、死んだ実サーバーにバインドされる可能性があります。
このタイムアウトに影響を与えることがわかった唯一のことは、テストに使用する IE8 を実行している Windows マシンで keepAliveTimeout を変更することです。デフォルト値の 60 秒から 30 秒に変更すると、30 秒後に接続を転送できました。クライアントの設定がロード バランサとしてのネットワーク コンポーネントの動作に影響を与える可能性があることは、非常に奇妙に思えます。
もう 1 つ - ipvsadm からの出力にある "Inactive Conenctions" という名前の列は何に使用されますか? 非アクティブと見なされる接続は?
また、ipvsadm の出力には、TIME_WAIT 状態の接続がいくつか表示されます。これらは何のためですか?
洞察や提案は大歓迎です!
乾杯、コンスタンチン
PS: 構成に関する詳細情報は次のとおりです。
# 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