LINUX.ORG.RU
ФорумAdmin

балансировка нагрузки для tcp/ip-приложения


0

2

имеется tcp/ip-сервис, который может обслуживать только одно постоянное подключение в одно время.

все новые подключения приходят на 333-порт, которые и нужно равномерно пробрасывать на разные порты (большинство на сервере с тем же ip), т.е. желательно было бы задать port range, но я не знаю, как это сделать.

пробую делать настройку через LVS следующим образом:

ipvsadm -A -t внешний_ип:333 rr
-a -t внешний_ип:333 -r 127.0.0.1:2338 -m
-a -t внешний_ип:333 -r 127.0.0.1:2339 -m
-a -t внешний_ип:333 -r 127.0.0.1:2340 -m
#(портов много)

пробую потом подключиться телнетом на 333-порт, но подключение не пробрасывается. и как сделать, чтобы в отдельный момент времени всегда было только одно постоянное подключение на один порт?

помогите, пожалуйста!!



Последнее исправление: tmp11 (всего исправлений: 1)

в дополнение:


srv1:~# sysctl -p
net.ipv4.ip_forward = 1


srv1:~# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP внешний_ип:333 rr persistent 360
-> 127.0.0.1:2338 Local 1 0 0
-> 127.0.0.1:2339 Local 1 0 0
-> 127.0.0.1:2340 Local 1 0 0
-> 127.0.0.1:333 Local 1 0 4


srv1:~# telnet внешний_ип 333
telnet: Unable to connect to remote host: Connection refused

tmp11
() автор топика

[code]iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 -j REDIRECT --to-port 334

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m state --state NEW -m nth --counter 0 --every 4 --packet 1 -j REDIRECT --to-port 335

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m state --state NEW -m nth --counter 0 --every 4 --packet 2 -j REDIRECT --to-port 336

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m state --state NEW -m nth --counter 0 --every 4 --packet 3 -j REDIRECT --to-port 337

[/code]

что то похожее нужно использовать, вообщем гугли на тему модуля «nth»

http://netfilter.org/documentation/HOWTO/netfilter-extensions-HOWTO-3.html#ss3.9

kam ★★
()
Ответ на: комментарий от kam

похоже, что модуль nth уже забросили, в гугле мертвые ссылки на него(
в моем дебиане 5.0 его тоже нет.

tmp11
() автор топика

неужели никто не сможет подсказать? очень бы хотелось через лвс сделать

tmp11
() автор топика
Ответ на: комментарий от tmp11

> имеется tcp/ip-сервис, который может обслуживать только одно постоянное подключение в одно время.

неужели никто не сможет подсказать? очень бы хотелось через лвс сделать


Два варианта:
1) переписать этот кривой сервис, который не умеет больше одного соединения одновременно. Идеальный вариант.
2) Если невозможно переписать, то городить свой нормальный сервис, который принимал бы множественные соединения на 333-м порту и потом запускал бы демон сервиса на произвольном порту и дальше работал бы как прокси. Не совсем хороший вариант.

А средствами iptables нет гарантии, что балансировка не закинет новый коннект на уже «занятый» порт.

Slavaz ★★★★★
()

можно сделать через tcp-wrapper (тот который inetd/xinetd) и netcat (тот который nc), по примерно следующему сценарию: wrapper принимает соединение на 333 порту, опционально запускает кривобокий сервис, и отдаёт контроль nc чтобы тот переливал поток как надо. вся недолга :)

MKuznetsov ★★★★★
()
Ответ на: комментарий от Slavaz

>А средствами iptables нет гарантии, что балансировка не закинет новый коннект на уже «занятый» порт.

ну на этот случай есть возможность создать больше портов, чем может потребоваться, потому вряд ли он будет кидать на занятый, когда есть свободные.

LVS с Road Runner мог бы решить проблему, как мне кажется.

tmp11
() автор топика
Ответ на: комментарий от tmp11

rost@localhost[~]$ iptables -m statistic -h

[...]

statistic match options:
 --mode mode                    Match mode (random, nth)
 random mode:
 --probability p                 Probability
 nth mode:
 --every n                       Match every nth packet
 --packet p                      Initial counter value (0 <= p <= n-1, default 0)

Rost ★★★★★
()
Ответ на: комментарий от Rost

спасибо всем за ответы, но проблема пока не решена.

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m state --state NEW -m nth --counter 0 --every 4 --packet 3 -j REDIRECT --to-port 2338

iptables v1.4.2: Couldn't load match `nth':/lib/xtables/libipt_nth.so: cannot open shared object file: No such file or directory



Rost, есть такое, но результат тот же

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m statistic -m nth --every 4 --packet 1 -j REDIRECT --to-port 2338
iptables v1.4.2: Couldn't load match `nth':/lib/xtables/libipt_nth.so: cannot open shared object file: No such file or director

tmp11
() автор топика
Ответ на: комментарий от tmp11

У меня вот что выдает твой пример:

rost@localhost[~/tmp]$ iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 333 -m statistic --mode nth --every 4 --packet 1 -j REDIRECT --to-port 2338
ip_tables: REDIRECT target: only valid in nat table, not mangle
Думаю переводить не обязательно :)

Rost ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.