Mitigar inundações de conexão HTTP com HAproxy + Apache

2

Nossa infraestrutura consiste em balanceadores de carga que executam o HAProxy e o Apache, que encaminham o tráfego para nossos servidores de aplicativos que executam apenas o Apache. Nos últimos dias, vimos as inundações de conexão que os balanceadores de carga transmitem alegremente, mas as conexões rapidamente sobrecarregam nossos servidores de aplicativos. Eles não respondem, e nossa única tática de mitigação é lançar mais servidores de aplicativos para sustentar a inundação. No começo, não conseguimos identificar por que esses servidores ficariam inativos porque não havia tráfego real de picos nos balanceadores de carga, mas depois de algumas investigações, vemos que o número de conexões do Apache está no topo.

Em anexo estão alguns gráficos que parecem ser os únicos indicadores da inundação. Reduzi a diretiva HAProxy maxconn para cada servidor de back-end para um número mais razoável (seu padrão anterior era 255), mas me preocupo com o fato de que novas conexões legítimas serão adiadas até que a sobrecarga diminua. O serviço parecerá estar disponível para usuários com conexões existentes, mas aparecerá para novas conexões e serviços de monitoramento externos porque o HAProxy limita a taxa sem levar em consideração o host.

Há mais alguma coisa que possamos fazer do nosso lado (HAProxy ou Apache) para nos ajudar a sustentar a carga ou devemos tentar filtrá-la fora de nossa rede? Como é um tráfego tão pequeno, sinto que há algo mais que podemos fazer, mas não tenho muita familiaridade com todos os recursos do HAProxy. Eu também estou interessado em explorar se o HAProxy pode limitar o limite com base em IP, mas não encontrei nada.

EDITAR: Nós auditamos o log de acesso de um dos balanceadores de carga, e as contagens de solicitações para os principais IPs são as seguintes:

1070 69.64.*.*
1227 1.9.*.*
1235 64.71.*.*
1376 69.64.*.*
1459 12.189.*.*
1572 1.9.*.*
1678 208.106.*.*
1982 5.15.*.*
2630 23.22.*.*
3300 76.125.*.* (our office)
3543 216.38.*.*

Assim, poderíamos proibir dinamicamente os IPs que estabelecessem muitas sessões em uma pequena janela, mas não poderíamos bloquear com base no total de solicitações, pois isso nos pegaria também. Esta rota faz sentido? Devemos fazer isso no nível do iptables nos balanceadores de carga?

Qualquer conselho é muito apreciado!

Obrigado,

Chris

    
por Christopher Armstrong 25.09.2012 / 23:53

1 resposta

1

Primeiro, se o que você recebe for "apenas" inundações de conexão, a configuração do maxconn nos servidores será suficiente, pois o haproxy só passará solicitações válidas para os servidores, não conexões simples sem solicitação. Além disso, ter um maxconn menor torna seus servidores mais rápidos e, em geral, atende seu usuário mais rapidamente (desde que você não seja muito baixo, mantenha pelo menos 2 a 3 vezes o número de núcleos de CPU nas máquinas do apache).

Se você receber uma solicitação de inundação, precisará de melhores medidas. O Haproxy 1.5-dev possui vários deles, é capaz de listar alguns endereços IP que estão fazendo muitas solicitações, taxas de conexão muito altas, muitas conexões simultâneas ou muitos erros.

Há uma ótima explicação aqui link sobre como configurar isso.

Esperando que isso ajude!

    
por 26.09.2012 / 08:33