本页面介绍了如何设置和执行 Google Distributed Cloud (GDC) 气隙式块存储卷的异步复制。
异步复制用于将数据从一个 GDC 可用区复制到另一个可用区。如果源可用区数据变得不可用,则可利用复制的数据进行故障切换。请注意,创建故障切换后,无法再将原始卷复制到同一目标卷。而是必须创建新的复制关系。
准备工作
如需在两个可用区之间实现异步块复制,您的基础架构运维者 (IO) 必须先通过对等互连每个可用区中的相关存储集群来建立必要的存储基础架构。接下来,他们需要对与预配了块存储的组织相关联的存储虚拟机进行对等互连。
之后,确保您拥有 app-volume-replication-admin-global
角色来管理 VolumeReplicationRelationship 资源。如果全局 API 不可用,可以使用 volume-replication-admin
角色直接修改区域 VolumeReplicationRelationshipReplica 资源。
设置复制
VolumeReplicationRelationship 自定义资源 (CR) 用于提供异步块复制 API。此 CR 存在于全局管理 API 中。如需为给定的块设备启用复制,需要在全局管理 API 上创建 VolumeReplicationRelationship CR:
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
name: my-pvc-repl
namespace: my-project
spec:
source:
pvc:
clusterRef: my-pvc-cluster
pvcRef: my-block-pvc
zoneRef: xx-xxxx-zone1
destination:
pvc:
clusterRef: my-pvc-cluster
zoneRef: xx-xxxx-zone2
此示例假定在名为 my-org
的组织中创建了一个名为 my-project
的项目,并且已预配名为 my-block-pvc
的 PVC。clusterRef
是 PVC 所在的集群的名称。
规范的 source
和 destination
字段分别表示数据复制的源和目标。在此示例中,数据从 xx-xxxx-zone1
复制到 xx-xxxx-zone2
。
通过从全局 API 中检索 VolumeReplicationRelationship
CR 来检查复制关系的状态。请参考以下示例。请注意,为简化起见,输出已被截断:
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
name: my-pvc-repl
namespace: my-project
spec:
destination:
pvc:
clusterRef: my-pvc-cluster
zoneRef: xx-xxxx-zone2
source:
pvc:
clusterRef: my-pvc-cluster
pvcRef: my-block-pvc
zoneRef: xx-xxxx-zone1
status:
zones:
- name: xx-xxxx-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: xx-xxxx-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
创建故障切换
如果源可用区因任何原因而不可用,则可以在目标可用区的组织管理平面中创建 VolumeFailover
CR。对于 v2 组织,这将是管理 API 服务器。对于 v1 组织,这将是组织管理员集群。例如,如果创建了一个 VolumeReplicationRelationship
,其中指定 xx-xxxx-zone2
为目标可用区,并且 PVC 存在于 my-org
组织中,则 VolumeFailover
CR 会在 xx-xxxx-zone2
中 my-org
的管理平面中创建。这会中断两个可用区之间的复制关系,并允许目标可用区中的 PVC 由工作负载装载:
apiVersion: storage.gdc.goog/v1
kind: VolumeFailover
metadata:
name: my-pvc-failover
namespace: my-project
spec:
volumeReplicationRelationshipRef: my-pvc-repl
之后,CR 的状态会反映出成功的故障切换:
apiVersion: storage.gdc.goog/v1
kind: VolumeFailover
metadata:
name: my-pvc-failover
namespace: my-project
spec:
volumeReplicationRelationshipRef: my-pvc-repl
status:
state: Completed
创建故障切换后,my-pvc-repl
VolumeReplicationRelationship
会转换为 Broken Off
状态。xx-xxxx-zone2
中的 PVC 现在可挂载。
此时,VolumeReplicationRelationship
应类似于以下示例。为简单起见,此输出已截断:
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
name: my-pvc-repl
namespace: my-project
spec:
destination:
pvc:
clusterRef: my-pvc-cluster
zoneRef: xx-xxxx-zone2
source:
pvc:
clusterRef: my-pvc-cluster
pvcRef: my-block-pvc
zoneRef: xx-xxxx-zone1
status:
zones:
- name: xx-xxxx-zone1
replicaStatus:
message: SnapMirror relationship has been broken off
replicationID: a096621e-f062-11ef-ad24-00a0b89f23fb
state: Broken Off
- name: xx-xxxx-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
现在,可以安全地删除 VolumeReplicationRelationship,因为这是唯一可以对该 CR 执行的操作。
调整卷大小
如果源卷在任何时候调整大小,则在创建 VolumeReplicatioRelationship 时代表用户创建的目标可用区中的相应卷也应调整大小以匹配。
复制虚拟机磁盘
VolumeReplicationRelationship 还为异步虚拟机磁盘(VM 磁盘)复制 API 提供服务。被复制的源磁盘称为主磁盘。正在复制到的目标磁盘称为辅助磁盘。在主磁盘上启动异步复制会自动创建辅助磁盘。
请求权限和访问权限
如需复制虚拟机磁盘,您必须拥有项目虚拟机管理员角色。按照相应步骤验证您是否在虚拟机磁盘所在项目的命名空间中拥有 Project VirtualMachine Admin (project-vm-admin
) 角色。
对于使用 gdcloud CLI 的虚拟机操作,请让项目 IAM 管理员为您分配“Project VirtualMachine Admin”角色和“Project Viewer”角色 (project-viewer
)。
启动异步复制
使用 gdcloud 或 kubectl
在虚拟机磁盘上启动异步复制。
gdcloud
gdcloud compute disks start-async-replication PRIMARY_DISK_NAME \
--project PROJECT --zone PRIMARY_ZONE \
--secondary-disk SECONDARY_DISK_NAME --secondary-zone SECONDARY_ZONE
替换以下内容:
变量 | 定义 |
---|---|
PRIMARY_DISK_NAME |
正在复制的源磁盘的名称。 |
PROJECT |
主磁盘的 GDC 项目。 |
PRIMARY_ZONE |
主磁盘所在的地区。 |
SECONDARY_DISK_NAME |
要复制到的目标磁盘的名称。 |
SECONDARY_ZONE |
辅助磁盘必须所在的可用区。 |
API
kubectl --kubeconfig GLOBAL_MANAGEMENT_API \
apply -f - <<EOF
apiVersion: storage.global.gdc.goog/v1
kind: VolumeReplicationRelationship
metadata:
name: VRR_NAME
namespace: PROJECT
spec:
source:
virtualMachineDisk:
virtualMachineDiskRef: PRIMARY_DISK_NAME
zoneRef: PRIMARY_ZONE
destination:
volumeOverrideName: SECONDARY_DISK_NAME
zoneRef: SECONDARY_ZONE
EOF
替换以下内容:
变量 | 定义 |
---|---|
GLOBAL_MANAGEMENT_API |
全局管理 API 服务器的 kubeconfig 文件。 |
VRR_NAME |
卷复制关系的名称。 停止异步复制时必须使用相同的名称。 |
PROJECT |
主磁盘的 GDC 项目。 |
PRIMARY_DISK_NAME |
正在复制的源磁盘的名称。 |
PRIMARY_ZONE |
主磁盘所在的地区。 |
SECONDARY_DISK_NAME |
要复制到的目标磁盘的名称。 |
SECONDARY_ZONE |
辅助磁盘必须所在的可用区。 |
列出异步复制关系
使用 kubectl
列出项目中的异步复制关系。
kubectl --kubeconfig GLOBAL_MANAGEMENT_API get volumereplicationrelationships -n my-project
替换以下内容:
- PROJECT:主磁盘的 GDC 项目。
- GLOBAL_MANAGEMENT_API:全局管理 API 服务器的 kubeconfig 文件。
输出将如下所示:
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
停止异步复制
使用 gdcloud 或 kubectl
停止主虚拟机磁盘上的异步复制。
gdcloud
gdcloud compute disks stop-async-replication PRIMARY_DISK_NAME \
--project PROJECT --zone PRIMARY_ZONE
替换以下内容:
变量 | 定义 |
---|---|
PRIMARY_DISK_NAME |
正在复制的源磁盘的名称。 |
PROJECT |
主磁盘的 GDC 项目。 |
PRIMARY_ZONE |
主磁盘所在的地区。 |
API
查找与主虚拟机磁盘对应的卷复制关系。
kubectl --kubeconfig GLOBAL_MANAGEMENT_API 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'
删除上一步中列出的每个卷复制关系。将 VRR_NAMES 替换为卷复制关系的名称。
kubectl --kubeconfig GLOBAL_MANAGEMENT_API delete volumereplicationrelationships \ -n PROJECT VRR_NAMES
替换以下内容:
变量 定义 GLOBAL_MANAGEMENT_API
全局管理 API 服务器的 kubeconfig 文件。 PROJECT
主磁盘的 GDC 项目。 PRIMARY_DISK_NAME
正在复制的源磁盘的名称。 PRIMARY_ZONE
主磁盘所在的地区。
如果源可用区因任何原因而不可用,请创建卷故障切换以停止复制。
将复制的磁盘挂接到虚拟机
启用复制后,辅助磁盘无法挂接到虚拟机。停止复制后,您可以将辅助磁盘挂接到新创建的虚拟机或现有虚拟机。