HAProxy (como muchos equilibradores de carga) generalmente mantienen dos conversaciones. El Proxy tiene una sesión (tcp en este caso) con el cliente y otra sesión con el servidor. Por lo tanto, con los proxies terminas viendo 2 veces las conexiones en el equilibrador de carga. Por lo tanto, todo el tráfico fluye a través del equilibrador de carga.
Cuando se trata de escalar en varios equilibradores de carga, no creo que sea necesario. Pero una forma práctica y bastante fácil de hacer esto es usar algo como keepalived con dos IP flotantes y DNS round robin entre esas dos IP. Con keepalived, si uno de los equilibradores de carga cae, el otro mantendría ambas IP, por lo que obtendrá una alta disponibilidad de esta manera. Dicho esto, creo que estará bien con una instancia de haproxy activa con su carga.
HAProxy escala muy bien. Un ejemplo, la red de Stack Exchange usa sockets web que mantienen conexiones TCP abiertas. Mientras publico esto, tenemos 143,000 sockets TCP establecidos en una máquina virtual VMware sin problemas. El uso de CPU en la VM es de alrededor del 7%.
Con este tipo de configuración con HAProxy, asegúrese de configurar maxconn
lo suficientemente alto. Aquí hay algunos ejemplos de configuración de HAProxy para comenzar:
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