Como configurar o mod_proxy_balancer para graciosamente falhar sob alta carga

6

Temos um sistema que possui uma instância do Apache na frente de vários tomcats. Esses tomcats então se conectam a vários bancos de dados. Equilibramos a carga para o tomcat com o mod_proxy_balancer.

Atualmente estamos recebendo 100 pedidos por segundo, a carga no servidor Apache é bastante baixa, mas devido às pesadas operações do banco de dados nos tomcat, a carga é de aproximadamente 25% (do que eu acredito que eles possam suportar). / p>

Em algumas semanas, há um evento acontecendo e estimamos que nossos pedidos aumentarão significativamente, talvez por um fator de 10.

Eu estou fazendo tudo o que posso fazer para reduzir a carga em nossos gatos, mas sei que ficaremos sem capacidade, então eu gostaria de falhar graciosamente. Com isso quero dizer, em vez de tentar lidar com muitas conexões que todo tempo limite, gostaria que o Apache monitorasse de alguma forma o tempo médio de resposta, e assim que o tempo de resposta ao Tomcat estivesse acima de algum limite, eu gostaria de uma página de erro exibido.

Isso significa que os usuários sortudos ainda recebem rapidamente uma página e os que não têm sorte obtêm uma página de erro rapidamente. Em vez de todo mundo esperar muito tempo pela sua página, e eventualmente todo mundo expirar, e o banco de dados sendo inundado com consultas que nunca são usadas.

Espero que isso faça sentido, então eu estava procurando sugestões sobre como conseguir isso.

obrigado

    
por bramp 19.10.2010 / 15:12

2 respostas

9

Eu me refiro a isso como "Sorry Server". Se você estiver usando o Apache 2.2, poderá adicionar outro host ao seu pool de LB como um hot spare, e quando os servidores de aplicativos reais atingirem sua capacidade, o balancer direcionará solicitações para o "Sorry Server" até que os servidores de aplicativos estejam disponíveis novamente. Aqui está uma ideia aproximada:

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 retry=5 max=50
    BalancerMember http://10.0.0.2:8080 retry=5 max=50
    BalancerMember http://10.0.0.3:8080 retry=5 max=50
    BalancerMember http://10.0.0.4:8080 retry=5 max=50
    # the hot standby on server2
    BalancerMember http://10.0.0.5:80 status=+H
</Proxy>
<Location /app>
    ProxyPass           balancer://yourapp
</Location>

Na verdade, você pode, alternativamente, configurar um vhost extra em sua máquina com balanceador de carga e fazer com que ele sirva à própria página "Sorry Server". Espero que ajude:)

    
por 20.10.2010 / 03:02
2

Algumas notas:

O parâmetro "max" define as conexões máximas por processo filho , que, dependendo do MPM que você estiver usando, não criarão um limite máximo de conexões simultâneas. Por exemplo, prefork MPM será quase totalmente inútil para isso.

Em vez disso, eu o configurei usando o parâmetro "timeout" e uma página de erro 503 personalizada. Defina o tempo limite para algum valor sane, além do qual você não quer que seus usuários esperem, e coloque alguma mensagem significativa na página de erro 503.

Então:

ErrorDocument 503 /sitebusy.html

<Proxy balancer://yourapp>
    BalancerMember http://10.0.0.1:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.2:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.3:8080 timeout=15 retry=5
    BalancerMember http://10.0.0.4:8080 timeout=15 retry=5
</Proxy>

ProxyPass /app balancer://yourapp timeout=5

Com essa configuração, cada trabalhador será colocado em um estado de falha se sua resposta ultrapassar 15 segundos e será colocada de volta no pool 5 segundos depois. O balanceador aguardará em 5 segundos por um trabalhador livre.

    
por 06.01.2011 / 07:01