Implementações contínuas com Tomcats atrás de uma instância HAProxy

Implementações contínuas com Tomcats atrás de uma instância HAProxy

Tenho três instâncias do Tomcat em execução atrás de um HAProxy. Ao implementar alterações em meus aplicativos da Web, gostaria de fazer uma implantação contínua (ou seja, devolver um Tomcat por vez) para que os usuários não vejam nenhum tempo de inatividade.

Como eu faço isso? Vejo que uma instância em execução do haproxy pode ser reconfigurada a quente (o que é bom para adicionar ou remover novos servidores de pool), mas como o HAProxy reage quando um de seus servidores de destino está temporariamente inativo?

Se houver uma solução melhor que o HAProxy, também estaria disposto a ver isso.

Obrigado!

Responder1

Enviei um e-mail para Willy Tarreau e recebi de volta as seguintes opções:

  1. Você pode usar comandos de reconfiguração a quente ou socat para o servidor de estatísticas para definir o peso do servidor de destino como 0. Isso impedirá que novas sessões sejam balanceadas para esse servidor, mas não afetará as conexões existentes.

  2. Você pode definir a opção http-check disable-on-404 em combinação com "option httpcheck /myurl" e então fazer com que seus servidores de destino respondam a /myurl de forma que enviem um status 200 se tudo estiver bem, um 404 se o servidor precisar pare de receber novas solicitações e 500 se o servidor não receber nada (ou seja, quando você estiver pronto para devolver o servidor). haproxy verificará novamente o servidor no intervalo especificado na linha do servidor.

Responder2

Sendo assim o HAProxy não suporta remoção sem reconfiguração conforme @Ernest MüllerNo deleresponder, fornecerei uma alternativa, pois você também solicitou outros cenários.

eu usoEU CONTRA, que é uma das minhas soluções favoritas para balanceamento de carga, pois pode ser usado para mais do que HTTP.

Com o LVS, você pode ipvsadmadicionar e remover servidores manualmente. Um exemplo de remoção é o seguinte comando:

/sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT

Em vez de adicionar e remover manualmente interagindo com o LVS, geralmente prefiro usar a requestopção comldirectord. ldirector é um daemon que pesquisa e gerencia sua configuração de IPvs. Você pode especificar um arquivo com um caminho URI usando esse parâmetro. Durante a implementação, você remove o arquivo e espera que o servidor pare de ser acessado. Nesse ponto, você pode implantar o código sem afetar os clientes de produção.

Responder3

Muito disso depende se você está fazendo algum gerenciamento de sessão/estado nos Tomcats. Se a sessão de um usuário for destruída pela reinicialização, a rolagem não impedirá o impacto do usuário (pode impedi-lo de ver um 500, mas não de ter que reiniciar a sessão). Se você não estiver usando sessões fixas, provavelmente não precisará se preocupar com isso.

O HAproxy e outros balanceadores de carga têm maneiras de tentar determinar rapidamente se o servidor por trás dele está ativo ou inativo e redirecionar o tráfego com base nisso (a "verificação de integridade" no HAProxy). No entanto, é impossível para eles fazerem isso perfeitamente. Com o Tomcat, não existe apenas “para cima” e “para baixo”; há “up, como responder no porto, mas as coisas ainda não estão prontas”. Portanto, você não deve confiar no LB para evitar completamente o impacto do usuário - mesmo com uma boa verificação de integridade, haverá um intervalo em que você receberá tráfego para um nó defeituoso.

O que fazemos com uma implantação contínua é retirar ativamente o servidor do balanceador de carga, mexer/reiniciar o nó, esperar até que ele passe em um teste/monitor automatizado, colocá-lo novamente e passar para o próximo servidor. Isso é mais fácil com um balanceador de carga que possui uma API que você pode chamar remotamente (como, a partir de um script) para desabilitar um servidor - nosso antigo Netscaler fazia isso, mas o HAProxy não. Com o HAProxy, você precisa editar a configuração e reiniciar (triste) ou pode alterar a verificação de integridade para onde possa manipulá-la - como talvez ele verifique um arquivo mágico que você renomeia quando deseja omitir aquele nó. Você tem que esperar que a verificação de integridade seja acionada e o nó saia do cluster, mas então você estará bem.

Eu corriesta postagemque tem uma solução relacionada ao iptables para esse problema ...

informação relacionada