Criar snapshots de disco consistentes do aplicativo Linux


Crie snapshots consistentes de aplicativos de discos anexados a instâncias de máquina virtual (VM) do Linux. Em geral, a qualidade do snapshot do disco depende do modo como os aplicativos podem se recuperar dos snapshots que você cria durante intensas cargas de trabalho de gravação. Os snapshots consistentes do aplicativo capturam o estado dos dados do aplicativo no momento do backup, com todas as transações do aplicativo concluídas e todas as gravações pendentes liberadas para o disco.

Para criar snapshots consistentes com o aplicativo, pausar apps ou processos do sistema operacional que gravam dados no disco, transferir os buffers do disco e sincronize o sistema de arquivos antes de criar o snapshot. Dependendo do aplicativo, essas e outras etapas podem ser necessárias para garantir que todas as transações do aplicativo sejam concluídas e capturadas no backup.

Para criar um snapshot consistente do aplicativo dos seus discos, use o seguinte processo:

  1. Para preparar o ambiente de convidado para a consistência do aplicativo, crie scripts de shell personalizados para serem executados antes e depois da captura do snapshot
  2. Defina as configurações de snapshots na instância de máquina virtual (VM).
  3. Crie um snapshot com a opção guest-flush ativada. A opção guest-flush inicia seus scripts de snapshot pré e pós.

Antes de começar

  • Crie uma VM do Linux.
  • Atualize o ambiente de convidado.
  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine da seguinte maneira.

    Selecione a guia para como planeja usar as amostras nesta página:

    Console

    Quando você usa o console do Google Cloud para acessar os serviços e as APIs do Google Cloud, não é necessário configurar a autenticação.

    gcloud

    1. Instale a Google Cloud CLI e inicialize-a executando o seguinte comando:

      gcloud init
    2. Defina uma região e uma zona padrão.

    REST

    Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para a CLI gcloud.

      Instale a Google Cloud CLI e inicialize-a executando o seguinte comando:

      gcloud init

Papéis e permissões necessárias

Para receber as permissões necessárias para gerenciar snapshots padrão, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esses papéis predefinidos contêm as permissões necessárias para gerenciar snapshots padrão. Para conferir as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para gerenciar snapshots padrão:

  • Para criar um snapshot de um disco zonal:
    • compute.snapshots.create no projeto
    • compute.disks.createSnapshot no disco
  • Para criar um snapshot de um disco regional usando os dados dele:
    • compute.snapshots.create no projeto
    • compute.instances.useReadOnly na VM de origem
    • compute.disks.createSnapshot no disco
  • Para criar um snapshot de um disco regional usando um checkpoint de recuperação de réplica:
    • compute.snapshots.create no projeto
    • compute.disks.createSnapshot no disco
  • Para criar uma programação de snapshot: compute.resourcePolicies.create no projeto ou na organização
  • Para anexar uma programação de snapshot a um disco:
    • compute.disks.addResourcePolicies no disco
    • compute.resourcePolicies.use na política de recursos
  • Para excluir um snapshot:
    • compute.snapshots.delete no snapshot
    • compute.snapshots.list no projeto

Essas permissões também podem ser concedidas com papéis personalizados ou outros papéis predefinidos.

Limitações

A criação de snapshots consistentes de aplicativos no Linux tem as seguintes limitações:

  • A consistência do aplicativo é garantida apenas pelo comportamento dos seus scripts de pré e pós-snapshot personalizados, e não pela própria operação do snapshot.
  • Ao usar a opção guest-flush na solicitação de criação de snapshot, o snapshot não será criado se o script retornar um erro ou atingir o tempo limite.

Criar scripts pré e pós snapshot

Antes de prosseguir, atualize o ambiente de convidado para que você esteja executando o software mais recente na sua VM do Linux.

Para facilitar a consistência do aplicativo, crie scripts de shell pré e pós para serem executados antes e depois da captura do snapshot. Use os scripts pré e pós para operações como:

  • Pause os apps ou processos do sistema operacional em execução na VM que grava dados no disco.
  • Esvaziar os buffers do disco. Por exemplo, o MySQL tem uma instrução FLUSH (em inglês). Use a ferramenta que estiver disponível para o aplicativo.
  • Sincronize seu sistema de arquivos.

O exemplo de código a seguir mostra um script pré-snapshot. Observe os caracteres iniciais #!.

#!/bin/bash
sudo fsfreeze -f [example-disk-location]

No exemplo de código a seguir, mostramos um script de snapshot de postagem. Observe os #! caracteres iniciais.

#!/bin/bash
sudo fsfreeze -u [example-disk-location]

Salve os scripts na VM no diretório /etc/google/snapshots/. O caminho completo do script de pré-lançamento precisa ser /etc/google/snapshots/pre.sh e o caminho completo do script de postagem precisa ser /etc/google/snapshots/post.sh.

Como referenciar discos específicos nos scripts

O primeiro argumento transmitido aos scripts pré e pós-snapshot é uma lista de discos para os quais você está criando snapshots. É possível usar esse argumento nos scripts para várias verificações. Por exemplo, se a VM tiver vários discos anexados, mas você tiver especificado apenas um disco na solicitação de snapshot, será possível verificar para qual disco o snapshot está sendo criado.

O argumento é formatado da seguinte forma:

  • Discos anexados por SCSI: uma lista separada por vírgulas de pares <target/lun>.
  • Discos anexados ao NVME: uma lista separada por vírgulas de pares <nvme:namespace>.

Por exemplo, seu disco de inicialização anexado a SCSI pode aparecer como 1/0, enquanto um outro disco anexado à VM pode aparecer como 2/0.

Editar o arquivo de configuração do ambiente de convidado

Defina as configurações de snapshot consistentes do aplicativo atualizando um arquivo de configuração específico na VM.

  1. Abra ou crie o arquivo de configuração do ambiente de convidado.

    edit /etc/default/instance_configs.cfg
    
  2. Adicione a seção a seguir ao arquivo de configuração, salve as alterações e saia do editor.

    [Snapshots]
    enabled = ENABLED
    timeout_in_seconds = TIMEOUT_SECONDS
    

    Substitua:

    • ENABLED: defina como true para ativar o recurso de snapshot consistente do aplicativo. O valor padrão é false.
    • TIMEOUT_SECONDS: o número de segundos que o script de antes ou pós-snapshot pode levar para concluir a execução antes de expirar. O valor inteiro precisa estar entre 0 e 300. O valor padrão é 60.

  3. Reinicie o agente convidado para usar as novas definições de configuração.

    $ sudo systemctl restart google-guest-agent.service
    

Criar um snapshot com guest-flush ativado

Usando o console do Google Cloud, a Google Cloud CLI ou REST, crie um snapshot com a opção guest-flush ativada. Isso começa a executar os scripts de snapshot anterior e posterior antes e depois da captura.

Console

  1. Acesse a página Criar um snapshot no console do Google Cloud.

    Acessar a página "Criar um snapshot"
  2. Digite um Nome de snapshot.
  3. Selecione um Tipo de snapshot. O snapshot padrão é STANDARD, que é a melhor opção para backup de longo prazo e recuperação de desastres.

    Escolha Snapshot do arquivo para uma retenção de dados mais econômica.

  4. Opcional: insira uma Descrição sobre o snapshot.
  5. Em Disco de origem, selecione o disco do qual você quer criar um snapshot.
  6. Na seção Local, escolha o local de armazenamento dos snapshots.

    O local padrão predefinido ou personalizado definido nas configurações de snapshot é selecionado automaticamente. Se preferir, modifique as configurações dos snapshots e os armazene em um local de armazenamento personalizado da seguinte forma:

    1. Escolha o tipo de local de armazenamento que você quer para os snapshots.

      • Escolha Multirregional para maior disponibilidade por um custo mais alto.
      • Escolha Snapshots regionais para ter mais controle sobre a localização física dos dados por um custo menor.
    2. No campo Selecionar local, escolha a região ou multirregião específica que você quer usar. Para usar a região ou multirregião mais próxima do disco de origem, selecione Com base no local do disco.
  7. Marque a opção Ativar snapshot consistente do aplicativo.
  8. Clique em Criar para criar o snapshot.

gcloud

Crie o snapshot na política de local de armazenamento definida pelas configurações do snapshot ou usando um local de armazenamento alternativo de sua escolha. Para mais informações, consulte Escolher o local de armazenamento dos snapshots.

  • Para criar um snapshot no local padrão predefinido ou personalizado definido nas configurações do snapshot, use o comando gcloud compute snapshots create.

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --guest-flush
    
  • Como alternativa, para substituir as configurações de snapshot e criar um snapshot em um local de armazenamento personalizado, inclua a flag --storage-location para indicar onde ele deve ser armazenado:

    gcloud compute snapshots create SNAPSHOT_NAME \
        --source-disk-zone=SOURCE_ZONE \
        --source-disk=SOURCE_DISK_NAME \
        --snapshot-type=SNAPSHOT_TYPE \
        --storage-location=STORAGE_LOCATION \
        --guest-flush
    

    Substitua:

    • SNAPSHOT_NAME: um nome para o snapshot.
    • SOURCE_ZONE: a zona do disco de origem.
    • SOURCE_DISK_NAME: o nome do volume de disco a partir do qual você quer criar um snapshot.
    • SNAPSHOT_TYPE: o tipo de snapshot, que é STANDARD ou ARCHIVE. Se um tipo de snapshot não for especificado, um snapshot STANDARD será criado.
    • STORAGE_LOCATION (opcional): a multirregião do Cloud Storage ou a região do Cloud Storage onde você quer armazenar o snapshot. É possível especificar apenas um local de armazenamento.

      Use o parâmetro --storage-location somente quando quiser substituir o local de armazenamento padrão predefinido ou personalizado que está definido nas configurações de snapshot.

REST

Crie o snapshot na política de local de armazenamento definida pelas configurações do snapshot ou usando um local de armazenamento alternativo de sua escolha. Para mais informações, consulte Escolher o local de armazenamento dos snapshots.

  • Para criar o snapshot no local padrão predefinido ou personalizado configurado nas configurações de snapshot, faça uma solicitação POST para o método snapshots.insert.

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "guestFlush": true,
    }
    
  • Como alternativa, para substituir as configurações de snapshot e criar um snapshot em um local de armazenamento personalizado, faça uma solicitação POST ao método snapshots.insert e inclua nela a propriedade storageLocations:

    POST https://compute.googleapis.com/compute/beta/projects/DESTINATION_PROJECT_ID/global/snapshots
    {
      "name": "SNAPSHOT_NAME",
      "sourceDisk": "projects/SOURCE_PROJECT_ID/zones/SOURCE_ZONE/disks/SOURCE_DISK_NAME",
      "snapshotType": "SNAPSHOT_TYPE",
      "storageLocations": [
          "STORAGE_LOCATION"
      ],
      "guestFlush": true,
    }
    

Substitua:

  • DESTINATION_PROJECT_ID: o ID do projeto em que você quer criar o snapshot.
  • SNAPSHOT_NAME: um nome para o snapshot.
  • SOURCE_PROJECT_ID: o ID do projeto de disco de origem.
  • SOURCE_ZONE: a zona do disco de origem.
  • SOURCE_DISK_NAME: o nome do volume de disco a partir do qual você quer criar um snapshot.
  • SNAPSHOT_TYPE: o tipo de snapshot, que é STANDARD ou ARCHIVE. Se um tipo de snapshot não for especificado, um snapshot STANDARD será criado.
  • STORAGE_LOCATION (opcional): a multirregião do Cloud Storage ou a região do Cloud Storage onde você quer armazenar o snapshot. É possível especificar apenas um local de armazenamento.

    Use o parâmetro storageLocations somente quando quiser substituir o local de armazenamento padrão predefinido ou personalizado que está definido nas configurações de snapshot.

Criar uma programação de snapshot com o guest-flush ativado

Use snapshots programados para fazer backup regular e automático do Persistent Disk zonal e regional e do Google Cloud Hyperdisk. Se quiser programar snapshots consistentes do aplicativo para o backup, use a opção --guest-flush ao criar a programação de snapshot para que os scripts pré e pós snapshot sejam executados antes e depois de cada snapshot programado.

Por exemplo, depois de configurar o arquivo de configuração do ambiente para convidado e criar scripts personalizados, o comando a seguir cria snapshots consistentes do aplicativo por hora:

gcloud compute resource-policies create snapshot-schedule SCHEDULE_NAME \
  --description "MY HOURLY SNAPSHOT SCHEDULE" \
  --start-time 22:00 \
  --hourly-schedule 4 \
  --guest-flush

Para saber mais, consulte Sobre programações de snapshots para discos.

Solução de problemas

Siga as etapas abaixo para resolver problemas no processo de criação de snapshots.

  • Revise os registros dos seus eventos de criação de snapshot:

    1. No console do Google Cloud, acesse a página Logging do Google Cloud Observability  > Registros:
      Acessar Análise de registros
    2. Acesse Explorador de registros na barra de navegação à esquerda.
    3. Na lista Filtrar por rótulo ou pesquisa de texto, selecione Converter para filtro avançado.

    Converter para filtro avançado.

    Substitua o campo de filtro pelo seguinte texto:

    resource.type="gce_disk"
    jsonPayload.event_subtype="compute.disks.createSnapshot"
    
  • Se nenhum script for encontrado, nenhum snapshot será criado Verifique se você seguiu as etapas em Criar scripts de snapshot pré e postar.

  • Se houver um erro de script ou tempo limite, nenhum snapshot será criado. Consulte Como se preparar para snapshots consistentes. O tempo limite máximo para você definir nas configurações é de 300 segundos. Repita todo o processo usando os scripts de amostra.

  • Um disco precisa ser anexado a uma VM para capturar um snapshot do disco com guest-flush ativado. Para saber como criar uma VM do Linux e anexar um disco, consulte Como criar uma VM.

A seguir