Como usar a recuperação automática para apps 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 apps comprometidos sejam reiniciados automaticamente. Ela detecta rapidamente as instâncias de máquina virtual (VM) com falha e as recria automaticamente para que os clientes sejam atendidos novamente. Com a correção automática, você não precisa mais ajustar manualmente um app 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 gerenciado de instâncias (MIG).
  • Simular falhas na verificação de integridade e acompanhar o processo de recuperação automática.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, como estes:

  • Compute Engine

Antes de começar

    Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

    Make sure that billing is enabled for your Google Cloud project.

    Enable the Compute Engine API.

    Enable the API

Se você preferir trabalhar na linha de comando, instale a Google Cloud CLI.

  • Install the Google Cloud CLI.
  • To initialize the gcloud CLI, run the following command:

    gcloud init

Arquitetura de apps

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 VM usando um protocolo especificado, como HTTP(S), SSL ou TCP. Para mais informações, veja como as verificações de integridade funcionam e as 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.

Neste tutorial, você vai criar uma verificação de integridade regional. Para a recuperação automática, use uma verificação de integridade regional ou global. As verificações de integridade regionais reduzem as dependências entre regiões e ajudam a conseguir a residência dos dados. As verificações de integridade globais são convenientes quando você quer usar a mesma verificação de integridade para MIGs em várias regiões.

Console

  1. criar uma verificação de integridade.

    1. No console do Google Cloud, acesse a página Criar verificação de integridade.

      Acessar "Criar verificação de integridade"

    2. No campo Nome, use autohealer-check.

    3. Defina o Escopo como Regional.

    4. No menu suspenso Região, selecione europe-west1.

    5. Em Protocolo, selecione HTTP.

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

    7. 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 Google Cloud aguardará pela 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 de sondagens sequenciais que precisam ser bem-sucedidas para que a VM seja considerada íntegra.
      4. Defina o Limite não íntegro como 3. Isso define o número de sondagens sequenciais que precisam falhar para que a VM seja considerada não íntegra.
    8. Deixe os valores padrão para as outras opções.

    9. 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. No console do Google Cloud, acesse a página Criar regra de firewall.

      Acessar a opção Criar regra de firewall

    2. Em Nome, insira 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 IPv4 ranges.

    6. Em Intervalos IPv4 de origem, insira 130.211.0.0/22, 35.191.0.0/16.

    7. Em Protocolos e portas, selecione TCP e insira 80.

    8. Deixe os valores padrão para as outras opções.

    9. Clique em Criar.

gcloud

  1. Crie uma verificação de integridade usando o comando health-checks create http.

    gcloud compute health-checks create http autohealer-check \
        --region europe-west1 \
        --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 Google Cloud aguardará pela resposta de uma sondagem. O valor precisa ser menor ou igual ao intervalo de verificação.
    • healthy-threshold define o número de sondagens sequenciais que precisam ser bem-sucedidas para que a VM seja considerada íntegra.
    • unhealthy-threshold define o número de sondagens sequenciais que precisam falhar para que a VM 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, o recuperador automático 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 esse valor de tempo com um número alto (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 ser entre um 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 app foi implementado, consulte o repositório do GitHub GoogleCloudPlatform/python-docs-samples.

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. No console do Google Cloud, acesse a página Criar modelo de instância.

      Acessar "Criar um modelo de instância"

    2. Defina o Nome como webserver-template.

    3. Na seção Local, no menu suspenso Região, selecione europe-west1.

    4. Na seção Configuração da máquina, no menu suspenso Tipo de máquina, selecione e2-medium.

    5. Na seção Firewall, marque a caixa de seleção Permitir tráfego HTTP.

    6. Abra a seção Opções avançadas para acessar as configurações avançadas. Várias subseções aparecem.

    7. Na seção Gerenciamento, localize Automação e insira o seguinte script de inicialização:

      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
      

    8. Deixe os valores padrão para as outras opções.

    9. Clique em Criar.

  2. Implante o servidor da web como um grupo de instâncias gerenciadas.

    1. No console do Google Cloud, acesse a página Criar grupo de instâncias.

      Acessar "Criar grupo de instâncias"

    2. Defina o Nome como webserver-group.

    3. Em Modelo de instância, selecione webserver-template.

    4. Em Região, selecione europe-west1.

    5. Em Zona, selecione europe-west1-b.

    6. Na seção Escalonamento automático, em Modo de escalonamento automático, selecione Desativado: não fazer escalonamento automático.

    7. Role de volta para o campo Número de instâncias e defina como 3.

    8. Na seção Autocorreção, faça o seguinte:

      1. No menu suspenso Verificação de integridade, selecione autohealer-check.
      2. Defina Atraso inicial como 180.

    9. Deixe os valores padrão para as outras opções.

    10. Clique em Criar.

  3. Crie uma regra de firewall que permita solicitações HTTP para os servidores da Web.

    1. No console do Google Cloud, acesse a página Criar regra de firewall.

      Acessar a opção Criar regra de firewall

    2. Em Nome, insira 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 IPv4 ranges.

    7. Em Intervalos IPv4 de origem, insira 0.0.0.0/0.

    8. Em Protocolos e portas, selecione TCP e insira 80.

    9. Deixe os valores padrão para as outras opções.

    10. 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 \
        --instance-template-region europe-west1 \
        --machine-type e2-medium \
        --tags http-server \
        --metadata startup-script='
      apt update && apt -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo'
    
  2. criar um grupo gerenciado de instâncias.

    gcloud compute instance-groups managed create webserver-group \
        --zone europe-west1-b \
        --template projects/PROJECT_ID/regions/europe-west1/instanceTemplates/webserver-template \
        --size 3 \
        --health-check projects/PROJECT_ID/regions/europe-west1/healthChecks/autohealer-check \
        --initial-delay 180
    
  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
    

Aguarde alguns minutos para que o grupo gerenciado de instâncias crie e verifique as VMs.

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 VM do servidor da Web.

    1. No console do Google Cloud, acesse a página Instâncias de VMs.

      Acessar instâncias de VM

    2. Em qualquer VM webserver-group, na coluna IP externo, clique no endereço IP. 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 verificar isso 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 VM.

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

    1. No console do Google Cloud, acesse a página Instâncias de VMs.

      Acessar instâncias de VM

    2. Aguarde até que o status da VM do servidor da Web mude. A marca de seleção verde ao lado do nome da VM muda para um quadrado cinza, indicando que a recuperação automática começou a reiniciar a VM 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 VM está íntegra novamente.

gcloud

  1. Monitore o status do grupo gerenciado de instâncias. Quando terminar, pare de pressionar Ctrl+C.

    while : ; do \
        gcloud compute instance-groups managed list-instances webserver-group \
        --zone europe-west1-b \
        ; done
    
      NAME: webserver-group-0zx6
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-4qbx
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    
      NAME: webserver-group-m5v5
      ZONE: europe-west1-b
      STATUS: RUNNING
      HEALTH_STATE: HEALTHY
      ACTION: NONE
      INSTANCE_TEMPLATE: webserver-template
      VERSION_NAME:
      LAST_ERROR:
    

    Todas as VMs no grupo precisam mostrar STATUS: RUNNING e ACTION: NONE. Caso contrário, aguarde alguns minutos para que as VMs terminem a configuração e tente novamente.

  2. Abra uma nova sessão do Cloud Shell com a Google Cloud CLI instalada.

  3. Consiga o endereço de uma VM do servidor da Web.

    gcloud compute instances list --filter webserver-group
    

    Na coluna EXTERNAL_IP, copie o endereço IP de qualquer VM do servidor da Web e salve-o 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 responde com HTTP 200 OK.

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

    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. É possível verificar isso por conta própria fazendo uma solicitação rápida para /health. Ele vai parar de funcionar depois que a recuperação automática começar a reinicializar a VM.

    curl --head $IP_ADDRESS/health
    
    HTTP/1.1 500 INTERNAL SERVER ERROR
    Server: gunicorn
    ...
    
  6. Retorne à sua primeira sessão do shell para monitorar o grupo gerenciado 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 VM não íntegra está em curso.

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: STOPPING
        HEALTH_STATE: UNHEALTHY
        ACTION: RECREATING
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    2. O processo de recuperação automática é concluído quando a VM mostra novamente o STATUS de RUNNING e a ACTION de NONE, indicando que a VM foi reiniciada com êxito.

        NAME: webserver-group-0zx6
        ZONE: europe-west1-b
        STATUS: RUNNING
        HEALTH_STATE: HEALTHY
        ACTION: NONE
        INSTANCE_TEMPLATE: webserver-template
        VERSION_NAME:
        LAST_ERROR:
      
        ...
      
    3. Quando terminar de monitorar o grupo gerenciado 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 VMs 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 VMs 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 VMs correm o risco de serem excluídas e reiniciadas por engano, mesmo que não haja um problema real.

  • O grupo gerenciado de instâncias tem uma configuração 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 VM ser inicializada e começar a atender às solicitações do app. Caso contrário, a VM pode ficar presa em um ciclo de inicializaçã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.

Limpeza

Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.

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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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. In the Google Cloud console, go to the Instance groups page.

    Go to Instance groups

  2. Select the checkbox for your webserver-group instance group.
  3. To delete the instance group, click Delete.

gcloud

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

Como excluir o modelo de instância

Console

  1. No Console do Google Cloud, acesse a página Modelos de instância.

    Acessar "Modelos de instância"

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

  3. Clique em Excluir na parte superior 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. No console do Google Cloud, acesse a página Verificações de integridade.

    Acessar "Verificações de integridade"

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

  3. Clique em Excluir na parte superior 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. No Google Cloud Console, acesse a página Regras de firewall.

    Acessar as regras de firewall

  2. Clique nas caixas ao lado das regras de firewall chamadas default-allow-http e default-allow-http-health-check.

  3. Clique em Excluir na parte superior 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