Temos uma situação em que temos vários servidores com balanceamento de carga apontando para um banco de dados comum.
Na execução normal, tudo funciona bem e fornece redundância, escalabilidade etc.
No entanto, estamos achando a implantação um pouco trabalhosa.
Estamos usando os recursos extensivamente e tentando automatizar a implantação. A implantação no momento não é muito confiável.
De uma forma simplificada, o script de implantação para cada servidor possui dois estágios
Atualizar arquivos
Reverter recursos (que gerenciarão dependências, alterações de configurações etc.)
Existem práticas recomendadas para implantar em vários servidores sem causar um estado inconsistente?
Tanto quanto eu posso ver, se você implantar as etapas 1 e 2 no servidor A, fará com que o servidor B seja interrompido. Se você tentar a etapa um nos dois servidores antes de prosseguir para a etapa 2, as duas serão interrompidas por um tempo.
fonte
Em nossa empresa, mantemos MUITOS sites Drupal, nossa configuração atual é mais ou menos assim:
O que eu diria acima é bastante comum para a maioria dos sites Drupal.
O que fazemos de especial em nossa empresa é empacotar os sites para implantação usando um comando drush personalizado - ' Drush Debian Packaging '.
O Drush Packaging Debian fornece um comando Drush para compilar pacotes Debian de sites Drupal como um meio de implantar sites Drupal em servidores Debian ou Ubuntu.
O Drush Packaging Debian utiliza o sistema de ganchos Drupal para criar um pacote Debian que melhor se adapte às necessidades de seus sites. Características incluem:
O que isto significa?
Para criar um release:
Para implantar uma versão, primeiro SCP o .deb para todos os servidores Web no cluster. Em seguida, em todos os servidores web, execute (você pode usar o pacote linux cssh para digitar o comando para todos os servidores no farm ao mesmo tempo):
Em um servidor web, execute:
Feito
Obviamente, reverter isso agora é trivial do ponto de vista da base de código, basta instalar a versão anterior do .deb em todos os servidores Web e reverter o banco de dados.
É um prazer responder a quaisquer perguntas sobre isso
fonte
Qual parte do processo de implantação é uma tarefa / não confiável?
Se for o problema "servidor de atualização A e B / inconsistência", que tal colocar a página de manutenção durante a duração de seus pushes? Página de manutenção para cima, atualizar o código nos dois cabeçotes da web, execute update.php em um deles, página de manutenção para baixo. Isso é muito fácil de escrever.
Outra opção: dependendo do tipo de site que você executa, você pode criar um "modo somente leitura" que expulse todos os usuários offline e desabilite o login / registro. Clone seu banco de dados em um segundo banco de dados na mesma caixa de banco de dados, clone seu front end para uma nova docroot, faça suas atualizações lá e vincule novamente a docroot do Apache à nova docroot do front end. O fluxo de trabalho é algo como:
fonte
Vai depender das alterações que você está fazendo, como Entendu sugere. Qual a proporção de atualizações de código que pode ser executada sem causar erros se o banco de dados ainda não estiver atualizado? Para qualquer coisa que não dependa de atualizações do banco de dados (e talvez você possa alterar um pouco o processo de desenvolvimento para tornar isso mais comum), não há realmente nada de especial para fazer. Suponho que você queira fazer implantações com tempo de inatividade mínimo, caso contrário, isso levaria apenas algumas operações básicas de sincronização. Nesse caso, sempre haverá uma janela de tempo com efeitos indesejados (mesmo que o site esteja apenas no modo somente leitura), mas eu acho que poderia ser bem pequeno a maior parte do tempo.
Você pode fazer a otimização básica, como configurar um diretório "novo" em cada servidor com antecedência e depois alterná-los para apontar para o novo diretório ao mesmo tempo (talvez usando links simbólicos, como na resposta do Entendu), para obter todo o servidores mudaram para os novos arquivos em 5 a 10 segundos.
Isso deixa o problema das atualizações do banco de dados. Se forem do tipo que deve ser feito apenas em um servidor, você poderá colocar os outros no modo de manutenção ou ajustar o balanceador de carga para não usá-los enquanto isso acontecer. Obviamente, se eles não puderem ser feitos enquanto os usuários estiverem ativos no site, você precisará ter tudo no modo de manutenção, mas para atualizações simples, isso pode ser algo que você pode fazer em cerca de 30 segundos ou menos.
Pode valer a pena ter scripts de implantação diferentes para diferentes tipos de alterações, para que você possa executar o processo mínimo necessário, seja copiando arquivos, executando uma pequena atualização do banco de dados ou fazendo uma grande alteração no banco de dados.
Se você pode otimizar suas atualizações de arquivos e bancos de dados e verificar se há alterações simples que podem ser feitas na maneira como as coisas são desenvolvidas, isso pode levá-lo mais perto, mas não sei se isso é novidade para você :)
fonte
Aegir é útil para gerenciar uma rede de sites. Usei-o para implantar e gerenciar mais de 2000 sites para um único cliente.
Sua pergunta sugere que você deseja gerenciar um único site com vários webheads. Se for esse o caso, Aegir pode ser menos útil para você. Em vez disso, sugiro que você use um sistema de arquivos compatível com redes. Isso não apenas garante que seu código seja mantido em sincronia, como significa que seus uploads estão disponíveis em todos os nós.
Historicamente, as pessoas usam o NFS, o que permite que o sistema de arquivos de um servidor seja compartilhado com outros nós. Infelizmente, isso apresenta um único ponto de falha, porque se o servidor NFS trava ou morre, seu site não pode ser atendido.
Se você deseja comprometer um pouco o desempenho io em favor de um servidor mais confiável, eu recomendaria o GlusterFS . Eu usei em alguns ambientes de produção. Não é perfeito, mas é melhor que o NFS. O Gluster permite que o webhead sempre leia localmente e as gravações são replicadas para os outros nós.
Em termos de sua estratégia de implantação, você deve usar o drush como a primeira ferramenta em sua lista. Com o drush, você poderá automatizar as etapas da sua implantação. Você deve adicionar o Jenkins à mistura para poder rastrear seus trabalhos de implantação e identificar padrões se houver falha. O Capistrano pode ser útil para automatizar as etapas envolvidas na implantação. Se você fizer as coisas corretamente, poderá fazê-lo para que seus usuários nunca saibam que você fez uma implantação.
fonte