Масштаб HAProxy для более чем 64 КБ веб-сокетов

8

Мы пытаемся разработать архитектуру, которая сможет обрабатывать более 64 тыс. Веб-сокетов.

Сначала мы попробовали Amazon ELB, но его дизайн не допускает неожиданного всплеска трафика или веб-сокета. (Режим TCP неожиданно отключает веб-сокеты)

С HAProxy эти ограничения не применяются, но мы будем ограничены ~ 64k веб-сокетами, поддерживаемыми между HA и внутренними серверами.

Несколько решений, которые пришли на ум:

  • Несколько экземпляров HAProxy, балансировка нагрузки с DNS (у Route53 есть взвешенная опция)
  • Два экземпляра HAProxy с Keepalived, несколько внутренних IP-адресов (не уверен, что это выполнимо)

Есть лучший способ сделать это ?

Bastien974
источник
1
Почему ограничение 64К? Это порт источника? Если это так, вы можете просто добавить больше «серверов» в бэкэнд, которые привязаны к разным портам ...
Кайл Брандт
@ Bastien974, самый простой способ, это использовать разные исходные ip для бэкэндов, чтобы масштабировать до 130К соединений, я использовал два параметра ips и tw_reuse sysctl
c4f4t0r

Ответы:

7

Если ваш предел в 64 КБ связан с портами-источниками, вы можете сделать что-то вроде следующего (немного странно, но это было то, что мы в настоящее время делаем в SE для веб-сокетов (у нас есть что-то вроде .5 миллионов одновременных обычно с HAProxy):

server ny-web01-1 10.0.0.1:8081 check
server ny-web01-2 10.0.0.1:8082 check
server ny-web01-3 10.0.0.1:8083 check

Также несколько экземпляров выполнимо с keepalived. Просто сделайте что-то вроде кругового DNS по нескольким IP-адресам. Просто убедитесь, что IP-адреса всегда выбираются активными балансировщиками нагрузки, так как сам DNS не даст вам балансировки нагрузки (здесь есть и другие варианты, этот простой).

Кайл Брандт
источник
1
Если я правильно понимаю, поскольку TCP-соединение определяется с помощью srcIP: srcPORT / destIP: destPORT, если я могу прослушивать на внутренних серверах несколько портов, это означает, что между HAProxy и внутренними серверами я смог бы иметь несколько соединений с одного и того же 127.0.0.1:12345 -> 10.0.0.1:8081, 127.0.0.1:12345 -> 10.0.0.1:8082 и т. д.? Это действительно работает?
Bastien974
@ Bastien974: Вы правильно поняли - это работает.
Кайл Брандт
@ Bastien974: Вы можете использовать source 0.0.0.0 usesrc clientв конфигурации бэкенда haproxy прозрачность исходного кода tproxy. Таким образом, srcIP: srcPORT будет фактическим IP-адресом / портом клиента (не внутренними IP-адресами машины haproxy) - это тоже удобно для регистрации.
wqw
0

Вы можете настроить несколько систем HAproxy, которые используют одни и те же IP-адреса, используя Anycast и BGP или какой-либо другой протокол пограничной маршрутизации. Таким образом, все системы HAproxy активны; если какой-либо из них выйдет из строя, вы прекратите рекламировать маршрут BGP в этой системе, и он через ~ 30 секунд прекратит прием трафика; который будет перераспределен на другие доступные системы, которые рекламируют тот же диапазон.

Например, проверьте этот URL о том, как настроить такой макет

Хрвое Шполяр
источник
Я не совсем уверен, что это будет работать внутри инфраструктуры AWS VPC, поскольку мне нужно использовать Elastic IP, связанный с каждым экземпляром. Ваше решение будет очень близко к DNS, поскольку Amazon Route53 предлагает возможность добавить проверку работоспособности. Меня беспокоит то, что даже при низком TTL мы не можем позволить себе ждать распространения в другие страны (у нас есть клиенты по всему миру), чтобы прекратить отправку трафика на «мертвый» экземпляр HA.
Bastien974