Implantando código em vários servidores front-end

8

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

  1. Atualizar arquivos

  2. 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.

Jeremy French
fonte

Respostas:

6

Você provavelmente deve procurar no Aegir , que é de longe o mais flexível e poderoso sistema de gerenciamento / implantação de sites Drupal. Ele é capaz de gerenciar 'plataformas' que abrangem várias cabeças da web, ou 'clusters', além de várias outras configurações.

Sugiro que você leia a documentação da comunidade, que geralmente é muito boa, bem como leia a excelente visão geral e o artigo introdutório do mig5 e alguns de seus outros artigos como este .

Você também pode obter um bom suporte no canal #aegir IRC.

Será uma mudança no fluxo de trabalho, o que definitivamente pode levar algum tempo para você entender, mas quando você estiver lá, não olhará para trás.

Tom Kirkpatrick
fonte
Obrigado, isso é interessante, mas pode ser uma mudança maior que esperávamos. Como temos apenas um site, o Aegir parece um exagero e outro nível de complexidade.
Jeremy French
Obrigado, não sei se acabaremos fazendo isso, mas parece ser uma opção muito boa.
Jeremy French
Eu recomendo. Pensar que seu trabalho é pequeno demais para exigir algo como aegir é a maneira errada de encará-lo. Aegir é adequado para projetos pequenos e grandes. Se você precisar implantar sites drupal, o Aegir é o caminho a seguir. período. (IMO)
Tom Kirkpatrick
4

Em nossa empresa, mantemos MUITOS sites Drupal, nossa configuração atual é mais ou menos assim:

  • A base de código de cada site tem seu próprio repositório git
  • Novos recursos que provavelmente não serão estáveis ​​o suficiente para o próximo lançamento terão seu próprio ramo de recursos no git

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:

  • Configuração automática de host virtual para servidores Web Apache2 e Nginx
  • Configuração do Cron em /etc/cron.d
  • Implantação automatizada de código com partição dividida para sites / padrão / arquivos
  • Configuração automatizada através da ferramenta de configurações do dpkg debconf
  • Processo de implantação automatizada
  • manipulador Git VCS personalizado para criar pacotes do Git

O que isto significa?

Para criar um release:

cd /path/to/drupal-root
drush dh-make

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):

sudo dpkg -i drupal-site-yoursitehere.2011.05.25-1.all.deb

Em um servidor web, execute:

cd /path/to/drupal-root
sudo -u drupal-site-yoursitehere drush updb && drush fra -y && drush cron

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

wiifm
fonte
Esse é um ótimo caminho a percorrer! Você procurou o Aegir antes de configurar esse fluxo de trabalho?
266 Andy
O Aegir é ótimo se você hospeda todos os seus sites no mesmo cluster, não ajuda quando você implanta seus sites em hosts físicos separados. Não vejo aegir como um concorrente para esta configuração, de fato logo estaremos implantando instalar o hostmaster e as plataformas para aegir com Drush DEBAIN embalagem
WIIFM
3

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:

  1. Modo somente leitura ativado
  2. SELECT current_db INTO new_db
  3. cp -R current_docroot new_docroot
  4. new.yourdomain.com ==> / new_docroot
  5. atualizar código em new_docroot
  6. update.php
  7. symlink / new_docroot ==> current_docroot
  8. Modo somente leitura desativado.
Entendu
fonte
Ideia interessante, +1 para a desativação. Nosso objetivo era fazer implantações fáceis a qualquer momento. Colocar o offline leva você a pensar nas janelas de lançamento, mas pode ser uma maneira muito confiável de fazê-lo.
Jeremy French
Tudo depende do que você está implantando. Alterações de CSS, por exemplo, podem ser implantadas ao vivo com impacto mínimo (exceto as atualizações de cache que precisam acontecer).
Entendu 23/05
Opa, destinado a fazer uma quebra de linha. A opção 2 acima pode ser com script e quarterbacked com Hudson / Jenkins. Até que ponto vai depender de que tipo de site é esse (100% de usuários logados? Principalmente por dia?) E do impacto esperado nos visitantes que ele terá.
Entendu 23/05
2

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ê :)

richardg
fonte
0

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.

skwashd
fonte