Como usar a recuperação automática para aplicativos altamente disponíveis

Neste tutorial interativo, aprenda a usar a recuperação automática para criar aplicativos de alta disponibilidade no Compute Engine.

Aplicativos altamente disponíveis são projetados para apresentar latência e tempo de inatividade mínimos. A disponibilidade é comprometida quando um aplicativo congela ou falha. Os usuários de um aplicativo comprometido podem observar latência ou tempo de inatividade altos.

A recuperação automática permite que os aplicativos comprometidos sejam reiniciados automaticamente. Ela detecta as instâncias que falharam e as recria automaticamente para que os usuários sejam atendidos novamente. Assim, você não precisa mais ajustar manualmente seu aplicativo para que ele volte a funcionar após uma falha.

Objetivos

  • Configurar uma verificação de integridade e uma política de recuperação automática.
  • Configurar um serviço da Web de demonstração em um grupo de instâncias gerenciadas.
  • Simular falhas na verificação de integridade e acompanhar o processo de recuperação automática.

Custos

Este tutorial usa componentes faturáveis do Google Cloud Platform (GCP), entre eles os seguintes:

  • Compute Engine

Antes de começar

    Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

    Selecione ou crie um projeto do Google Cloud Platform.

    Acessar a página Gerenciar recursos

    Verifique se o faturamento foi ativado no projeto do Google Cloud Platform.

    Saiba como ativar o faturamento

    Ativar Compute Engine API.

    Ativar a API

Se preferir, instale a ferramenta de linha de comando gcloud.

Arquitetura de aplicativos

O aplicativo inclui os seguintes componentes do Compute Engine:

Arquitetura do sistema para uma verificação de integridade e um grupo de instâncias.

Como a verificação de integridade sonda o serviço da Web de demonstração

Uma verificação de integridade envia solicitações de sondagem para uma instância usando um protocolo especificado, como HTTP(S), SSL ou TCP. Para mais informações, consulte como as verificações de integridade funcionam e categorias, protocolos e portas da verificação de integridade.

A verificação de integridade neste tutorial é HTTP. Ela faz uma sondagem no caminho HTTP /health na porta 80. Para esse tipo de verificação, o pedido de análise só será aprovado se o caminho retornar uma resposta HTTP 200 (OK). Para este tutorial, o servidor da Web de demonstração configura o caminho /health para retornar uma resposta HTTP 200 (OK) quando estiver íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não estiver. Para mais informações, consulte os critérios de sucesso para HTTP, HTTPS e HTTP/2.

Criar a verificação de integridade

Para configurar a recuperação automática, crie uma verificação de integridade personalizada e configure o firewall da rede para permitir sondagens.

Console

  1. Crie uma verificação de integridade.

    1. Acesse a página Verificações de integridade no Console do GCP.
      Acessar a página "Verificações de integridade"
    2. Clique em Criar verificação de integridade.
    3. Defina Nome como autohealer-check.
    4. Em Protocolo, selecione HTTP.
    5. Defina Caminho da solicitação como /health. Isso indica qual caminho HTTP a verificação de integridade usa. Para este tutorial, o servidor da Web de demonstração configura o caminho /health para retornar uma resposta HTTP 200 (OK) quando estiver íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não estiver.
    6. Defina os Critérios de integridade:
      1. Defina o Intervalo de verificação como 10. Isso define o período entre o início de uma sondagem e o início da próxima.
      2. Defina o Tempo limite como 5. Isso define o tempo que o GCP aguardará a resposta de uma sondagem. O valor precisa ser menor ou igual ao intervalo de verificação.
      3. Defina Limite íntegro como 2. Isso define o número sequencial de sondagens que precisam ser bem-sucedidas para que a instância seja considerada íntegra.
      4. Defina o Limite não íntegro como 3. Isso define o número de falhas seguidas em sondagens para que a instância seja considerada não íntegra.
    7. Clique em Criar na parte inferior.
  2. Crie uma regra de firewall para permitir que sondagens de verificação de integridade façam solicitações HTTP.

    1. Acesse a página Criar regra de firewall no Console do GCP.
      Acessar a página "Criar regra de firewall"
    2. Em Nome, digite default-allow-http-health-check.
    3. Em Rede, selecione default.
    4. Em Destinos, selecione All instances in the network.
    5. Em Filtro de origem, selecione IP ranges.
    6. Em Intervalos de IPs de origem, insira 130.211.0.0/22 e 35.191.0.0/16.
    7. Em Protocolos e portas, selecione TCP e insira 80.
    8. Clique em Criar.

gcloud

  1. Crie uma verificação de integridade.

    gcloud compute health-checks create http autohealer-check \
        --check-interval 10 \
        --timeout 5 \
        --healthy-threshold 2 \
        --unhealthy-threshold 3 \
        --request-path "/health"
    
    • check-interval define o período entre o início de uma sondagem e o início da próxima.
    • timeout define o tempo que o GCP aguardará a resposta de uma sondagem. O valor precisa ser menor ou igual ao intervalo de verificação.
    • healthy-threshold define o número sequencial de sondagens que precisam ser bem-sucedidas para que a instância seja considerada íntegra.
    • unhealthy-threshold define o número de falhas seguidas em sondagens para que a instância seja considerada não íntegra.
    • request-path indica qual caminho HTTP a verificação de integridade usa. Para este tutorial, o servidor da Web de demonstração configura o caminho /health para retornar uma resposta HTTP 200 (OK) quando estiver íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não estiver.
  2. Crie uma regra de firewall para permitir que sondagens de verificação de integridade façam solicitações HTTP.

    gcloud compute firewall-rules create default-allow-http-health-check \
        --network default \
        --allow tcp:80 \
        --source-ranges 130.211.0.0/22,35.191.0.0/16
    

O que constitui uma boa verificação de integridade de recuperação automática

As verificações de integridade usadas para recuperação automática precisam ser conservadoras, de modo que não excluam e recriem preventivamente suas instâncias. Quando uma verificação de integridade é muito agressiva, a recuperação automática pode confundir instâncias ocupadas com instâncias com falhas e reiniciá-las desnecessariamente, reduzindo a disponibilidade.

  • unhealthy-threshold. Precisa ser maior que 1. O ideal é definir esse valor como 3 ou mais. Isso protege contra falhas raras, como a perda de pacotes de rede.
  • healthy-threshold. O valor 2 é suficiente para a maioria dos apps.
  • timeout. Defina este valor temporal com um valor generoso (cinco vezes ou mais além do tempo de resposta esperado). Isso protege contra atrasos inesperados, como instâncias ocupadas ou uma conexão de rede lenta.
  • check-interval. Esse valor precisa estar entre 1 segundo e duas vezes o tempo limite (nem muito longo nem muito curto). Quando o valor é muito longo, uma instância com falha não é detectada a tempo. Quando o valor é curto demais, as instâncias e a rede poderão ficar ocupadas devido ao alto número de sondagens da verificação de integridade que são enviadas por segundo.

Configurar o serviço da Web

Neste tutorial, é usado um aplicativo da Web armazenado no GitHub. Para saber mais sobre como o aplicativo foi implementado, consulte o repositório GitHub GoogleCloudPlatform/python-docs-samples (em inglês).

Para configurar o serviço da Web de demonstração, crie um modelo de instância que o execute na inicialização. Em seguida, use esse modelo para implantar um grupo de instâncias gerenciadas e ativar a recuperação automática.

Console

  1. Crie um modelo de instância. Inclua um script de inicialização que execute o servidor da Web de demonstração.

    1. Acesse a página Modelos de instância no Console do GCP.
      Acesse a página "Modelos de instância"
    2. Clique em Criar modelo de instância.
    3. Defina o Nome como webserver-template.
    4. Em Configuração da máquina, selecione micro (f1-micro).
    5. Em Firewall, marque a caixa de seleção Permitir tráfego HTTP.
    6. Clique em Gerenciamento, segurança, discos, rede, locatário único para ver configurações avançadas. Várias guias são exibidas.
    7. Na guia Gerenciamento, localize Automação e insira o seguinte script de inicialização:
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
      
    8. Clique em Criar.
  2. Implante o servidor da web como um grupo de instâncias gerenciadas.

    1. Acesse a página Grupos de instâncias no Console do GCP.
      Acessar a página "Grupos de instâncias"
    2. Clique em Criar grupo de instâncias.
    3. Defina o Nome como webserver-group.
    4. Em Região, selecione europe-west1.
    5. Em Zona, selecione europe-west1-b.
    6. Em Modelo de instância, selecione webserver-template.
    7. Em Escalonamento automático, selecione Desativado.
    8. Defina o Número de instâncias como 3.
    9. Em Verificação de integridade, selecione autohealer-check.
    10. Defina Atraso inicial como 90.
    11. Clique em Criar.
  3. Crie uma regra de firewall que permita solicitações HTTP para os servidores da Web.

    1. Acesse a página Criar regra de firewall no Console do GCP.
      Acessar a página "Criar regra de firewall"
    2. Em Nome, digite default-allow-http.
    3. Em Rede, selecione default.
    4. Em Destinos, selecione Specified target tags.
    5. Em Tags de destino, insira http-server.
    6. Em Filtro de origem, selecione IP ranges.
    7. Em Intervalos de IPs de origem, digite 0.0.0.0/0.
    8. Em Protocolos e portas, selecione TCP e insira 80.
    9. Clique em Criar.

gcloud

  1. Crie um modelo de instância. Inclua um script de inicialização que execute o servidor da Web de demonstração.

    gcloud compute instance-templates create webserver-template \
        --machine-type f1-micro \
        --tags http-server \
        --metadata startup-script='
      sudo apt-get update && sudo apt-get install git gunicorn3 python3-pip -y
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      cd python-docs-samples/compute/managed-instances/demo
      sudo pip3 install -r requirements.txt
      sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon'
    
  2. Crie um grupo de instâncias.

    gcloud compute instance-groups managed create webserver-group \
        --zone europe-west1-b \
        --template webserver-template \
        --size 3 \
        --health-check autohealer-check \
        --initial-delay 90
    
  3. Crie uma regra de firewall que permita solicitações HTTP para os servidores da Web.

    gcloud compute firewall-rules create default-allow-http \
        --network default \
        --allow tcp:80 \
        --target-tags http-server
    

Simular falhas na verificação de integridade

Para simular falhas na verificação de integridade, o servidor da Web de demonstração oferece algumas maneiras de forçar um problema.

Console

  1. Navegue até uma instância do servidor da Web.

    1. Acesse a página Instâncias de VMs no Console do GCP.
      Acessar a página "Instâncias de VM"
    2. Na coluna IP externo, clique no endereço IP de qualquer instância do webserver-group. Uma nova guia será aberta no navegador da Web. Se a solicitação atingir o tempo limite ou a página da Web não estiver disponível, aguarde um minuto para que o servidor termine a configuração e tente novamente.

    Será exibida uma página semelhante à seguinte:

    Página da Web de demonstração mostrando os botões de status verde e os botões de ação azuis.

  2. Na página da demonstração, clique em Tornar não íntegra.

    Isso faz com que o servidor da Web falhe na verificação de integridade. Especificamente, o servidor faz com que o caminho /health retorne um erro HTTP 500 (Internal Server Error). É possível por conta própria clicando rapidamente no botão Verificar integridade. Ele parará de funcionar depois que a recuperação automática começar a reinicializar a instância.

  3. Espere a recuperação automática agir.

    1. Acesse a página Instâncias de VMs no Console do GCP.
      Acessar a página "Instâncias de VM"
    2. Aguarde até que o status da instância do servidor da Web seja alterado. O sinal de verificação verde ao lado do nome da instância muda para um quadrado cinza, indicando que a recuperação automática começou a reinicializar a instância não íntegra.
    3. Clique em Atualizar na parte superior da página periodicamente para ver o status mais recente.
    4. O processo de recuperação automática é concluído quando o quadrado cinza volta a ser o sinal de verificação verde, indicando que a instância está íntegra novamente.

gcloud

  1. Monitore o status do grupo de instâncias. Quando terminar, pressione Ctrl+C para parar.

    while : ; do \
        gcloud compute instance-groups managed list-instances webserver-group \
        --zone europe-west1-b \
        ; done
    
    NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
    webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
    webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
    

    Se alguma instância mostrar um status que não seja RUNNING, como STAGING, aguarde um minuto para que a instância conclua a configuração e tente novamente.

  2. Abra uma nova sessão do Cloud Shell com a ferramenta de linha de comando gcloud instalada.

  3. Consiga o endereço de uma instância do servidor da Web.

    gcloud compute instances list --filter webserver-group
    

    Sob a coluna EXTERNAL_IP, copie o endereço IP de qualquer instância do servidor da Web e salve-a como uma variável bash local.

    export IP_ADDRESS=EXTERNAL_IP_ADDRESS
    
  4. Verifique se o servidor da Web concluiu a configuração. O servidor retorna uma resposta HTTP 200 OK.

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 200 OK
    Server: gunicorn/19.6.0
    ...
    

    Se você receber um erro Connection refused, espere um minuto para que o servidor termine a configuração e tente novamente.

  5. Torne o servidor da Web não íntegro.

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

    Isso faz com que o servidor da Web falhe na verificação de integridade. Especificamente, o servidor faz com que o caminho /health retorne um erro HTTP 500 INTERNAL SERVER ERROR. Verifique isso fazendo uma solicitação rápida para /health. Isso não funcionará quando a recuperação automática começar a reinicializar a instância.

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn/19.6.0
    ...
    
  6. Retorne à sua primeira sessão do shell para monitorar o grupo de instâncias e aguarde a ação da recuperação automática.

    1. Quando o processo de recuperação automática tiver iniciado, as colunas STATUS e ACTION serão atualizadas, indicando que a reinicialização da instância não íntegra está em curso.

      NAME                 ZONE            STATUS    ACTION      INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING   NONE        webserver-template
      webserver-group-tbpj  europe-west1-b  STOPPING  RECREATING  webserver-template
      
    2. O processo de recuperação automática termina quando a instância mostra novamente o STATUS de RUNNING e a ACTION de NONE, indicando que a instância foi reiniciada com êxito.

      NAME                 ZONE            STATUS   ACTION  INSTANCE_TEMPLATE   VERSION_NAME  LAST_ERROR
      webserver-group-d5tz  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-q6t9  europe-west1-b  RUNNING  NONE    webserver-template
      webserver-group-tbpj  europe-west1-b  RUNNING  NONE    webserver-template
      
    3. Quando terminar de monitorar o grupo de instâncias, pressione Ctrl+C para parar.

Sinta-se à vontade para repetir este exercício. Veja algumas ideias:

  • O que acontece se você transformar todas as instâncias em não íntegras de uma só vez? Para mais informações sobre o comportamento da recuperação automática durante falhas simultâneas, consulte Comportamento da recuperação automática.

  • É possível atualizar a configuração da verificação de integridade para recuperar instâncias o mais rápido possível? Na prática, você precisa definir os parâmetros da verificação de integridade para usar valores conservadores, conforme explicado neste tutorial. Caso contrário, as instâncias correm o risco de serem excluídas e reiniciadas por engano, mesmo que não haja um problema real.

  • O grupo de instâncias tem uma configuração de initial delay. É possível determinar o atraso mínimo necessário para este servidor da Web de demonstração? Na prática, você precisa definir o atraso de modo que seja um pouco mais longo (entre 10-20%) do que o tempo que leva para uma instância ser inicializada e começar a atender às solicitações do aplicativo. Caso contrário, a instância pode ficar presa em um ciclo de repetição de recuperação automática.

Ver o histórico de recuperação automática (Opcional)

Para ver o histórico de operações da recuperação automática, use o seguinte comando gcloud:

gcloud compute operations list --filter='operationType~compute.instances.repair.*'

Para mais informações, consulte Como ver o histórico de operações da recuperação automática.

Como fazer a limpeza

Depois de concluir este tutorial, limpe os recursos criados no GCP para que não consumam sua cota e você não seja cobrado por eles no futuro. Veja como excluir e desativar esses recursos nas seções a seguir.

Se você tiver criado um projeto separado para este tutorial, exclua o projeto inteiro. Se o projeto tiver recursos que você quer manter, exclua apenas os recursos específicos criados neste tutorial.

Como excluir o projeto

  1. No Console do GCP, acesse a página "Projetos".

    Acessar a página Projetos

  2. Na lista de projetos, selecione um e clique em Excluir projeto.
  3. Na caixa de diálogo, digite o código do projeto e clique em Encerrar para excluí-lo.

Como excluir recursos específicos

Se não for possível excluir o projeto usado para este tutorial, exclua os recursos do tutorial individualmente.

Como excluir o grupo de instâncias

Console

  1. No Console do GCP, acesse a página "Grupos de instâncias".

    Acessar a página "Grupos de instâncias"

  2. Clique na caixa de seleção ao lado do grupo de instâncias webserver-group.
  3. Clique no botão Excluir na parte superior da página para excluir o grupo de instâncias.

gcloud

gcloud compute instance-groups managed delete webserver-group --zone europe-west1-b -q

Como excluir o modelo da instância

Console

  1. Acesse a página Modelos de instância no Console do GCP.

    Acesse a página "Modelos de instância"

  2. Clique na caixa de seleção ao lado do modelo.

  3. Clique em Excluir no topo da página. Na nova janela, clique em Excluir para confirmar a remoção.

gcloud

gcloud compute instance-templates delete webserver-template -q

Como excluir a verificação de integridade

Console

  1. Acesse a página Verificações de integridade no Console do GCP.

    Acessar a página "Verificações de integridade"

  2. Clique na caixa de seleção ao lado da verificação de integridade.

  3. Clique em Excluir no topo da página. Na nova janela, clique em Excluir para confirmar a remoção.

gcloud

gcloud compute health-checks delete autohealer-check -q

Como excluir as regras de firewall

Console

  1. Acesse a página Regras de firewall no Console do GCP.

    Acessar a página Regras de firewall

  2. Clique nas caixas de seleção ao lado das regras default-allow-http e default-allow-http-health-check.

  3. Clique em Excluir no topo da página. Na nova janela, clique em Excluir para confirmar a remoção.

gcloud

gcloud compute firewall-rules delete default-allow-http default-allow-http-health-check -q

A seguir

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine