Tentando fazer o que diz o título: reter as sessões existentes sob alta carga e servir 503 mensagens aos visitantes recém-chegados.
Problema: funciona, mas as sessões não duram mais que 90 segundos.
Os resultados atuais me perguntam se falta uma configuração de tempo limite.
Objetivo
Estou tentando obter haproxy para:
- envie solicitações de novas sessões para o back-end-001 quando o número total de sessões no front-end estiver abaixo de um determinado limite.
- exibir um erro 503 para novas sessões quando o número total de sessões no front-end estiver acima desse limite
- permitir solicitações de sessões existentes, mesmo que o número de sessões exceda o limite
Dessa forma, os visitantes que estão no meio do preenchimento de um formulário de várias etapas não serão surpreendidos por um erro 503, e novos visitantes podem ser instruídos a "voltar mais tarde, porque estamos muito ocupados no momento".
Configuração
A configuração é a seguinte:
{visitors}
↓
[haproxy]
↓
[rails app on unicorn served by nginx] (right now just one
backend: 'backend-001')
abordagem atual
Para conseguir isso, estou usando a configuração abaixo.
Este é para teste, com um limite muito baixo (10 conexões no front-end (fe_conn gt 10)), para facilitar o teste.
Para colocar o servidor sob alguma carga, estou usando o initperf da seguinte maneira:
---------------------------------------------------------------------------------
global
daemon
maxconn 10000
defaults
mode http
timeout connect 6s
timeout client 60s
timeout server 60s
balance roundrobin
option http-server-close
frontend http-in
bind [PUBLIC_IP]:80
default_backend backend-001
acl too_many fe_conn gt 10
use_backend b_too_many if too_many
backend backend-001
fullconn 10
appsession _session_id len 128 timeout 7200s
cookie SERVERID insert maxidle 7200s
server Server1 127.0.10.1:80 cookie backend-001 check
backend b_too_many
errorfile 503 /var/www/50x.html
problema
Como mencionado acima, o problema é: quase funciona, mas as sessões não duram mais que 90 segundos.
Se você continuar clicando, poderá manter sua sessão mesmo quando houver 10 sessões ocupadas.
Tentar abrir uma página no servidor com uma instância diferente do navegador gera o erro 503.
Então, parece que estou quase lá. Alguém tem uma idéia do que pode estar causando os curtos períodos de sessão?
E particularmente como eu posso consertar :)
(editar: removido 'peso 1 maxconn 10' da linha 'servidor', não relevante e pode confundir) (edite o 2º: 10 sessões corrigidas no front-end 'para '10 conexões no front-end')
Respostas:
Infelizmente, você parece estar completamente confuso com as sessões no nível do aplicativo. Um usuário que visita o site pode ter um cookie, o que faz você pensar que ele possui uma conexão, embora não seja necessariamente o caso. Ele pode abrir quantas conexões forem necessárias para buscar objetos e navegar pelas páginas.
Os 90 segundos que você está observando certamente são o tempo limite do navegador ativo para conexões inativas.
É possível alcançar o que você deseja, mas é um pouco mais complexo que isso, pois você também deve considerar a presença do cookie de persistência na solicitação para descobrir se o visitante é novo ou não.
Em geral, também é mais eficiente confiar na contagem média de conexões por servidor do que na contagem de conexões de front-end. O motivo é que, quando um servidor morre, você precisa reajustar esse número. A maneira mais eficiente de fazer isso é configurar um valor de maxconn do servidor para ativar o enfileiramento e usar avg_queue para que o limite se aplique ao número médio de solicitações na fila nos servidores. Isso permite que você manipule corretamente os visitantes conhecidos enquanto move suavemente novos usuários para outro back-end quando a carga aumenta devido aos visitantes existentes.
fonte