Receber avisos de migração em tempo real


O servidor de metadados fornece informações sobre as opções e configurações de programação de uma instância de máquina virtual (VM) usando a listagem do diretório de metadados scheduling/ e dos metadados maintenance-event. Use essas chaves de metadados para saber mais sobre as opções de programação de uma VM, bem como para receber uma notificação quando um evento de manutenção estiver prestes a acontecer.

Por padrão, todas as VMs (exceto a Z3 (Prévia)) são definidas como migração em tempo real e o servidor de metadados recebe notificações de eventos de manutenção antes que uma instância de VM seja migrada em tempo real. No entanto, se você escolher uma opção de programação diferente, os eventos de manutenção e o comportamento da VM também poderão ser diferentes. Para saber mais sobre eventos de manutenção e comportamento da VM durante os eventos, consulte Visão geral da manutenção do host.

Antes de começar

  • Para VMs do Windows Server, use o PowerShell 3.0 ou posterior. Recomendamos que você use ctrl+v para colar os blocos de código copiados.
  • 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.

    Para usar as amostras de Python nesta página de um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure o Application Default Credentials com as credenciais de usuário.

    1. Instale a CLI do Google Cloud.
    2. Para inicializar a CLI gcloud, execute o seguinte comando:

      gcloud init
    3. Crie as credenciais de autenticação para sua Conta do Google:

      gcloud auth application-default login

    Veja mais informações em: Configurar a autenticação para um ambiente de desenvolvimento local.

Receber avisos de migração em tempo real

É possível saber quando ocorrerá um evento de manutenção consultando a chave de metadados maintenance-event periodicamente.

A chave de metadados maintenance-event será preenchida para eventos de manutenção somente se você tiver definido a opção de programação da VM como migrate ou se a VM tiver uma GPU anexada.

O valor dessa chave de metadados muda 60 segundos antes do início do evento de manutenção. Assim, o código do aplicativo consegue acionar qualquer tarefa que você queira executar antes de um evento de manutenção, como fazer backup de dados ou atualizar registros.

Em resumo, o Compute Engine dá um aviso de 60 segundos somente nestas circunstâncias:

  • As opções de disponibilidade da instância foram definidas como migração em tempo real durante um evento de manutenção.

  • Você consultou a chave de metadados maintenance-event pelo menos uma vez desde o último evento de manutenção.

    • Se você nunca consultou a chave de metadados maintenance-event ou não fez essa consulta desde a última migração, o Compute Engine pressupõe que a VM não exige aviso prévio para eventos de manutenção. O evento de manutenção é iniciado imediatamente e ignora o aviso de 60 segundos.

    • Se você não quiser ignorar o aviso de 60 segundos, verifique se o código de cliente está consultando a chave de metadados maintenance-event pelo menos uma vez entre os eventos de migração. Consulte a chave de metadados maintenance-event diretamente para o Compute Engine determinar que você está assistindo a essa chave de metadados. Consultar metadados de nível superior não aciona o aviso antecipado.

Para VMs com GPUs anexadas, o valor muda 60 minutos antes de as VMs serem interrompidas. Assim, você tem tempo de encerrar e reiniciar em outro host. As VMs com GPUs anexadas não são migradas em tempo real, mas são interrompidas e reiniciadas opcionalmente. Saiba mais em Como lidar com eventos de manutenção do host da GPU.

Para um conjunto específico de VMs, as opções de manutenção de VMs são mais flexíveis. Para saber mais, consulte Monitorar e planejar um evento de manutenção do host.

Consultar a chave de metadados do evento de manutenção

VMs do Linux

Para consultar a chave de metadados maintenance-event nas VMs do Linux, execute o seguinte comando:

user@myinst:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event -H "Metadata-Flavor: Google"

A saída será assim:

NONE

VM do Windows

Para consultar a chave de metadados maintenance-event nas VMs do Windows, execute o seguinte comando:

PS C:\> 
$value = (Invoke-RestMethod `
         -Headers @{'Metadata-Flavor' = 'Google'} `
         -Uri "http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event")
$value

A saída será assim:

NONE

Python

Use a chave de metadados maintenance-event com o recurso aguardando atualizações para notificar os scripts e aplicativos quando um evento de manutenção estiver prestes a começar e terminar. Assim, é possível automatizar qualquer ação que você queira executar antes ou depois do evento.

Veja na amostra em Python a seguir como implementar esses dois recursos conjuntamente.


import time
from typing import Callable, NoReturn, Optional

import requests

METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}

def wait_for_maintenance(callback: Callable[[Optional[str]], None]) -> NoReturn:
    """
    Start an infinite loop waiting for maintenance signal.

    Args:
        callback: Function to be called when a maintenance is scheduled.

    Returns:
        Never returns, unless there's an error.
    """
    url = METADATA_URL + "instance/maintenance-event"
    last_maintenance_event = None
    last_etag = "0"

    while True:
        r = requests.get(
            url,
            params={"last_etag": last_etag, "wait_for_change": True},
            headers=METADATA_HEADERS,
        )

        # During maintenance the service can return a 503, so these should
        # be retried.
        if r.status_code == 503:
            time.sleep(1)
            continue
        r.raise_for_status()

        last_etag = r.headers["etag"]

        if r.text == "NONE":
            maintenance_event = None
        else:
            maintenance_event = r.text

        if maintenance_event != last_maintenance_event:
            last_maintenance_event = maintenance_event
            callback(maintenance_event)

def maintenance_callback(event: Optional[str]) -> None:
    """
    Example callback function to handle the maintenance event.

    Args:
        event: details about scheduled maintenance.
    """
    if event:
        print(f"Undergoing host maintenance: {event}")
    else:
        print("Finished host maintenance")

def main():
    wait_for_maintenance(maintenance_callback)

if __name__ == "__main__":
    main()

Analisar os resultados

O valor inicial e o padrão da chave de metadados maintenance-event é NONE.

  • Para VMs com GPUs anexadas, durante um evento de manutenção, o valor muda de NONE para TERMINATE_ON_HOST_MAINTENANCE. Esse atributo é atualizado 60 minutos antes do início do evento de interrupção.

  • Para VMs que não são de GPU, mas têm uma opção de programação de migrate, o valor de maintenance-event muda da seguinte maneira:

    1. No início do evento de migração, o valor muda de NONE para MIGRATE_ON_HOST_MAINTENANCE. Esse valor é atualizado 60 segundos antes do início do evento de interrupção.
    2. Durante o evento e enquanto a instância de VM está sendo migrada, o valor permanece como MIGRATE_ON_HOST_MAINTENANCE.
    3. Após o término do evento de manutenção, o valor volta a ser NONE.
  • Para VMs de locatário individual, durante um evento de manutenção do host, o valor da chave de metadados maintenance-event não muda e permanece NONE do início ao final do evento.

A seguir