[РЕШЕНО] балансировка нагрузки iptables

Автор ihammers, 23 марта 2012, 21:02:59

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

ihammers

Ситуация следующая:

Есть машина под управлением Debian GNU/Linux Squeeze 2.6.32-5-686.  На котором поднято несколько squid 2.7.STABLE9-2, на различных портах с ntlm аутентификацией.  В данной конфигурации все работает, но при больших нагрузках перестает отдавать информацию пользователям.

Для решения данной проблемы подняли ещё пару squid-ов, благо процессор отдыхает.  Если обращаться к прокси по различным порта, то все работает.  Чтобы скрыть все прокси за один порт, решили сделать это через iptables (директива nat):

-A PREROUTING -i eth0 -p tcp --dport 2020 -j DNAT --to-destination 10.0.0.34:3110-3112
при такой конфигурации запросы падают только на первых порт указанный в диапазоне, что конечно не удовлетворяет нашим потребностям.  После этого полез в man iptables, где были найдены следующие строки:
Цитировать--to-destination [ipaddr][-ipaddr][:port[-port]]
              which can specify a single new destination IP address, an inclusive range of IP addresses, and optionally, a  port  range  (which  is  only
              valid if the rule also specifies -p tcp or -p udp).  If no port range is specified, then the destination port will never be modified. If no
              IP address is specified then only the destination port will be modified.

              In Kernels up to 2.6.10 you can add several --to-destination options.  For those kernels, if you specify more than one destination address,
              either  via  an  address range or multiple --to-destination options, a simple round-robin (one after another in cycle) load balancing takes
              place between these addresses.  Later Kernels (>= 2.6.11-rc1) don't have the ability to NAT to multiple ranges anymore.

Следующий пример работает как нам и требуется:
#DNAT
-A PREROUTING -i eth0 -p tcp --dport 2020 -m statistic --mode nth --every 10 --packet 0 -j DNAT --to-destination 10.0.0.34:3110
-A PREROUTING -i eth0 -p tcp --dport 2020 -m statistic --mode nth --every 10 --packet 1 -j DNAT --to-destination 10.0.0.34:3111
-A PREROUTING -i eth0 -p tcp --dport 2020 -m statistic --mode nth --every 10 --packet 2 -j DNAT --to-destination 10.0.0.34:3112

Но есть одно но: некоторые пользователи иногда получают отказ от сервера на запрос, и чаще всего не полностью отдаётся страница.

Пробовали ещё использовать:
-j REDIRECT --to-port 3110
но результат примерно такой же.

Вопрос: как правильно прописать балансировку нагрузки через iptable, или другими средствами.


PS: идея пришла после прочтения следующей статьи.
PS:: поднятие несколько виртуальных машин как в статье, не вариант.
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290

ihammers

Цитата: ihammers от 23 марта 2012, 21:02:59
...
-j REDIRECT --to-port 3110
но результат примерно такой же.

Вопрос: как правильно прописать балансировку нагрузки через iptable, или другими средствами.
...

Тема закрыта.  Отказ происходил из-за того, что не отрабатывалось правило iptables.  Решение: поднятие сервиса на порту 3110, чтобы если redirect не сработал пользователь всё равно попадал на сквид.

Использование redirect вместо dnat.  Балансировка происходит через статистику.

-A PREROUTING -i eth0 -p tcp --dport 3110 -m state --state NEW -m statistic --mode nth --every 4 --packet 0 -j REDIRECT --to-port 3110
-A PREROUTING -i eth0 -p tcp --dport 3110 -m state --state NEW -m statistic --mode nth --every 4 --packet 1 -j REDIRECT --to-port 3111
-A PREROUTING -i eth0 -p tcp --dport 3110 -m state --state NEW -m statistic --mode nth --every 4 --packet 2 -j REDIRECT --to-port 3112
-A PREROUTING -i eth0 -p tcp --dport 3110 -m state --state NEW -m statistic --mode nth --every 4 --packet 3 -j REDIRECT --to-port 3113
Debian GNU/Linux Bookworm, LXQt/OpenBox: AMD Ryzen 5 5600G / 64Gb RAM
_______________________________
Debian GNU/Linux Bookworm, без графики: AMD Phenon X4 / 16Gb RAM
_______________________________
Debian GNU/Linux Bookworm, LXQt/OpenBox: Acer Aspire One 722 AMD C60 / 8Gb RAM / ATI HD6290