haproxy: retém as sessões existentes com carga alta, atende '503' às novas chegadas

12

Tentando fazer o que diz no título: manter as sessões existentes sob carga alta e veicular 503 mensagens para os visitantes recém-chegados.

Problema: funciona, mas as sessões não duram mais de 90 segundos.

Os resultados atuais me perguntam se há um cenário de tempo limite em falta.

Propósito

Estou tentando fazer o haproxy:

  • envie solicitações para novas sessões para o backend-001 quando o número total de sessões no frontend estiver abaixo de um determinado limite.
  • exibe um erro 503 para novas sessões quando o número total de sessões no frontend está acima desse limite
  • permite solicitações para 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 se surpreenderão com um erro 503, e os novos visitantes poderão ser orientados a "voltar mais tarde, porque estamos realmente ocupados agora ".

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 alcançar o acima, estou usando a configuração abaixo.

Este é para testes, 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 httperf da seguinte forma:

link

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 é: ele 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 de navegador diferente gera o erro 503.

Então, parece que estou quase lá. Alguém tem uma ideia do que pode estar causando os curtos períodos de sessão?

E principalmente como posso corrigi-lo:)

(edit: removido 'weight 1 maxconn 10' da linha 'server', não é relevante e pode ser confuso) (edite o segundo: corrigido '10 sessões no front-end 'para '10 conexões no front-end')

    
por Apenootje 22.08.2012 / 12:35

1 resposta

4

Infelizmente, você parece estar confundindo conexões com sessões em nível de aplicativo. Um usuário que visita o site pode ter um cookie 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 com certeza é o tempo de espera do navegador para conexões inativas.

É possível conseguir o que você quer, mas é um pouco mais complexo do 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.

Além disso, em geral, é mais eficiente confiar na média da contagem de conexões por servidor do que na contagem de conexões front-end. A razão é que quando um servidor morre, você precisa reajustar esse número. A maneira mais eficiente de fazer isso é configurar um valor maxconn de servidor para habilitar o enfileiramento e usar avg_queue para que o limite se aplique ao número médio de solicitações enfileiradas nos servidores. Isso permite que você gerencie corretamente os visitantes conhecidos enquanto move suavemente novos usuários para outro back-end quando a carga aumenta devido a visitantes existentes.

    
por 25.08.2012 / 10:05

Tags