HAProxy - pausa / enfileira todo o tráfego sem perder pedidos

3

Eu basicamente tenho o mesmo problema mencionado em este tópico - eu gostaria de suspender temporariamente todas as solicitações para todos os servidores de um determinado back-end, para que eu possa atualizar o back-end e o banco de dados que ele usa. Como esse é um sistema ativo, gostaria de fazer fila para solicitações e enviá-las para os servidores de backend depois que elas forem atualizadas. Como estou fazendo uma atualização de banco de dados com a alteração de código, preciso atualizar todos os servidores de backend simultaneamente, portanto, não posso reduzir apenas um de cada vez.

Eu tentei usar as opções tcp-request combinadas com a remoção do arquivo de verificação de integridade estática, conforme mencionado nesse tópico, mas não tive sorte. Definir o valor padrão "maxconn" como 0 parece pausar e enfileirar as conexões conforme desejado, mas parece não haver nenhuma maneira de aumentar o valor de volta para um número positivo sem reiniciar o HAProxy, que elimina todas as solicitações que foram enfileiradas até ponto. (As opções de "hot-reconfiguration" usando -sf e -st iniciam um novo processo, que não parece fazer o que eu quero).

O que estou tentando fazer é possível?

    
por Marc 26.09.2012 / 03:59

2 respostas

6

Acabei por fazer esta pergunta a Willy Tarreau, o autor de HAProxy. Ele ficou intrigado com a minha sugestão e fez uma pequena alteração no HAProxy que permite ajustar o maxconn para zero através do soquete de administração (isso não foi possível no momento em que pedi), o que resolveu meu problema. Citando o e-mail de acompanhamento que enviei a ele:

Hi there. That solves my problem pretty well. I issued "set maxconn frontend my_frontend 0", waited a few seconds for connections to drain, and then all subsequent connections are paused. I restarted the server, issued "set maxconn frontend my_frontend 3000", and connections resumed properly, without erroring out on existing requests.

Em resposta à resposta de JesseP - absolutamente, na maioria das vezes eu nunca quero fazer isso. Geralmente, tentamos organizar nossas migrações de banco de dados exatamente da maneira que você menciona, pois suspender o tráfego é, na melhor das hipóteses, arriscado. Alguns dos nossos utilizadores definiram tempos limite do cliente ridiculamente baixos, pelo que geralmente não queremos que o tráfego seja suspenso por mais de 15 segundos. Mas, para uma migração recente, em que tivemos um conjunto complexo de migrações de código e dados para executar simultaneamente, ter essa opção disponível era um salva-vidas.

Então, para resumir - não recomendando isso para o uso diário, mas a opção está lá, caso haja necessidade.

    
por 21.11.2012 / 20:02
0

Mesmo que você realize o que está perguntando, você acabará com migrações de dados em execução mais longa, muitos servidores para atualizar, etc., no futuro, e os clientes terminarão o tempo limite enquanto aguardam por coisas para voltar online.

Você deve realmente tentar criar suas atualizações de forma que os servidores existentes ainda possam ser executados. Isso pode envolver a implantação de algum código atualizado com o banco de dados existente, a atualização do banco de dados e a implantação da atualização real.

No final, você deve conseguir implantar um servidor por vez, sem quebrar as coisas.

    
por 12.10.2012 / 07:06