Pergunta

Para implantar uma nova versão do nosso site, faça o seguinte:

  1. Zip-se o novo código, e enviá-lo para o servidor.
  2. No servidor ao vivo, exclua todo o código ao vivo a partir do diretório site IIS.
  3. Extraia o novo arquivo zip code para o diretório IIS agora vazia

Este processo é tudo roteirizado, e acontece muito rapidamente, mas ainda pode haver um segundo tempo de inatividade 10-20 quando os arquivos antigos estão sendo excluídos, e os novos arquivos que estão sendo implantados.

Todas as sugestões sobre um segundo método downtime 0?

Foi útil?

Solução

Você precisa de 2 servidores e um balanceador de carga. Aqui está em etapas:

  1. Ligue todo o tráfego no Servidor 2
  2. Implantar ao Servidor 1
  3. Test Server 1
  4. Ligue todo o tráfego no Servidor 1
  5. Implantar ao Server 2
  6. Test Server 2
  7. tráfego Ligue ambos os servidores

A coisa é, mesmo neste caso, você ainda terá reiniciado aplicação e perda de sessões se você estiver usando "sessões pegajosas". Se você tiver sessões de banco de dados ou um servidor de estado, então tudo deve estar bem.

Outras dicas

O ferramenta de implantação web Microsoft suporta esta em algum grau:

Permite Windows File transacional System (TxF) de apoio. Quando o suporte TxF está habilitado, operações de arquivo são atômica; isto é, que quer ter sucesso ou falhar completamente. Isto assegura que os dados integridade e evita que os dados ou arquivos de existir em um "meio caminho" ou estado corrompido. No MS Implantar, é TxF desabilitado por padrão.

Parece que a transação é para toda a sincronização. Além disso, TxF é um recurso do Windows Server 2008, de modo que este recurso transação não irá funcionar com versões anteriores.

Eu acredito que é possível modificar o script para 0-tempo de inatividade usando pastas como versões ea metabase do IIS:

  • para um caminho / url existente:
  • Copiar novo (ou modificado) website para servidor sob
    • \ web \ app \ v2.1 \
  • Modificar Metabase do IIS para alterar o caminho website
    • \ web \ app \ 2.0 \
    • para \ web \ app \ v2.1 \

Este método oferece os seguintes benefícios:

  • Na nova versão evento tem um problema, você pode facilmente reversão para v2.0
  • Para implantar a vários servidores físicos ou virtuais, você pode usar o seu script para implantação arquivo. Uma vez que todos os servidores tenham a nova versão, você pode alterar simultaneamente metabases de todos os servidores usando a ferramenta de implantação do Microsoft Web.

Você pode conseguir de zero implantação tempo de inatividade em um único servidor, utilizando Request encaminhamento aplicação no IIS como um balanceador de carga de software entre dois sites do IIS locais em portas diferentes. Isto é conhecido como blue estratégia de implantação verde , onde apenas um dos dois locais está disponível no balanceador de carga em um determinado momento. Implantar para o site que está "em baixo", aquecê-lo e trazê-lo para o balanceador de carga (geralmente por meio de um Pedido de encaminhamento aplicação health check), em seguida, tomar o site original que foi para cima, para fora do "pool" (novamente fazendo seu exame de saúde falham).

Um tutorial completo pode ser encontrado aqui.

Eu passei por isso recentemente e a solução que eu vim com era ter dois locais criadas em IIS e alternar entre elas.

Para a minha configuração, eu tinha um diretório web para cada A e B site como este: c: \ Intranet \ Vivo A \ Interface c: \ Intranet \ Vivo B \ Interface

No IIS, eu tenho dois sites idênticos (mesmas portas, autenticação, etc.), cada um com seu próprio pool de aplicativos. Um dos locais está em execução (A) e a outra é interrompida (B). o ao vivo também tem o cabeçalho de anfitrião ao vivo.

Quando se trata de implantar para viver, eu simplesmente publicar para a localização do local de parada. Porque eu posso acessar o site B usando seu porto, posso pré-aquecer o site para o primeiro usuário não causar um início de aplicação. Em seguida, usando um arquivo de lote I copiar o cabeçalho de anfitrião ao vivo para B, parar um e começar B.

Usando classe ServerManager de Microsoft.Web.Administration você pode desenvolver seu próprio agente de implantação.

O truque é mudar o PhysicalPath do VirtualDirectory, o que resulta em um interruptor atômica on-line entre antigos e novos aplicativos web.

Esteja ciente de que isso pode resultar em antigos e novos AppDomains executando em paralelo!

O problema é como mudanças sincronizar com bancos de dados etc.

Por votação para a existência de AppDomains com PhysicalPaths novos ou antigos, é possível detectar quando o velho AppDomain (s) ter terminado, e se o novo (s) AppDomain ter iniciado.

Para forçar um AppDomain para começar você deve fazer uma solicitação HTTP (IIS 7.5 suporta o recurso Autostart)

Agora você precisa de uma forma de bloquear os pedidos para o novo AppDomain. Eu uso um mutex nomeado - que é criado e de propriedade do agente de implantação, esperou pelo Application_Start do novo aplicativo web e, em seguida, liberado pelo agente de implantação uma vez que as atualizações do banco de dados foram feitas

.

(eu uso um arquivo marcador no aplicativo web para permitir o comportamento de exclusão mútua de espera) Uma vez que a nova web aplicativo está sendo executado eu excluir o arquivo marcador.

OK assim desde que todo mundo está downvoting a resposta eu escrevi caminho de volta em 2008 * ...

Vou dizer-lhe como o fazemos agora em 2014. Nós não usa mais Sites da Web porque nós estamos usando ASP.NET MVC agora.

Nós certamente não precisa de um balanceador de carga e dois servidores para fazê-lo, tudo bem se você tem 3 servidores para cada site que você manter, mas é um exagero total para a maioria dos sites.

Além disso, nós não contam com a mais recente assistente da Microsoft - muito lento, e muito escondido magia, e muito propenso a mudar seu nome

.

Aqui está como fazemos isso:

  1. Nós temos uma etapa de compilação post que cópias DLLs gerado em uma pasta 'bin-pub'.

  2. Nós usamos Beyond Compare (que é excelente **) para verificar e sincronizar arquivos alterados (por FTP, porque isso é amplamente suportado) até o servidor de produção

  3. Nós temos uma URL segura no site contendo um botão que copia tudo no 'bin-pub' para 'bin' (fazer um backup primeiro para permitir a reversão rápida). Neste ponto, o aplicativo reinicia-se. Então nossos cheques ORM se existem tabelas ou colunas que precisam ser adicionados e cria-los.

Isso é apenas milissegundos o tempo de inatividade. O reinício aplicativo pode ter um segundo ou dois, mas durante o reinício pedidos são tamponados para que haja efetivamente zero downtime.

O processo de implantação todo leva de 5 segundos a 30 minutos, dependendo quantos arquivos são alterados e como muitas mudanças para revisão.

Desta forma, você não tem que copiar um site inteiro para um diretório diferente, mas apenas a pasta bin. Você também tem controle total sobre o processo e saber exatamente o que está mudando.

** Nós sempre fazemos um globo ocular rápida das mudanças que estamos implantando - como um último minuto verifique, por isso sabemos o que testar e se alguma coisa quebra nos prontos. Usamos Beyond Compare porque permite que você arquivos facilmente diff sobre FTP. Eu nunca faria isso sem BC, você não tem idéia do que você está substituindo.

* Vá até o final de vê-lo :( BTW eu não recomendo Sites Web porque eles são mais lentos para construir e pode deixar de funcionar mal com metade compilado arquivos temporários. Nós utilizado no passado, porque eles permitiram que mais ágil file- . por arquivo de implantação muito rápido para corrigir uma questão menor e você pode ver exatamente o que você está implantando (se estiver usando Beyond Compare é claro - caso contrário pode esquecer).

As únicas de zero métodos de inatividade que eu posso pensar envolvem hospedagem em pelo menos 2 servidores.

Eu refinar a resposta de George um pouco, como se segue, para um único servidor:

  1. Use um projeto de implantação da Web para pré-compilar o site em um único DLL
  2. Zip até o novo local, e enviá-lo para o servidor
  3. Descompacte-lo para uma nova pasta localizado em uma pasta com as permissões adequadas para o local, para que os arquivos descompactados herdar as permissões corretamente (talvez e: \ web, com subpastas v20090901, v20090916, etc)
  4. Use o Gerenciador de IIS para alterar o nome da pasta que contém o site
  5. Mantenha a pasta antiga torno de um tempo, para que possa fallback para que em caso de problemas

Passo 4 fará com que o processo de trabalho do IIS para reciclar.

Esta é apenas tempo de inatividade zero se você não está usando sessões InProc; Modo de uso SQL em vez se você pode (ainda melhor, o estado da sessão evitar totalmente).

Claro, é um pouco mais envolvido quando existem vários servidores e / ou alterações de dados ....

Para expandir a resposta de Sklivvz, que se baseava em ter algum tipo de balanceador de carga (ou apenas uma cópia de espera no mesmo servidor)

  1. direcionar todo o tráfego para o site / Server 2
  2. Opcionalmente esperar um pouco, para garantir que o menor número de usuários possível ter pendentes fluxos de trabalho sobre a versão implantada
  3. Deploy para Site / Servidor 1 e aquecê-lo, tanto quanto possível
  4. Executar migrações de banco de dados transacional (se esforçar para tornar isso possível)
  5. Imediatamente direcionar todo o tráfego para sites / servidor 1
  6. Deploy para Site / Server 2
  7. O tráfego directo a ambos os sites / servidores

É possível introduzir um pouco de testes de fumo, criando um instantâneo de banco de dados / copiar, mas que nem sempre é viável.

Se possível e necessário uso de "diferenças de encaminhamento", como diferente URL inquilino: usuários s (customerX.myapp.net) ou diferentes, para implantar a um grupo desconhecido de cobaias em primeiro lugar. Se nada falhar, a libertação para todos.

Uma vez que as migrações de banco de dados estão envolvidos, a reversão para uma versão anterior é muitas vezes impossível.

Existem maneiras de fazer aplicações de jogar mais agradável nestes cenários, tais como a utilização de filas de eventos e mecanismos de reprodução, mas já que estamos falando sobre a implantação de mudanças para algo que está em uso, não há realmente nenhuma enganar prova maneira.

Isto é como eu fazê-lo:

absolutos requisitos mínimos do sistema:
1 servidor com

  • uma carga balanceador / proxy reverso (por exemplo nginx) executado na porta 80
  • 2 ASP.NET-Core / mono reverse-proxy / fastcgi chroot-prisões ou Docker-contentores de escuta em 2 portas TCP diferentes
    (Ou mesmo apenas duas aplicações reversa-proxy em 2 portas TCP diferentes sem qualquer caixa de areia)

Fluxo de Trabalho:

começar MyUpdate transação

try
    Web-Service: Tell all applications on all web-servers to go into primary read-only mode 
    Application switch to primary read-only mode, and responds 
    Web sockets begin notifying all clients 
    Wait for all applications to respond

    wait (custom short interval)

    Web-Service: Tell all applications on all web-servers to go into secondary read-only mode 
    Application switch to secondary read-only mode (data-entry fuse)
    Updatedb - secondary read-only mode (switches database to read-only)

    Web-Service: Create backup of database 
    Web-Service: Restore backup to new database
    Web-Service: Update new database with new schema 

    Deploy new application to apt-repository 
    (for windows, you will have to write your own custom deployment web-service)
    ssh into every machine in array_of_new_webapps
    run apt-get update
    then either 
    apt-get dist-upgrade
    OR
    apt-get install <packagename>
    OR 
    apt-get install --only-upgrade <packagename>
    depending on what you need
    -- This deploys the new application to all new chroots (or servers/VMs)

    Test: Test new application under test.domain.xxx
    -- everything that fails should throw an exception here
    commit myupdate;

    Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number)
    @client: notify of reload and that this causes loss of unsafed data, with option to abort 

    @ time x:  Switch load balancer from array_of_old_webapps to array_of_new_webapps 
    Decomission/Recycle array_of_old_webapps, etc.

catch
        rollback myupdate 
        switch to read-write mode
        Web-Service: Tell all applications to send web-socket request to unblock read-only mode
end try 

Eu sugeriria manter os arquivos antigos lá e simplesmente substituí-los. Dessa forma, o tempo de inatividade é limitado a de arquivo único vezes sobrescrever e há sempre apenas uma arquivo ausente de cada vez.

Não tenho certeza isso ajuda em uma "aplicação web" embora (eu acho que você está dizendo isso é o que você está usando), que é por isso que sempre usar "web sites". Também com "sites" Implantando não reiniciar seu site e soltar todas as sessões de usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top