haproxy: mantenha as sessões existentes sob alta carga, atenda '503' aos recém-chegados


12

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')


Pode ser uma pergunta boba - qual é a configuração keep_alive no nginx? Aparentemente, são 75 anos por padrão - poderia ser esse o problema?
Aidan Kane

Respostas:


4

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.


1
Obrigado, obrigado! Isso esclareceu muito. Agora o trabalho funcionando (entre outras coisas) verificando o backend-cookie com hdr_sub (Então, "hdr_sub (cookie) SERVERID = backend-001"). Vou postar uma configuração de trabalho quando terminar.
Apenootje 28/08/12
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.