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


Este tutorial interativo mostra como usar a recuperação automática para criar aplicativos altamente disponíveis no Compute Engine.

Aplicativos altamente disponíveis são projetados para atender clientes com latência e tempo de inatividade mínimos. A disponibilidade é comprometida quando um aplicativo trava ou trava. Os clientes de um aplicativo comprometido podem enfrentar alta latência ou tempo de inatividade.

A recuperação automática permite reiniciar automaticamente aplicativos comprometidos. Ele detecta prontamente instâncias de máquinas virtuais (VM) com falha e as recria automaticamente, para que os clientes possam ser atendidos novamente. Com a recuperação automática, você não precisa mais colocar um aplicativo manualmente de volta em serviço após uma falha.

Objetivos

  • Configure uma verificação de integridade e uma política de recuperação automática.
  • Configure um serviço Web de demonstração em um grupo gerenciado de instâncias (MIG).
  • Simule falhas na verificação de integridade e testemunhe o processo de recuperação de recuperação automática.

Custos

Este tutorial usa componentes faturáveis ​​de Google Cloud incluindo:

  • Mecanismo de computação

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 preferir trabalhar na linha de comando, instale a CLI do Google Cloud.

Arquitetura do aplicativo

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 investiga o webservice de demonstração

Uma verificação de integridade envia solicitações de investigação a uma VM usando um protocolo especificado, como HTTP(S), SSL ou TCP. Para obter mais informações, consulte como funcionam as verificações de integridade e categorias, protocolos e portas de verificações de integridade .

A verificação de funcionamento neste tutorial é uma verificação de funcionamento HTTP que investiga o caminho HTTP /health na porta 80. Para uma verificação de funcionamento HTTP, a solicitação de investigação passa apenas se o caminho retornar uma resposta HTTP 200 (OK) . Para este tutorial, o servidor web de demonstração define o caminho /health para retornar uma resposta HTTP 200 (OK) quando íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não íntegro. Para obter mais informações, consulte critérios de sucesso para HTTP, HTTPS e HTTP/2 .

Crie 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 de verificação de integridade.

Neste tutorial, você cria uma verificação de integridade regional. Para recuperação automática, você pode usar uma verificação de integridade regional ou global . As verificações de saúde regionais reduzem as dependências entre regiões e ajudam a alcançar a residência dos dados. As verificações de integridade globais são convenientes se você quiser usar a mesma verificação de integridade para MIGs em diversas regiões.

Console

  1. Crie uma verificação de integridade.

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

      Vá para Criar verificação de integridade

    2. No campo Nome , insira autohealer-check .

    3. Defina o Escopo como Regional .

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

    5. Para Protocolo selecione HTTP .

    6. Defina o caminho da solicitação como /health . Isso indica qual caminho HTTP a verificação de integridade usa. Para este tutorial, o servidor web de demonstração define o caminho /health para retornar uma resposta HTTP 200 (OK) quando íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não íntegro.

    7. Defina os critérios de saúde :

      1. Defina Intervalo de verificação como 10 . Isso define a quantidade de tempo desde o início de uma sondagem até o início da próxima.
      2. Defina o tempo limite como 5 . Isso define a quantidade de tempo queGoogle Cloud aguarda uma resposta a uma sonda. Este valor deve ser menor ou igual ao intervalo de verificação.
      3. Defina o limite íntegro como 2 . Isso define o número de análises sequenciais que devem 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 análises sequenciais que devem 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 .

      Vá para Criar regra de firewall

    2. Para Nome , insira default-allow-http-health-check .

    3. Para Rede , selecione default .

    4. Para Destinos , selecione All instances in the network .

    5. Em Filtro de origem , selecione IPv4 ranges .

    6. Para 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 demais 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 a quantidade de tempo desde o início de uma investigação até o início da próxima.
    • timeout define a quantidade de tempo que Google Cloudaguarda uma resposta a uma sonda. Este valor deve ser menor ou igual ao intervalo de verificação.
    • healthy-threshold define o número de análises sequenciais que devem ser bem-sucedidas para que a VM seja considerada íntegra.
    • unhealthy-threshold define o número de análises sequenciais que devem 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 web de demonstração define o caminho /health para retornar uma resposta HTTP 200 (OK) quando íntegro ou uma resposta HTTP 500 (Internal Server Error) quando não íntegro.
  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 autocura

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

  • unhealthy-threshold . Deve ser maior que 1 . O ideal é definir esse valor como 3 ou mais. Isso protege contra falhas raras, como perda de pacotes de rede.
  • healthy-threshold . Um valor 2 é suficiente para a maioria dos aplicativos.
  • timeout . Defina esse valor de tempo para um valor generoso (cinco vezes ou mais que o tempo de resposta esperado). Isso protege contra atrasos inesperados, como instâncias ocupadas ou conexão de rede lenta.
  • check-interval . Este valor deve estar entre 1 segundo e duas vezes o tempo limite (nem muito longo nem muito curto). Quando um valor é muito longo, uma instância com falha não é detectada com rapidez suficiente. Quando um valor é muito curto, as instâncias e a rede podem ficar mensuravelmente ocupadas, devido ao grande número de sondagens de verificação de integridade enviadas a cada segundo.

Configurar o serviço web

Este tutorial usa um aplicativo da web armazenado no GitHub. Se você quiser saber mais sobre como o aplicativo foi implementado, consulte o repositório GoogleCloudPlatform/python-docs-samples GitHub.

Para configurar o serviço web de demonstração, crie um modelo de instância que inicie o servidor web de demonstração na inicialização. Em seguida, use este modelo de instância 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 inicialize o servidor web de demonstração.

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

      Vá para Criar modelo de instância

    2. Defina o nome como webserver-template .

    3. Na seção Localização , 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. Expanda a seção Opções avançadas para revelar configurações avançadas. Várias subseções aparecem.

    7. Na seção Gerenciamento , encontre 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 Web como um grupo de instâncias gerenciadas.

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

      Vá para Criar grupo de instâncias

    2. Defina o nome como webserver-group .

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

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

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

    6. Na seção Autoscaling , para Autoscaling mode , selecione Off: do not autoscale .

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

    8. Na seção Recuperação automática , faça o seguinte:

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

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

    10. Clique em Criar .

  3. Crie uma regra de firewall que permita solicitações HTTP aos servidores web.

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

      Vá para Criar regra de firewall

    2. Para Nome , insira default-allow-http .

    3. Para Rede , selecione default .

    4. Para Destinos , selecione Specified target tags .

    5. Para Tags de destino , insira http-server .

    6. Em Filtro de origem , selecione IPv4 ranges .

    7. Para Intervalos IPv4 de origem , insira 0.0.0.0/0 para permitir acesso a todos os endereços IP.

    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 inicie o servidor 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. Crie 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 aos servidores 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 suas VMs.

Simule falhas na verificação de integridade

Para simular falhas na verificação de funcionamento, o servidor web de demonstração fornece maneiras de forçar uma falha na verificação de funcionamento.

Console

  1. Navegue até uma VM do servidor web.

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

      Acesse as instâncias de VM

    2. Para qualquer VM webserver-group , na coluna IP externo , clique no endereço IP. Uma nova guia é aberta em seu navegador. Se a solicitação expirar ou a página da web não estiver disponível, aguarde um minuto para que o servidor conclua a configuração e tente novamente.

    O servidor web de demonstração exibe uma página semelhante a esta:

    Página de demonstração mostrando botões de status verdes e botões de ação azuis.

  2. Na página de demonstração, clique em Tornar não saudável .

    Isso faz com que o servidor web falhe na verificação de integridade. Especificamente, o servidor web faz com que o caminho /health retorne um HTTP 500 (Internal Server Error) . Você pode verificar isso clicando rapidamente no botão Verificar integridade (isso para de funcionar depois que o autohealer começa a reiniciar a VM).

  3. Aguarde até que o autohealer entre em ação.

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

      Acesse as instâncias de VM

    2. Aguarde a alteração do status da VM do servidor web. A marca de seleção verde ao lado do nome da VM deve mudar para um quadrado cinza, indicando que o autohealer começou a reinicializar a VM não íntegra.

    3. Clique em Atualizar na parte superior da página periodicamente para obter o status mais recente.

    4. O processo de recuperação automática é concluído quando o quadrado cinza volta a ser uma marca de seleção verde, indicando que a VM está íntegra novamente.

gcloud

  1. Monitore o status do grupo de instâncias gerenciadas. (Quando terminar, pare pressionando Ctrl+C .)

    while : ; do
      gcloud compute instance-groups managed list-instances webserver-group \
      --zone europe-west1-b
      sleep 5  # Wait for 5 seconds
    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 do grupo devem mostrar STATUS: RUNNING e ACTION: NONE . Caso contrário, aguarde alguns minutos para que as VMs concluam a configuração e tente novamente.

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

  3. Obtenha o endereço de uma VM do servidor web.

    gcloud compute instances list --filter webserver-group
    

    Na coluna EXTERNAL_IP , copie o endereço IP de qualquer VM do servidor web e salve-o como uma variável bash local.

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

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

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

  5. Torne o servidor web insalubre.

    curl $IP_ADDRESS/makeUnhealthy > /dev/null
    

    Isso faz com que o servidor web falhe na verificação de integridade. Especificamente, o servidor web faz com que o caminho /health retorne um HTTP 500 INTERNAL SERVER ERROR . Você pode verificar isso fazendo uma solicitação rápida para /health (isso para de funcionar depois que o autohealer começa a reiniciar a VM).

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

    1. Quando o processo de recuperação automática for iniciado, as colunas STATUS e ACTION serão atualizadas, indicando que a recuperação automática começou a reinicializar a VM não íntegra.

        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 foi concluído quando a VM relata novamente um STATUS de RUNNING e uma 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 de instâncias gerenciadas, pare pressionando Ctrl+C .

Sinta-se à vontade para repetir este exercício. Aqui estão algumas ideias:

  • O que acontece se você tornar todas as VMs não íntegras ao mesmo tempo? Para obter mais informações sobre o comportamento de recuperação automática durante falhas simultâneas, consulte comportamento de recuperação automática .

  • Você pode atualizar a configuração da verificação de integridade para curar as VMs o mais rápido possível? (Na prática, você deve definir os parâmetros de verificação de integridade para usar valores conservadores, conforme explicado neste tutorial. Caso contrário, você poderá correr o risco de as VMs serem excluídas e reiniciadas por engano quando não houver nenhum problema real.)

  • O grupo de instâncias gerenciadas tem uma configuração initial delay . Você pode determinar o atraso mínimo necessário para este servidor web de demonstração? (Na prática, você deve definir o atraso para um pouco mais longo (10% a 20%) do que o necessário para uma VM inicializar e começar a atender solicitações de aplicativos. Caso contrário, você corre o risco de a VM ficar presa em um loop de inicialização de recuperação automática.)

Ver histórico do autohealer (opcional)

Para visualizar um histórico de operações do autohealer, use o seguinte comando gcloud :

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

Para obter mais informações, consulte visualizar operações históricas de recuperação automática

Limpar

Depois de concluir o tutorial, você poderá limpar os recursos criados para que eles parem de usar a cota e de incorrer em cobranças. As seções a seguir descrevem como excluir ou desativar esses recursos.

Se você criou um projeto separado para este tutorial, exclua o projeto inteiro. Caso contrário, se o projeto tiver recursos que você deseja manter, exclua apenas os recursos específicos criados neste tutorial.

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

Excluindo recursos específicos

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

Excluindo 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

Excluindo o modelo de instância

console

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

    Vá para modelos de instância

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

  3. Clique em Excluir na parte superior da página. Na nova janela, clique em Excluir para confirmar a exclusão.

gcloud

gcloud compute instance-templates delete webserver-template -q \
    --region=europe-west1

Excluindo a verificação de integridade

console

  1. No console do Google Cloud, acesse a página Verificações de integridade .

    Vá para exames de saúde

  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 exclusão.

gcloud

gcloud compute health-checks delete autohealer-check -q \
    --region=europe-west1

Excluindo as regras de firewall

console

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

    Vá para as regras do Firewall

  2. Clique nas caixas de seleção ao lado das regras de firewall denominadas 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 exclusão.

gcloud

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

O que vem a seguir