Como criar um snapshot de disco permanente consistente de aplicativo do Linux

Crie snapshots consistentes de aplicativos de discos permanentes anexados a instâncias de máquina virtual (VM) do Linux. Em geral, a qualidade do snapshot do disco permanente 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 permanente, limpe 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 permanentes, 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. definir as configurações do snapshot 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

Restriçõ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, nenhum snapshot é criado no caso de um erro de script ou tempo limite.
  • Só é possível criar snapshots consistentes de discos permanentes de aplicativos anexados a determinadas imagens públicas ou personalizadas do Linux. As imagens a seguir são compatíveis:
    • CentOS 7
    • CentOS 8
    • Debian 9 Stretch
    • Debian 10 Buster
    • RHEL 7
    • RHEL 8
    • SLES 12
    • SLES 15
    • Ubuntu 18.04
    • Ubuntu 20.04

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 permanente.
  • Esvaziar os buffers do disco. Por exemplo, o MySQL tem uma instrução FLUSH. 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 simples. Observe os caracteres iniciais #!. A execução de fsfreeze -f bloqueia qualquer processo em execução que tente acessar o sistema de arquivos. Portanto, use isso com cuidado se seu aplicativo for sensível à latência.

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

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

#!/bin/bash
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 para os scripts de snapshot pré e pós é uma lista de discos que estão sendo instantâneos. É 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 na solicitação de snapshot, será possível verificar qual disco 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 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:

    /etc/default/instance_configs.cfg
    
  2. Adicione a seguinte seção ao arquivo de configuração:

    [Snapshots]
    enabled = enabled
    timeout_in_seconds = timeout
    

    Substitua os valores de acordo com as descrições abaixo:

    Chave Valor Padrão Descrição
    enabled true ou false false Se o recurso de snapshot consistente do aplicativo está ativado.
    timeout_in_seconds Inteiro [0, 300] 60 Número de segundos que o script pré ou pós-snapshot pode levar para concluir a execução antes de um erro de tempo limite. Observe que o número de segundos que toda a operação de snapshot pode levar para ser concluída antes de um erro de tempo limite é de 300 segundos por disco. Isso não é configurável.
  3. Salve as configurações:

    sudo systemctl restart google-guest-agent.service
    

Criar um snapshot com guest-flush ativado

Usando o Console do Google Cloud, a ferramenta de linha de comando gcloud ou a API Compute Engine, 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 novo snapshot.
  2. Digite um Nome para o snapshot.
  3. Como opção, digite uma Descrição para o snapshot.
  4. Em Disco de origem, selecione um disco atual a partir do qual você quer criar um snapshot.
  5. Selecione um local de armazenamento.
  6. Marque a opção Ativar snapshot consistente do aplicativo.
  7. Clique em Criar.

gcloud

Execute o comando

gcloud compute disks snapshot DISK_NAME [DISK_NAME ...] --guest-flush

Substitua:

  • DISK_NAME é o nome de um ou mais discos permanentes com que você quer criar snapshots.

A ferramenta de linha de comando gcloud aguarda até que um status READY ou FAILED seja retornado ou retorna os últimos detalhes conhecidos do snapshot após o tempo limite máximo ter se esgotado.

API

Faça uma solicitação POST ao método disks.createSnapshot com a opção guestFlush ativada:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME/createSnapshot?guestFlush=true

Substitua:

  • PROJECT_ID: o ID do projeto.
  • ZONE: a zona em que a VM e o disco estão localizados;
  • DISK_NAME: o nome do disco permanente a partir do qual você quer criar um snapshot.

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

Use snapshots programados para fazer backup regular e automático dos discos permanentes zonais e regionais. 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 definir minhas configurações e criar scripts personalizados, o comando a seguir cria snapshots consistentes de aplicativos 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 Como criar snapshots agendados de discos permanentes.

Solução de problemas

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

    1. No Console do Cloud, acesse a página Logging do Pacote de operações do Google Cloud  > Registros:
      Acesse a página do Visualizador de registros
    2. Navegue até Visualizador 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 a caixa de texto de filtro pelo texto a seguir:

    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 permanente 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 permanente, consulte Como criar uma VM.

A seguir