Idéia para derrubar metade dos servidores contra reiniciar?

3

Estamos configurando o HAProxy para equilibrar nosso aplicativo (ASP.NET MVC 3 em execução no IIS). Queremos que nosso processo esteja sem manutenção programada para implantação. Eu estou tentando descobrir a maneira correta de fazer uma abordagem "see-saw" para servir apenas uma versão do aplicativo para novas solicitações em uma única vez. Aqui está o que eu tenho até agora:

  1. Remova a primeira metade dos servidores do HAProxy, recarregando a configuração:

    $ sed -i 's/web01.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ sed -i 's/web02.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ /etc/init.d/haproxy reload
    
  2. Atualize o aplicativo em cada instância inativa e coloque-os com curl para aquecê-los.

  3. Trazer de volta a primeira metade e remover a segunda metade :

    $ sed -i 's/\(web01.*\) disabled$//' /etc/haproxy/haproxy.cfg
    $ sed -i 's/\(web02.*\) disabled$//' /etc/haproxy/haproxy.cfg
    $ sed -i 's/web03.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ sed -i 's/web04.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ /etc/init.d/haproxy reload
    
  4. Repita o passo 2 para o segundo semestre.

  5. Trazer de volta a segunda metade :

    $ sed -i 's/\(web03.*\) disabled$//' /etc/haproxy/haproxy.cfg
    $ sed -i 's/\(web04.*\) disabled$//' /etc/haproxy/haproxy.cfg
    $ /etc/init.d/haproxy reload
    

Com a abordagem descrita acima, as solicitações existentes continuariam usando a V1 do aplicativo e, em seguida, a V2 para quaisquer solicitações subsequentes. Estou bem com isso porque reduziria significativamente a chance de servir as duas versões diferentes.

No entanto, usar sed para substituir a configuração parece como um hack. Aqui estão minhas outras alternativas que pensei em usar:

  1. Use o soquete UNIX para fazer a mesma abordagem de "gangorra". No entanto, como o soquete UNIX pode funcionar apenas com um servidor por vez e a implementação pode levar alguns segundos por servidor, ele pode levar a HTML em V2, mas a JavaScript em V1. No máximo, é muito mais fácil escrever código compatível com versões posteriores do que compatível com versões futuras. Então, usar essa abordagem parece que pode não funcionar.

  2. Use implementações contínuas nos servidores com sockets UNIX ou com a verificação de integridade. Durante minha pesquisa, me deparei com essa abordagem como sendo mais popular. No entanto, isso leva aos mesmos problemas que os soquetes UNIX - ter que escrever o código compatível compatível .

Talvez eu esteja complicando demais isso ou faltando algo óbvio ...

    
por TheCloudlessSky 12.02.2013 / 15:59

1 resposta

1

Então, você está preocupado com alguns recursos que não estão alinhados entre si. Isso não é realmente um problema de balanceamento de carga, mas um problema de código. Uma prática comum é 'versionar' os ativos usando um parâmetro. Por exemplo, my.html pode conter:

<link rel="stylesheet" href="http://foo.com/css/blah.css?v123">

Você deve ter uma configuração global em algum lugar no seu código que você incrementa na liberação. Em qualquer caso, você precisa forçar um recarregamento dos recursos do lado do cliente, pois eles serão armazenados em cache.

    
por 12.02.2013 / 16:43