Автор Тема: [РЕШЕНО] балансировка нагрузки iptables  (Прочитано 3969 раз)

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

Оффлайн ihammers

  • Главный модератор
  • Ветеран
  • *****
  • Topic Author
  • Сообщений: 1742
  • Debian GNU/Linux Stretch
    • Алтайская Группа Пользователей Linux
  • Jabber: ihammers@jabber.ru
Ситуация следующая:

Есть машина под управлением 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:: поднятие несколько виртуальных машин как в статье, не вариант.
« Последнее редактирование: 10 Апрель 2012, 13:02:02 от ihammers »
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64,
LXQt/KDE/OpenBox AMD Phenon X4 / 16Gb RAM / ATI HD7750 Silent
_______________________________
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64, LXQt/KDE/OpenBox
Acer Aspire One 722 AMD C60 / 4Gb RAM / ATI HD6290
 


Оффлайн ihammers

  • Главный модератор
  • Ветеран
  • *****
  • Topic Author
  • Сообщений: 1742
  • Debian GNU/Linux Stretch
    • Алтайская Группа Пользователей Linux
  • Jabber: ihammers@jabber.ru
Re: балансировка нагрузки iptables
« Ответ #1 : 10 Апрель 2012, 13:00:46 »
...
-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 Stretch, kernel 4.9.0-5-amd64,
LXQt/KDE/OpenBox AMD Phenon X4 / 16Gb RAM / ATI HD7750 Silent
_______________________________
Debian GNU/Linux Stretch, kernel 4.9.0-5-amd64, LXQt/KDE/OpenBox
Acer Aspire One 722 AMD C60 / 4Gb RAM / ATI HD6290
 

Теги:
 

[Решено]Подключение к интернет через консоль

Автор aspuio

Ответов: 2
Просмотров: 1610
Последний ответ 12 Июль 2013, 22:34:11
от aspuio
Claws mail фильтрация [РЕШЕНО]

Автор sx88

Ответов: 1
Просмотров: 1251
Последний ответ 12 Январь 2015, 02:59:17
от zarguni
РЕШЕНО: Не работает Апплет NetworkManager 0.8.1

Автор Alex-SS

Ответов: 6
Просмотров: 4330
Последний ответ 30 Июнь 2012, 23:23:38
от Alex-SS
[РЕШЕНО]_два_ip_на_одном_интерфейсе

Автор speed_vm

Ответов: 3
Просмотров: 1546
Последний ответ 26 Февраль 2014, 15:58:22
от speed_vm
[Решено] Настройка маршрутизации для виртуальных машин в virtualbox

Автор Ralf

Ответов: 4
Просмотров: 2278
Последний ответ 01 Сентябрь 2016, 00:48:43
от Ralf