Replicar volumes de forma assíncrona

Esta página mostra como configurar e realizar a replicação assíncrona de volumes de armazenamento em blocos isolados do Google Distributed Cloud (GDC).

A replicação assíncrona é usada para replicar dados de uma zona do GDC para outra. Esses dados replicados podem ser usados em um cenário de failover caso os dados na zona de origem não estejam disponíveis. Note que, depois que um failover é criado, o volume original não pode ser configurado para replicação no mesmo volume de destino. Em vez disso, uma nova relação de replicação precisa ser criada.

Para operadores de aplicativos que preferem usar a gdcloud CLI, consulte Replicar volumes de forma assíncrona.

Antes de começar

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

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

Configurar a replicação

O recurso personalizado (CR, na sigla em inglês) VolumeReplicationRelationship atende à API de replicação de blocos assíncrona. Esse CR existe na API de gerenciamento global. Para ativar a replicação de um determinado dispositivo de transferência por blocos, um CR VolumeReplicationRelationship precisa ser criado na API de gerenciamento global:

API PVC

A vinculação de projetos é obrigatória. Verifique se você anexou seu projeto a cada recurso de cluster em cada zona participante.

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 kubeconfig do servidor da API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso do projeto.
  • 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.

Este exemplo pressupõe que um projeto chamado PROJECT seja criado em uma organização chamada my-org e que um PVC chamado PVC_NAME já tenha sido provisionado. O SOURCE_USER_CLUSTER_NAME é o nome do cluster de origem em que o PVC existe, e o 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.

API de disco da VM

Replicar discos de máquina virtual

VolumeReplicationRelationship também atende à API de replicação de disco de máquina virtual (disco da VM) assíncrona. 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. A replicação assíncrona em um disco principal cria automaticamente o disco secundário.

Solicitar permissões e acesso

Para replicar discos de VM, 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 máquina virtual do projeto (project-vm-admin) no namespace do projeto em que o disco da VM reside.

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

Iniciar a replicação assíncrona

Inicie a replicação assíncrona em um disco da 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 kubeconfig do servidor da API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso do projeto.
  • SOURCE_ZONE_NAME: o nome do recurso de zona de origem.
  • DESTINATION_ZONE_NAME: o nome do recurso de zona de destino.
  • VIRTUAL_MACHINE_SOURCE_DISK_NAME: o nome do recurso VirtualMachineDisk na origem.
  • VIRTUAL_MACHINE_DESTINATION_DISK_NAME: o nome do recurso VirtualMachineDisk no destino.

Este exemplo pressupõe que um projeto chamado PROJECT seja criado em uma organização chamada my-org e que um VirtualMachineDisk chamado VIRTUAL_MACHINE_SOURCE_DISK_NAME já tenha sido 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. Consulte o exemplo a seguir. Observação: A saída foi truncada para simplificação:

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

O resultado será assim:

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 de disco da VM

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

Caso a zona de origem não esteja disponí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 existir na organização my-org, o CR VolumeFailover será criado no plano de gerenciamento my-org em zone2. Isso interrompe a relação de replicação entre as duas zonas e permite que o PVC ou VirtualMachineDisk na zona de destino seja montado por uma carga de trabalho:

  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 kubeconfig do servidor da API zonal.
  • VRR_NAME: o nome do recurso VolumeReplicationRelationship.
  • PROJECT: o namespace do recurso do projeto.

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

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

    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 VolumeReplicationRelationship my-vrr-repl faz a transição para um estado Broken Off. O PVC ou VirtualMachineDisk em zone2 agora pode ser montado.

  • Nesse 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á assim:

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 de disco da VM

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, é seguro excluir o VolumeReplicationRelationship, já que essa é a única ação restante que pode ser feita nesse CR.

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

Redimensionar volumes

Se o volume de origem for redimensionado a qualquer momento, o volume correspondente na zona de destino, que é criado em nome do usuário quando um VolumeReplicationRelationship é criado, também precisará ser redimensionado para corresponder.

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