Replicar volumes de forma assíncrona

Nesta página, descrevemos como configurar e realizar a replicação assíncrona de volumes de armazenamento em blocos do Google Distributed Cloud (GDC) com isolamento físico.

A replicação assíncrona é usada para replicar dados de uma zona do GDC para outra. Os dados replicados podem ser usados para failover se os dados da zona de origem ficarem indisponíveis. Depois que um failover é criado, o volume original não pode ser replicado para o mesmo volume de destino. Em vez disso, é preciso criar uma nova relação de replicação.

Para administradores de plataforma que gerenciam PVCs usando a API KRM, consulte Replicar volumes de forma assíncrona para administradores de plataforma.

Antes de começar

Para usar a replicação de blocos assíncrona, o operador de infraestrutura (IO) precisa configurar duas zonas para a replicação assíncrona.

Em seguida, verifique se você tem o papel app-volume-replication-admin-global para administrar o recurso VolumeReplicationRelationship. Nos casos em que a API global não está disponível, o papel volume-replication-admin pode ser usado para modificar diretamente o recurso VolumeReplicationRelationshipReplica zonal.

Configurar a replicação

O recurso personalizado (CR) VolumeReplicationRelationship atende à API de replicação de blocos assíncrona. Esse CR existe na API Management global. Para ativar a replicação de um determinado dispositivo de transferência por blocos, é necessário criar uma CR VolumeReplicationRelationship na API de gerenciamento global:

API Replicate PVC

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: VRR_NAME
  namespace: PROJECT
spec:
  source:
    pvc:
      clusterRef: SOURCE_USER_CLUSTER_NAME
      pvcRef: PVC_NAME
    zoneRef: SOURCE_ZONE_NAME
  destination:
    pvc:
      clusterRef: DESTINATION_USER_CLUSTER_NAME
    zoneRef: DESTINATION_ZONE_NAME
EOF

Substitua:

  • MANAGEMENT_API_SERVER: o caminho do kubeconfig do servidor de API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso Project.
  • SOURCE_USER_CLUSTER_NAME: o nome do recurso de cluster de usuário de origem a ser conectado.
  • PVC_NAME: o nome do recurso PersistentVolumeClaim.
  • SOURCE_ZONE_NAME: o nome do recurso de zona de origem.
  • DESTINATION_USER_CLUSTER_NAME: o nome do recurso de cluster de usuário de destino a ser conectado.
  • DESTINATION_ZONE_NAME: o nome do recurso de zona de destino.

Neste exemplo, presumimos que um projeto chamado PROJECT foi criado em uma organização chamada my-org e que um PVC chamado PVC_NAME já foi provisionado. SOURCE_USER_CLUSTER_NAME é o nome do cluster de origem em que o PVC existe, e DESTINATION_USER_CLUSTER_NAME é o nome do cluster de destino em que um novo PVC vai existir.

Os campos source e destination da especificação indicam de onde e para onde os dados estão sendo replicados, respectivamente. Neste exemplo, os dados são replicados de SOURCE_ZONE_NAME para DESTINATION_ZONE_NAME.

Replicar discos de máquina virtual

O VolumeReplicationRelationship também atende à API de replicação assíncrona de disco de máquina virtual (disco de VM). O disco de origem que está sendo replicado é chamado de disco principal. O disco de destino que está sendo replicado é chamado de disco secundário. Iniciar a replicação assíncrona em um disco principal cria automaticamente o disco secundário.

Solicitar permissões e acesso

Para replicar discos de máquina virtual, você precisa ter o papel de administrador de máquina virtual do projeto. Siga as etapas para verificar se você tem o papel de administrador de VirtualMachine do projeto (project-vm-admin) no namespace do projeto em que o disco da VM está.

Para operações de máquina virtual usando a CLI gdcloud, peça ao administrador do projeto do IAM para atribuir a você os papéis de administrador de máquina virtual do projeto e de leitor do projeto (project-viewer).

gdcloud

gdcloud compute disks start-async-replication PRIMARY_DISK_NAME \
  --project PROJECT --zone PRIMARY_ZONE \
  --secondary-disk SECONDARY_DISK_NAME --secondary-zone SECONDARY_ZONE

Substitua:

VariávelDefinição
PRIMARY_DISK_NAME O nome do disco de origem que está sendo replicado.
PROJECT O projeto do GDC do disco principal.
PRIMARY_ZONE A zona em que o disco principal reside.
SECONDARY_DISK_NAME O nome do disco de destino para replicação.
SECONDARY_ZONE A zona em que o disco secundário precisa residir.

API VM Disk

Iniciar replicação assíncrona

Inicie a replicação assíncrona em um disco de VM usando kubectl.

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: VRR_NAME
  namespace: PROJECT
spec:
  destination:
    volumeOverrideName: VIRTUAL_MACHINE_DESTINATION_DISK_NAME
    zoneRef: DESTINATION_ZONE_NAME
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: VIRTUAL_MACHINE_SOURCE_DISK_NAME
    zoneRef: SOURCE_ZONE_NAME
EOF

Substitua:

  • MANAGEMENT_API_SERVER: o caminho do kubeconfig do servidor de API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso Project.
  • VIRTUAL_MACHINE_DESTINATION_DISK_NAME: o nome do recurso VirtualMachineDisk no destino.
  • DESTINATION_ZONE_NAME: o nome do recurso de zona de destino.
  • VIRTUAL_MACHINE_SOURCE_DISK_NAME: o nome do recurso VirtualMachineDisk na origem.
  • SOURCE_ZONE_NAME: o nome do recurso de zona de origem.

Neste exemplo, presumimos que um projeto chamado PROJECT foi criado em uma organização chamada my-org e que um VirtualMachineDisk chamado VIRTUAL_MACHINE_SOURCE_DISK_NAME já foi provisionado para o recurso VirtualMachine.

Os campos source e destination da especificação indicam de onde e para onde os dados estão sendo replicados, respectivamente. Neste exemplo, os dados são replicados de SOURCE_ZONE_NAME para DESTINATION_ZONE_NAME.

Verificação

Verifique o status da relação de replicação recuperando o CR VolumeReplicationRelationship da API global. Confira o exemplo a seguir. A saída foi truncada para simplificação:

kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \
        -n PROJECT -o yaml

O resultado será o seguinte:

API PVC

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-pvc-repl
  namespace: my-project
spec:
  destination:
    pvc:
      clusterRef: my-pvc-cluster
    zoneRef: zone2
  source:
    pvc:
      clusterRef: my-pvc-cluster
      pvcRef: my-block-pvc
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been established. Please check the destination
        zone for relationship state
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Established
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been successfully established
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Idle

API VM Disk

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vmdisk-vrr
  namespace: my-project
spec:
  destination:
    zoneRef: zone2
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: my-vmdisk
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been established. Please check the destination
        zone for relationship state
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Established
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been successfully established
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Idle

Criar failover

Se a zona de origem estiver indisponível por qualquer motivo, um CR VolumeFailover poderá ser criado no plano de gerenciamento da organização da zona de destino. Para uma organização v2, esse seria o servidor da API de gerenciamento. Para uma organização v1, esse seria o cluster de administrador da organização. Por exemplo, se um VolumeReplicationRelationship foi criado especificando zone2 como a zona de destino e um PVC ou VirtualMachineDisk existe na organização my-org, o CR VolumeFailover é criado no plano de gerenciamento my-org em zone2. Isso interrompe a relação de replicação entre as duas zonas e permite que uma carga de trabalho monte o PVC ou VirtualMachineDisk na zona de destino:

  kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
  apiVersion: storage.gdc.goog/v1
  kind: VolumeFailover
  metadata:
    name: FAILOVER_NAME
    namespace: PROJECT
  spec:
    volumeReplicationRelationshipRef: VRR_NAME
  EOF

Substitua:

  • FAILOVER_NAME: o nome do recurso VolumeFailover.
  • MANAGEMENT_API_SERVER: o caminho do kubeconfig do servidor de API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso Project.

Depois, um failover bem-sucedido é refletido no status da CR:

  kubectl --kubeconfig MANAGEMENT_API_SERVER get volumefailover FAILOVER_NAME \
          -n PROJECT -o yaml
  • O resultado será o seguinte:

    apiVersion: storage.gdc.goog/v1
    kind: VolumeFailover
    metadata:
      name: my-failover
      namespace: my-project
    spec:
      volumeReplicationRelationshipRef: my-vrr-repl
    status:
        state: Completed
    
  • Depois que o failover é criado, o my-vrr-repl VolumeReplicationRelationship passa para um estado Broken Off. O PVC ou VirtualMachineDisk em zone2 agora pode ser montado.

  • Neste ponto, o VolumeReplicationRelationship será semelhante ao exemplo a seguir. Novamente, essa saída foi truncada para simplificação:

    kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \
            -n PROJECT -o yaml
    
  • O resultado será o seguinte:

API PVC

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vrr-repl
  namespace: my-project
spec:
  destination:
    pvc:
      clusterRef: my-pvc-cluster
    zoneRef: zone2
  source:
    pvc:
      clusterRef: my-pvc-cluster
      pvcRef: my-block-pvc
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off

API VM Disk

apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
  name: my-vmdisk-vrr
  namespace: my-project
spec:
  destination:
    zoneRef: zone2
  source:
    virtualMachineDisk:
      virtualMachineDiskRef: my-vmdisk
    zoneRef: zone1
status:
  zones:
  - name: zone1
    replicaStatus:
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  - name: zone2
    replicaStatus:
      exportedSnapshotName: snapmirror.c34f8845-e8c0-11ef-ad24-00a0b89f23fb_2150007868.2025-02-21_150000
      message: SnapMirror relationship has been broken off
      replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
      state: Broken Off
  • Agora você pode excluir o VolumeReplicationRelationship com segurança, porque essa é a única ação restante que pode ser feita nessa CR.

    kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationship VRR_NAME \
            -n PROJECT
    

Redimensionar volumes

Se, em algum momento, o volume de origem for redimensionado, você também precisará redimensionar o volume correspondente na zona de destino para que eles sejam iguais. O volume da zona de destino é criado quando você cria o VolumeReplicationRelationship.

Consulte a documentação Expandir discos de VM ou Expandir capacidade de volume para redimensionar o armazenamento nas zonas de origem e de destino.

Listar relações de replicação assíncrona

Liste as relações de replicação assíncrona em um projeto usando kubectl.

kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationships -n PROJECT

Substitua:

  • PROJECT: o projeto do GDC do disco principal.
  • MANAGEMENT_API_SERVER: o arquivo kubeconfig do servidor de API de gerenciamento zonal.

A saída será assim:

NAME       AGE     SOURCE ZONE   SOURCE PVC   SOURCE PVC CLUSTER   SOURCE VM DISK      DEST. ZONE   DEST. PVC CLUSTER   DEST. VOLUME OVERRIDE     STATE
my-vrr     3m21s   zone1                                           my-vm-boot-disk     zone2                            my-vm-boot-disk-replica
test-vrr   7s      zone1                                           test-vm-boot-disk   zone2

Interromper a replicação assíncrona

Interrompa a replicação assíncrona em um disco de VM principal usando gdcloud ou kubectl.

gdcloud

gdcloud compute disks stop-async-replication PRIMARY_DISK_NAME \
  --project PROJECT --zone PRIMARY_ZONE

Substitua:

VariávelDefinição
PRIMARY_DISK_NAME O nome do disco de origem que está sendo replicado.
PROJECT O projeto do GDC do disco principal.
PRIMARY_ZONE A zona em que o disco principal reside.

API

  1. Encontre as relações de replicação de volume correspondentes ao disco da VM principal.

    kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationships \
      -n PROJECT -o json | \
      jq -r '.items[] | select(.spec.source.virtualMachineDisk.virtualMachineDiskRef == "PRIMARY_DISK_NAME"
      and .spec.source.zoneRef == "PRIMARY_ZONE") | .metadata.name'
    
  2. Exclua cada uma das relações de replicação de volume listadas na etapa anterior. Substitua VRR_NAMES pelos nomes das relações de replicação de volume.

    kubectl --kubeconfig MANAGEMENT_API_SERVER delete volumereplicationrelationships \
      -n PROJECT VRR_NAMES
    

    Substitua:

    VariávelDefinição
    MANAGEMENT_API_SERVER O arquivo kubeconfig do servidor de API de gerenciamento global.
    PROJECT O projeto do GDC do disco principal.
    PRIMARY_DISK_NAME O nome do disco de origem que está sendo replicado.
    PRIMARY_ZONE A zona em que o disco principal reside.

Se a zona de origem estiver indisponível por qualquer motivo, crie um failover de volume para interromper a replicação.

Anexar o disco replicado a uma VM

Enquanto a replicação estiver ativada, o disco secundário não poderá ser anexado a uma VM. Depois que a replicação for interrompida, será possível anexar o disco secundário a uma VM recém-criada ou a uma VM atual.