Nesta página, descrevemos 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. Os dados replicados podem ser usados para failover se os dados da zona de origem ficarem indisponíveis. Observação: 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 da plataforma que gerenciam PVCs usando a API KRM, 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) precisa primeiro configurar duas zonas para a replicação assíncrona.Em seguida, verifique se você tem a função app-volume-replication-admin-global para administrar o recurso VolumeReplicationRelationship. Nos casos em que a API global não está disponível, a função volume-replication-admin pode ser usada para modificar diretamente o recurso zonal "VolumeReplicationRelationshipReplica".
Configurar a replicação
O recurso personalizado (CR) VolumeReplicationRelationship atende à API de replicação de blocos assíncrona. Essa resposta automática existe na API global de gerenciamento. Para ativar a replicação de um determinado dispositivo de transferência por blocos, é necessário criar um 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 kubeconfig do servidor da 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. O SOURCE_USER_CLUSTER_NAME é o nome do cluster de origem em que a PVC existe, e DESTINATION_USER_CLUSTER_NAME é o nome do cluster de destino em que uma nova 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. Ao iniciar a replicação assíncrona em um disco principal, o disco secundário é criado automaticamente.
Solicitar permissões e acesso
Para replicar discos máquina virtual, você precisa ter o papel de administrador de máquinas virtuais 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 está localizado.
Para operações de máquina virtual 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).
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ável | Definiçã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 estar. |
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 kubeconfig do servidor da 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. Observe que 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
Caso a zona de origem esteja indisponível por qualquer motivo, um CR VolumeFailover poderá ser criado no plano de gerenciamento da organização na 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 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 uma carga de trabalho monte a 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 kubeconfig do servidor da API zonal.VRR_NAME: o nome do recurso VolumeReplicationRelationship.PROJECT: o namespace do recurso "Project".
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á o seguinte:
apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: my-failover namespace: my-project spec: volumeReplicationRelationshipRef: my-vrr-repl status: state: CompletedDepois que o failover é criado, o
my-vrr-replVolumeReplicationRelationshippassa para o estadoBroken Off. O PVC ou VirtualMachineDisk emzone2agora pode ser montado.Neste ponto, o
VolumeReplicationRelationshipserá semelhante ao exemplo a seguir. De novo, essa saída foi truncada para simplificação:kubectl --kubeconfig MANAGEMENT_API_SERVER get volumereplicationrelationship VRR_NAME \ -n PROJECT -o yamlO 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
VolumeReplicationRelationshipcom segurança, porque é 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, você também precisará redimensionar o volume correspondente na zona de destino para que eles fiquem iguais. O volume da zona de destino é criado quando você cria o VolumeReplicationRelationship.
Consulte a documentação Expandir discos da VM ou Expandir capacidade do volume para redimensionar o armazenamento nas zonas de origem e de destino.
Listar relacionamentos 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 da 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
Parar 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ável | Definiçã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
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'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_NAMESSubstitua:
Variável Definição MANAGEMENT_API_SERVERO arquivo kubeconfig do servidor da API de gerenciamento global. PROJECTO projeto do GDC do disco principal. PRIMARY_DISK_NAMEO nome do disco de origem que está sendo replicado. PRIMARY_ZONEA 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 está ativada, o disco secundário não pode ser anexado a uma VM. Depois que a replicação for interrompida, você poderá anexar o disco secundário a uma VM recém-criada ou a uma VM existente.