Haproxy: Minhas sessões são "meio" pegajosas

Haproxy: Minhas sessões são "meio" pegajosas

Pound está na frente do HAProxy para descarregamento de SSL, então o HAProxy recebe solicitações HTTP de texto simples. Eu tenho o HAProxy (v1.4.8) na frente de dois servidores de aplicativos da web que hospedam o mesmo aplicativo. Abaixo está minha configuração do HAProxy.

Atualmente, um cliente acessa o HAProxy e pode ir a qualquer servidor para sua solicitação inicial "GET /" para a raiz do site. Por exemplo, um cliente acessa o ServidorA, a partir desse ponto ele pode sempre ser atendido pelo ServidorA ou pelo ServidorB, o que quer que seja, a sessão ficará fixa em A ou B. Além disso, acontece o inverso; uma solicitação inicial do cliente pode chegar ao ServidorB, após essa solicitação inicial eles sempre serão atendidos pelo ServidorB ou ServidorA. A sessão permanece, mas às vezes há essa mudança após a solicitação inicial, para o servidor adversário para todas as solicitações futuras.

Abaixo está minha configuração do HAProxy. Eu escrevi isso incorretamente?

listen  app-servers 127.0.0.1:80
    cookie ASP.NET_SessionId prefix
    balance url_param ASP.NET_SessionId
    balance roundrobin 
    option persist
    option redispatch

    # Balance based on ASP .NET sesssion ID
    appsession ASP.NET_SessionId len 64 timeout 30m request-learn prefix

    # Active WebApp servers
    server  appserver1 10.0.0.1:80
    server  appserver2 10.0.0.2:80

Obrigado.

Responder1

se seu aplicativo for sensível a usuários que trocam de servidores de aplicativos durante uma sessão, você deseja que o tempo de espera fixo seja pelo menos igual ao tempo de expiração do cookie da sessão.

sua tabela fixa está configurada para expirar as entradas após 30 minutos. portanto, embora seus usuários possam continuar enviando o mesmo ID de sessão, se pausarem por mais de 30 minutos, a conexão será reequilibrada. se você não gosta desse comportamento, uma configuração de 4 horas ou mais provavelmente será apropriada para você. como eu disse acima em negrito, no mínimo você deseja que o tempo de espera definido seja pelo menos tão longo quanto o tempo de expiração do cookie da sessão.

ao usar a cookie server insertopção, você está adicionando um cozimento sem prazo de validade. e esse cookie diz qual servidor usar. como não há expiração, o cliente nunca será movido para outro servidor.

mas você também precisa se perguntar por que se importa. mudar para outro servidor tem um grande impacto na experiência do usuário? nesse caso, talvez você deva considerar isso uma falha em seu aplicativo da web e resolvê-lo nessa camada. posso estar errado, mas é algo para se pensar.

Responder2

Não estou muito feliz com isso, mas funciona de maneira confiável; Inseri um cookie nas solicitações do cliente em vez de rastrear o ID da sessão ASP .NET:

listen  app-servers 127.0.0.1:80

    cookie server insert
    balance roundrobin 
    option persist
    option redispatch
    server  appserver1 10.0.0.1:80 cookie srv1
    server  appserver2 10.0.0.2:80 cookie srv2

informação relacionada