以非同步方式複製磁碟區

本頁說明如何設定及執行 Google Distributed Cloud (GDC) 氣隙式區塊儲存空間磁碟區的非同步複製作業。

非同步複製功能可用於將資料從一個 GDC 可用區複製到另一個可用區。如果來源區域資料無法使用,複製的資料可用於容錯移轉。請注意,建立容錯移轉後,原始磁碟區就無法複製到相同的目的地磁碟區。而是必須建立新的複寫關係。

事前準備

如要在兩個區域之間啟用非同步區塊複製功能,基礎架構營運商 (IO) 必須先從各區域對等互連相關儲存空間叢集,建立必要的儲存空間基礎架構。接著,他們需要對等互連與佈建區塊儲存空間的機構相關聯的儲存空間虛擬機器。

然後,請確認您具備 app-volume-replication-admin-global 角色,可管理 VolumeReplicationRelationship 資源。如果無法使用全域 API,則可使用 volume-replication-admin 角色直接修改區域 VolumeReplicationRelationshipReplica 資源。

設定複製作業

VolumeReplicationRelationship 自訂資源 (CR) 會提供非同步區塊複製 API。這則罐頭回應存在於全域管理 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 所在的叢集名稱。

規格的 sourcedestination 欄位分別指出資料的來源目的地。在本例中,資料會從 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 伺服器。如果是第 1 版機構,這會是機構管理員叢集。舉例來說,如果建立的 VolumeReplicationRelationship 指定 xx-xxxx-zone2 為目的地區域,且 PVC 存在於 my-org 機構中,則 VolumeFailover CR 會在 xx-xxxx-zone2my-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 提供服務。要複製的來源磁碟稱為主要磁碟。複製作業的目標磁碟稱為次要磁碟。在主要磁碟上啟動非同步複製作業時,系統會自動建立次要磁碟。

要求權限和存取權

如要複製 VM 磁碟,您必須具備專案虛擬機器管理員角色。按照步驟驗證您在 VM 磁碟所在專案的命名空間中,是否具備專案 VirtualMachine 管理員 (project-vm-admin) 角色。

如要使用 gdcloud CLI 執行 VM 作業,請要求專案 IAM 管理員同時指派專案 VirtualMachine 管理員角色和專案檢視者 (project-viewer) 角色。

啟動非同步複製

使用 gdcloud 或 kubectl 啟動 VM 磁碟的非同步複製作業。

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 停止主要 VM 磁碟的非同步複製作業。

gdcloud

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

更改下列內容:

變數定義
PRIMARY_DISK_NAME 要複製的來源磁碟名稱。
PROJECT 主要磁碟的 GDC 專案。
PRIMARY_ZONE 主要磁碟所在的區域。

API

  1. 找出與主要 VM 磁碟對應的磁碟區複寫關係。

    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'
    
  2. 刪除上一步列出的每個磁碟區複製關係。將 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 主要磁碟所在的區域。

如果來源區域因故無法使用,請建立磁碟區容錯移轉,停止複製作業。

將複製的磁碟連接至 VM

啟用複製功能後,次要磁碟就無法連接至 VM。停止複製後,您可以將次要磁碟連結至新建立的 VM現有 VM