Ao usar o balanceamento de carga TCP com HAProxy, todo o tráfego de saída flui através do LB?

19

Estou configurando um aplicativo para ser hospedado usando VMs (provavelmente da Amazon, mas isso não está definido), o que exigirá o balanceamento de carga HTTP e o balanceamento de carga de um grande número (50k, se possível) de conexões TCP persistentes. A quantidade de dados não é tão alta, mas as atualizações são frequentes.

No momento, estou avaliando os balanceadores de carga e estou um pouco confuso sobre a arquitetura do HAProxy. Se eu usar o HAProxy para equilibrar as conexões TCP, todo o tráfego resultante precisará fluir através do balanceador de carga? Em caso afirmativo, outra solução (como LVS ou mesmo nginx_tcp_proxy_module) seria mais adequada?

user122875
fonte

Respostas:

33

O HAProxy (como muitos balanceadores de carga) geralmente mantém duas conversas. O Proxy possui uma sessão (tcp neste caso) com o cliente e outra sessão com o servidor. Portanto, com proxies, você acaba vendo duas vezes mais conexões no balanceador de carga. Portanto, todo o tráfego flui através do balanceador de carga.

Quando se trata de dimensionar vários balanceadores de carga, não acho que você precise. Mas uma maneira prática e bastante fácil de fazer isso é usar algo como keepalived com dois IPs flutuantes e DNS de rodízio entre esses dois IPs. Com keepalived, se um dos balanceadores de carga cair, o outro manteria os dois IPs, para que você obtenha alta disponibilidade dessa maneira. Dito isto, acho que você ficará bem com uma instância ativa de haproxy com sua carga.

O HAProxy escala muito bem. Por exemplo, a rede Stack Exchange usa soquetes da web que mantêm conexões TCP abertas. Enquanto estou postando isso, temos 143.000 soquetes TCP estabelecidos em uma máquina virtual VMware sem problemas. O uso da CPU na VM é de cerca de 7%.

Com esse tipo de configuração com o HAProxy, certifique-se de definir maxconnalto o suficiente. Aqui está um exemplo de configuração do HAProxy para você começar:

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
Kyle Brandt
fonte
que 143.000 - isso ainda está falando sobre os soquetes da web? ou são outras coisas também?
Marc Gravell
@ MarcGravell: Praticamente todos os soquetes da web. Tenha em mente que este é 2x embora como eu disse na minha introdução, de modo que os servidores Web Sockets veria um total de ~ 70k
Kyle Brandt
@Kyle - Alguma razão para você precisar de soquetes da web e conexões TCP persistentes? Este site parece não ter nenhum recurso em tempo real que exija isso.
Continuação
@Continuação: Há uma boa quantidade de recursos em tempo real, incluindo notificações na Caixa de entrada, votos, edições, novos comentários / respostas / perguntas. Não tenho certeza se eles só estão habilitados para usuários com um certo limite rep off lado, se você não vê-los, você poderia perguntar sobre meta.stackoverflow.com
Kyle Brandt
1
@KyleBrandt também funciona no modo TCP?
elslooo
2

Sim, todo o tráfego normalmente deve passar pelo balanceador de carga. As solicitações são recebidas pelo balanceador de carga e as respostas são enviadas de volta ao balanceador de carga que as envia de volta aos clientes.

Para escolher a ferramenta certa, não tenho muita experiência com as outras opções. Estou usando haproxy e é realmente bom e estável e pode lidar com uma grande quantidade de tráfego. Além disso, seus recursos de ACLs são excelentes.

Khaled
fonte
2

Existe a possibilidade de usar e configurar o DSR (retorno direto do servidor), mas isso não tem nada a ver com o Loadbalancer, mas está configurado na pilha tcp (tabelas de roteamento). Usamos isso para um grande portal de transmissão de vídeo. Embora funcione, ele fornecerá uma quantidade significativa de dor de cabeça em relação à complexidade do roteamento necessário.

Portanto, eu não recomendaria usar essa técnica sem considerar minuciosamente o uso e as desvantagens.

Talvez haja algumas dicas para começar lá:

Diverta-se!

Andreas Balg
fonte