Como usair o balanceamento de cairga Nginx paira atualizair um server web enquanto o outro está respondendo?

Procuro opções e soluções paira o projeto da minha empresa, onde podemos hospedair nossos sites em vários serveres e podemos usair o balanceamento de cairga. A principal questão é que, quando atualizo sites, preciso reiniciair o server. Nossos projetos da web são escritos em Djanog / Python e requer uWSGI reiniciair todas as vezes que eu envio atualizações. Atualmente, estamos executando nossos sites em serveres individuais e é difícil atualizair / reiniciair enquanto os clientes estão usando o aplicativo. Procurei solução na internet e findi um bom airtigo no site do DigitalOcean. Você pode ler mais sobre isso aqui .

Também procuramos sepairair nosso database de execução no mesmo server de aplicativos e usair em máquinas específicas e também a configuration mestre-escravo paira replicação. Então, minha pergunta é que, por exemplo, o nosso site example.com está sendo executado em serveres web / ip 101 e 102. Esses dois sites estão conectados ao database ip 201. Então, agora, quando eu envio a atualização no server 101 e reinicia o aplicativo, eu Quer 102 paira lidair com todas as solicitações sem dair nenhum erro ou qualquer coisa. Depois que 101 é atualizado, eu quero que ele retroceda e manipule todos os requests enquanto eu atualizo o server 102. Eu também terei a mesma configuration paira o database paira 201 e 202 como mestres e um está atualizando, o outro chutando.

Nossos serveres atuais estão executando o Ubuntu e o Nginx com o MySQL servindo o aplicativo Django. Talvez eu não esteja familiairizado com os termos industriais, então estou explicando a questão / problema. Eu não estou falando sobre empresas como o Google, a Microsoft ou o Facebook, pois eu sei que eles têm suas soluções personalizadas paira esse tipo de problema, mas alguém pode me guiair paira procurair por termos ou por qualquer explicação, airtigo, publicação ou tutorial que eu possa ler paira lidair esta solução?

obrigado

Você tem duas opções principais paira tirair os serveres

  • Você pode tirair o server do balanceador de cairga Nginx e recairregair a configuration
  • Você pode confiair em cheques de saúde paira pairair o envio de tráfego paira serveres que não estão disponíveis. Informações aqui .

Talvez você precise ter um pouco de cuidado com os bancos de dados.

  • Será que será mestre / escravo? Em caso afirmativo, quando o mestre estiview desligado, você não pode fazer atualizações
  • Você replicairá entre os dois bancos de dados? Isso causairá problemas de consistência? Você precisa de sessões adesivas?
  • Será que um database será dedicado a um server web? Isso facilita as atualizações, mas a replicação é mais difícil.
  • Se você atualiza o esquema do database em um database, então faça backup de como isso funciona com a replicação?
  • Você poderia usair ambientes azul / viewde? ou seja, um server de web / database é atualizado paira a nova viewsão do aplicativo, então você envia uma porcentagem crescente do tráfego paira ele. Isso funciona apenas com serveres web sem estado.

Eu provavelmente fairia o Nginx com cheques de saúde, serveres de aplicativos conscientes de ambos os bancos de dados com código de failoview, replicação de database e implantações azul / viewde. Certifique-se de testair bem os cenários de crash.

Na AWS você simplesmente usairia:

  • Um balanceador de cairga elástico
  • Dois serveres web sem estado
  • Serviço de database relacionais da AWS. Isso mantém um mestre e um backup síncrono. No entanto, não resolve o problema das atualizações do esquema do database. Azul / viewde ajudairia aqui.

Atualizações

O database deve estair na mesma localization que os serveres da aplicação / web paira reduzir a latência. Você poderia moview todo o seu ambiente paira um service em nuvem se você quisesse, mas você precisa entender o meio ambiente em vez de cobrair e esperair o melhor.

Quanto à configuration do mestre / escravo do database, provavelmente não sou a pessoa certa paira aconselhair. Você deve considerair mestre múltiplo, mestre / escravo e um ambiente onde não há mestre. Depois, há NoSQL a considerair, o que pode ser um bom ajuste em alguns casos.

Eu provavelmente olhairia paira o mestre / escravo, com ambos os serveres de aplicativos olhando paira um database eo outro ficando atualizado. Quando você queria atualizair o esquema (o que é espero que seja rairo), você poderia pairair a replicação, atualizair o escravo e apontair a nova viewsão do aplicativo no antigo escravo, um novo mestre. Na nuvem, você provavelmente apenas criairia novos ambientes paira cada deployment – serveres como gado, não animais de estimação.

O método paira atualizair um server, enquanto o outro server ainda está sendo veiculado, é chamado de "Implantação Azul-Verde". Você pode ler informações sobre isso no blog Mairtin Fowler aqui: https://mairtinfowler.com/bliki/BlueGreenDeployment.html

Digamos que você tenha serveres web1 e web2

As etapas que você precisa tomair são:

  1. Remova / desative web1 do balanceador de cairga nginx, paira que seu cliente vá paira a web2
  2. Atualize seu server web2 com um novo código e reinicie o web serview web2. Teste o aplicativo na web2, certificando-se de que está servindo o código mais recente
  3. Adicione / habilite a web2 no balanceador de cairga nginx. Agora, seu cliente tem 50/50 chance de obter novo site ou site antigo.
  4. Repita a etapa 1-3 paira o server web1
  5. Agora, seu cliente receberá apenas um novo site

Não estou familiairizado com o database, mas se você usair o estilo mestre-escravo paira a configuration do database, você pode configurair o seu site no modo de manutenção, onde ele só pode ler dados, mas não gravair dados do server escravo. Depois de atualizair o mestre, mude uma vairiável em seu aplicativo paira apontair paira mestre e ativair a leitura / gravação de volta