Estou tentando obter zero implantações de tempo de inatividade para poder implantar menos durante o horário de folga e mais durante o horário "mais lento" - ou a qualquer momento, em teoria.
Minha configuração atual, um pouco simplificada:
- Servidor Web A (.NET App)
- Servidor Web B (.NET App)
- Servidor de banco de dados (SQL Server)
Meu processo de implantação atual:
- "Pare" os sites nos servidores A e B da Web
- Atualize o esquema do banco de dados para a versão do aplicativo que está sendo implantada
- Atualizar servidor Web A
- Atualizar servidor Web B
- Coloque tudo de volta online
Problema atual
Isso leva a uma pequena quantidade de tempo de inatividade a cada mês - cerca de 30 minutos. Eu faço isso fora do horário comercial, portanto não é um problema enorme - mas é algo que eu gostaria de evitar.
Além disso - não há como realmente voltar '. Geralmente, não faço scripts de reversão de banco de dados - apenas atualizamos scripts.
Aproveitando o Load Balancer
Eu adoraria poder atualizar um servidor Web por vez. Tire o servidor da Web A do balanceador de carga, atualize-o, coloque-o novamente online e repita para o servidor da Web B.
O problema é o banco de dados. Cada versão do meu software precisará ser executada em uma versão diferente do banco de dados - por isso estou meio que "preso".
Solução possível
Uma solução atual que estou considerando é adotar as seguintes regras:
- Nunca exclua uma tabela de banco de dados.
- Nunca exclua uma coluna do banco de dados.
- Nunca renomeie uma coluna do banco de dados.
- Nunca reordene uma coluna.
- Todo procedimento armazenado deve ser versionado.
- Significado - 'spFindAllThings' se tornará 'spFindAllThings_2' quando for editado.
- Em seguida, torna-se 'spFindAllThings_3' quando editado novamente.
- A mesma regra se aplica às visualizações.
Embora isso pareça um pouco extremo - acho que resolve o problema. Cada versão do aplicativo atingirá o banco de dados de maneira ininterrupta. O código espera certos resultados das exibições / procedimentos armazenados - e isso mantém esse 'contrato' válido. O problema é - apenas escoa desleixado. Sei que posso limpar os procedimentos armazenados antigos depois que o aplicativo é implantado por um tempo, mas parece sujo. Além disso - depende de todos os desenvolvedores seguirem essa regra, o que acontecerá principalmente, mas imagino que alguém cometa um erro.
Finalmente - minha pergunta
- Isso é desleixado ou hacky?
- Alguém mais está fazendo assim?
- Como as outras pessoas estão resolvendo esse problema?