LINUX.ORG.RU
ФорумAdmin

Есть ли в Linux механизмы репликации TCP сессий?


0

5

Собсно, сабж. Есть, к примеру, кластер из 2-3 балансировщиков нагрузки, которые проксируют TCP-коннекты на бэкенды. И хотелось бы при падении активного сервера и фейловере на другой хост чтобы коннекты не рвались.

Из того что я видел такое умеет Cisco ASA в режиме active/standby failover, оно у меня отлично работает, но возможностей по проксированию-балансировке у нее не особо, да и вообще оффтопик. А так красиво:

Stateful Failover Logical Update Statistics
        Link : failover_link Redundant1 (up)
        Stateful Obj    xmit       xerr       rcv        rerr      
        General         2612394775 1555       36579464   12204     
        sys cmd         3074311    0          3074311    0         
        up time         0          0          0          0         
        RPC services    0          0          0          0         
        TCP conn        557057795  46         4896286    2164      
        UDP conn        2050356561 1509       28570644   10040     
        ARP tbl         999269     0          10759      0         
        Xlate_Timeout   0          0          0          0         
        IPv6 ND tbl     0          0          0          0         
        VPN IKEv1 SA    74370      0          292        0         
        VPN IKEv1 P2    81888      0          593        0         
        VPN IKEv2 SA    0          0          0          0         
        VPN IKEv2 P2    0          0          0          0         
        VPN CTCP upd    0          0          0          0         
        VPN SDI upd     0          0          0          0         
        VPN DHCP upd    0          0          0          0         
        SIP Session     0          0          0          0         
        Route Session   715624     0          26555      0         
        User-Identity   34957      0          24         0         

        Logical Update Queue Information
                        Cur     Max     Total
        Recv Q:         0       41      37291334
        Xmit Q:         0       880     2695414890

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

Такого нет?

на уровне tcp соединения - тяжело. Это нужно запрос дублировать на 2 или более бекендов, сравнивать результат и отдавать клиенту. А оно нужно ?

Для http/nginx вроде есть рецепт

vel ★★★★★
()

Как-то я себе слабо представляю как это можно реализовать без ведома бэкэндов. Как именно это делает Cisco ASA?

Например:

  • клиент делает TCP-соединение
  • девайс перекидывает его на один из бэкэндов
  • бэкэнд отправляет часть данных
  • бэкэнд падает
  • ??? <- что делается тут?
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Нене, бэкенды не причем особо, они это отдельная тема.

Допустим, что у нас есть 3-4 лоадбалансера (для кворума), один активен, другие отдыхают.

У них есть свои постоянные IP-адреса и некий общий кластерный, который они биндят через ip_nonlocal_bind все сразу, а перебрасывается он каким-нибудь keepalived или pacemaker при отказе главного.

Так вот, клиенты коннектятся на этот общий адрес и балансер с него же коннектится на бэкенды (ну или там два плавающих адреса, внешний и внутренний, в зависимости от архитектуры).

Соответственно, как клиентские, так и бэкендовые сессии завязаны на этот адрес и если синхронно реплицировать состояние установленных сессий на другие балансеры, то можно, в теории, обойтись без разрыва TCP при отказе главного балансировщика.

На ASA реализовано так: на каждом интерфейсе есть IP-адрес активный и standby, если асашка в данный момент главная, то она поднимает у себя активный IP, если у нее второстепенная роль - то standby.

Standby девайс в реальном времени реплицирует по выделенному линку состояния всех TCP-сессий, IPSEC-каналов, трансляции, изменения конфига и прочая прочая.

Если убить главного, то через полсекунды (период хартбита, настраиваемо) вторая аса поднимет у себя главные айпишники и как ни в чем не бывало продолжит его непростое дело. Сие проверялось много раз - сессии не рвутся, всякие NAT-трансляции динамические остаются, потеря пакетов минимальна.

Так что такое, в принципе, вполне возможно, вот только как это сделать на линухах...

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

Всё, понял. Я сначала подумал, что ты хочешь прозрачно «переносить» TCP-сессии с одного бэкэнда на другой. А ты отказывается про перенос сессий между разными балансировщиками, но с одним и тем же бэкэндом.

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

Ну, с бэкендами конечно ничего не выйдет, если только софт на них не спецательно подготовлен под такие онлайн-миграции, что очень вряд-ли.

А вот балансеры хотелось бы т.к. у меня есть приложения с очень долгоживущими сессиями и хотелось бы чтобы они не рвались.

blind_oracle ★★★★★
() автор топика

http://conntrack-tools.netfilter.org/

The userspace daemon conntrackd can be used to enable high availability of cluster-based stateful firewalls and to collect statistics of the stateful firewall use

http://conntrack-tools.netfilter.org/manual.html#settingup

The daemon conntrackd supports two working modes:

State table synchronization: the daemon can be used to synchronize the connection tracking state table between several firewall replicas. This can be used to deploy fault-tolerant stateful firewalls. This is the main feature of the daemon.

Flow-based statistics collection: the daemon can be used to collect flow-based statistics. This feature is similar to what ulogd-2.x provides.

MumiyTroll ★★★
()
Последнее исправление: MumiyTroll (всего исправлений: 1)
Ответ на: комментарий от MumiyTroll

Да, про коннтрек демона я знаю, но это всё же немножко не то. Он синхронизирует только NAT-трансляции, насколько я осознал.

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

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

Он синхронизирует только NAT-трансляции, насколько я осознал.

Нет. Таблица /proc/net/nf_conntrack содержит состояние всех соединений, как локальных, так и транзитных. При этом conntrackd, естественно, не выбирает из нее только NAT, а синхронизирует всю.

См., например, выхлоп

cat /proc/net/nf_conntrack | grep 127.0.0.1

127.0.0.1 — это ведь явно не NAT.

Хотя, сейчас посмотрел… а ведь не на каждом хосте есть локальные соединения. Так что лучше посмотреть глазками, что там не только NAT.

MumiyTroll ★★★
()
Последнее исправление: MumiyTroll (всего исправлений: 1)
Ответ на: комментарий от MumiyTroll

Я это понимаю, но вот будет ли оно работать, например, с балансировщиком в ядре Linux Virtual Server.

В данный момент я балансирую в юзерспейсе через haproxy и с ним, ессесно, коннтрек никак не поможет т.к. сам демон на соседнем хосте про эти коннекты ничего не знает. Да и вообще у меня коннекшен трекинг в ядре выключен совсем за ненадобностью :)

Надо будет почитать про LVS и conntrackd.

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

Похоже болт:

IPVS uses its own simple and fast connection tracking for performance reasons, instead of using netfilter connection tracking. So, if you don't use firewalling feature at load balancer and you need an extremely fast load balancer, do not load netfilter conntrack modules into you system, because there is no need to do double tracking. Note that LVS/NAT should work too without the conntrack modules.

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