Я использую ldirectord для балансировки нагрузки двух HTTP-серверов. В блоке балансировщика нагрузки у меня следующая сетевая конфигурация:
eth0 используется для внутренних целей и вообще не участвует в балансировке нагрузки. На eth1 я настроил общедоступный IP-адрес для машины (для доступа из других внутренних сетей) и VIP балансировщика нагрузки. eth2 используется для доступа к реальным серверам, которые лежат в разных подсетях и доступны только через IP-адреса из той же подсети.
Детали следующие:
# 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
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
inet6 fe80::250:56ff:fea5:77ae/64 scope link
valid_lft forever preferred_lft forever
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
inet6 fe80::250:56ff:fea5:77af/64 scope link
valid_lft forever preferred_lft forever
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
inet6 fe80::250:56ff:fea5:77b0/64 scope link
valid_lft forever preferred_lft forever
Вот конфигурация моей балансировки нагрузки NAT:
# cat /etc/ha.d/ldirectord.cf
autoreload = yes
quiescent = yes
checkinterval = 10
negotiatetimeout = 10
checktimeout = 5
emailalert = "Konstantin.Boyanov@bmf.bund.de"
emailalertfreq = 60
failurecount = 3
virtual = 172.22.9.100:80
checktimeout = 10
checktype = negotiate
failurecount = 2
negotiatetimeout = 10
protocol = tcp
quiescent = yes
real = 172.22.1.133:80 masq 1024
real = 172.22.1.134:80 masq 1024
request = "alive.htm"
receive = "I am alive"
scheduler = wrr
service = http
persistent = 5
У меня также есть два дополнительных правила iptables, чтобы NAT работал должным образом:
# 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
Теперь проблема в том, что проверка работоспособности не работает должным образом. Хотя серверы в сети (я могу пинговать их и все остальное), ldirector не видит этого и отмечает их как отключенные.
Если я использую проверку ping, все работает нормально, но нам нужно согласование для более всеобъемлющих проверок службы (сервер cna может проверять связь, но http не работает и т. Д.).
Я попытался загрузить страницу alive.htm из командной строки в окне балансировщика нагрузки и не смог.
# wget http://172.22.1.133/alive.htm
--2013-04-11 09:52:44-- http://172.22.1.133/alive.htm
Connecting to 172.22.1.133:80... failed: Connection timed out.
Retrying.
Сначала подумал, что проблема в правилах iptables. Я удалил их, но все еще не мог загрузить живую страницу с помощью wget (и curl и w3m в этом отношении). Я попытался получить его с двух других машин, как из разных подсетей, и он работал нормально! Я понял, что что-то не в порядке с блоком балансировки нагрузки.
Затем я выключил ldirectord и снова попробовал wget. На этот раз это сработало.
Так мне кажется, что ldirector каким-то образом останавливает себя от доступа к живой странице на реальных серверах? Это кажется странным и нелогичным. Так что я могу делать не так?
Проблемы не вызваны правилами iptables, потому что, когда я их удаляю, страница alive.htm все еще недоступна.
Оба реальных сервера доступны из балансировщика нагрузки (с возможностью проверки связи). Есть ли у меня проблемы с настройкой ldirectord?
Как я могу точно отслеживать, что делает ldirectord во время живого теста?
И вообще, может ли кто-нибудь пролить свет или дать мне несколько идей, что могло быть не так или что я мог делать неправильно.
Заранее спасибо :)
Я отключил IPv6 на балансировщике нагрузки, и теперь все работает нормально. Думаю, LVS + IPv6 - это русская рулетка :)
Ура!