HAProxy (как и многие балансировщики нагрузки) обычно поддерживают два диалога. Прокси-сервер имеет сеанс (в данном случае tcp) с клиентом и другой сеанс с сервером. Поэтому с прокси вы в конечном итоге увидите 2х соединений на балансировщике нагрузки. Поэтому весь трафик проходит через балансировщик нагрузки.
Когда дело доходит до масштабирования между несколькими балансировщиками нагрузки, я не думаю, что вам нужно. Но практичный и довольно простой способ сделать это - использовать что-то вроде keepalived с двумя плавающими IP-адресами и циклическим DNS между этими двумя IP-адресами. С помощью keepalived, если один из балансировщиков нагрузки выйдет из строя, другой удержит оба IP-адреса, поэтому таким образом вы получите высокую доступность. При этом, я думаю, вы будете в порядке с одним активным экземпляром haproxy с вашей нагрузкой.
HAProxy очень хорошо масштабируется. Например, сеть Stack Exchange использует веб-сокеты, которые поддерживают открытые соединения TCP. Пока я публикую это, у нас есть 143 000 установленных TCP-сокетов на виртуальной машине VMware без проблем. Загрузка ЦП на виртуальной машине составляет около 7%.
При такой настройке с HAProxy убедитесь, что вы установили maxconn
достаточно высоко. Вот несколько примеров конфигурации HAProxy для начала работы:
frontend fe_websockets
bind 123.123.123.123:80
mode tcp
log global
option tcplog
timeout client 3600s
backlog 4096
maxconn 50000
default_backend be_nywebsockets
backend be_nywebsockets
mode tcp
option log-health-checks
option redispatch
option tcplog
balance roundrobin
server web1 10.0.0.1:1234
server web2 10.0.0.2:1234
timeout connect 1s
timeout queue 5s
timeout server 3600s