在 Kubernetes 中備份及還原

選取說明文件版本:

本頁面說明如何使用 AlloyDB Omni Kubernetes 運算子,備份及還原 AlloyDB Omni 資料。您必須具備使用資訊清單檔案和 kubectl 指令列工具更新 Kubernetes 叢集的基本知識。如要進一步瞭解如何在 Kubernetes 叢集上安裝及執行 AlloyDB Omni,請參閱「在 Kubernetes 上安裝 AlloyDB Omni」。

如要啟用 AlloyDB Omni 持續備份和復原功能,請為每個資料庫叢集建立備份方案。系統會根據 backupPlan 資源中定義的備份時間表進行備份。如果備份方案未定義備份排程,系統預設會每天執行持續備份。您可以在復原時間範圍內,以秒為單位還原或複製任何時間戳記的備份。

如要瞭解如何備份及還原非 Kubernetes 部署項目的 AlloyDB Omni 資料,請參閱「為 AlloyDB Omni 設定 Barman」和「為 AlloyDB Omni 設定 pgBackRest」。

啟用及排定備份

為資料庫叢集建立備份方案資源時,系統會啟用持續備份功能。您必須為每個資料庫叢集建立 backupPlan 資源,才能為該叢集啟用持續備份功能。這項備份方案資源會定義下列參數:

  • AlloyDB Omni 運算子儲存備份的位置。可以是 Kubernetes 叢集本機,也可以是 Cloud Storage bucket。

  • 可設定多個備份排程,自動建立 fullincrementaldifferential 備份。您隨時可以暫停這項排程,包括在首次定義備份計畫時。如果備份方案已暫停,系統不會建立排定的備份,但您仍可手動建立備份。

    如未指定備份時間表,則預設為「0 0 * * *」,也就是每天午夜 (當地時間) 進行一次完整備份。

  • 儲存備份的保留期限。最短可設為 1 天,最長則可設為 90 天。預設值為 14。

  • 您可以從主要或待命 Kubernetes 叢集進行備份,並分別為 backupSourceStrategy 欄位指定 primarystandby 值。如要提升主要叢集的效能,請從待命叢集排定備份作業,藉此卸載備份作業。

資料庫叢集可有多個備份計畫,每個計畫都有自己的名稱和設定。如果您為資料庫叢集建立多個 backupPlan 資源,且備份排程各不相同,則必須為每個備份資源定義專屬的備份位置。

建立在本機儲存備份的方案

如要啟用本機備份功能,請套用下列資訊清單:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: BackupPlan
    metadata:
      name: BACKUP_PLAN_NAME
      namespace: NAMESPACE
    spec:
      dbclusterRef: DB_CLUSTER_NAME
      backupSchedules:
        full: "FULL_CRON_SCHEDULE"
        differential: "DIFF_CRON_SCHEDULE"
        incremental: "INCR_CRON_SCHEDULE"
      backupRetainDays: RETENTION_DAYS
      backupSourceStrategy: SOURCE_STRATEGY
      paused: PAUSED_BOOLEAN

更改下列內容:

  • BACKUP_PLAN_NAME:這個備份方案資源的名稱,例如 backup-plan-1

  • NAMESPACE:此備份計畫的 Kubernetes 命名空間。必須與資料庫叢集的命名空間相符。

  • DB_CLUSTER_NAME:資料庫叢集的名稱,這是您建立時指派的名稱。

  • FULL_CRON_SCHEDULE:建立完整備份的備份時間表,其中包含所有資料,並以 cron 格式表示。舉例來說,設為「0 0 * * 0」即可在每週日 00:00 進行完整備份。

  • DIFF_CRON_SCHEDULE:備份排程,用於建立初始完整備份。後續備份作業會根據資料的間隔變更 (以 cron 格式表示) 進行差異備份。舉例來說,如要設定在每週三 22:00 執行差異備份,請輸入「0 22 * * 3」。

  • INCR_CRON_SCHEDULE:備份排程,用於建立備份,其中包含自上次完整、差異或增量備份後變更的資料。格式為 cron。舉例來說,設為「0 21 * * *」即可每天 21:00 執行增量備份。

  • RETENTION_DAYS:AlloyDB Omni 運算子保留這項備份的天數。必須是介於 190 之間的整數。預設值為 14

  • SOURCE_STRATEGY:決定備份作業是從主要還是待命 Kubernetes 叢集執行。預設值為 primary。可選用的值如下:

    • primary:備份作業會從主要 Kubernetes 叢集執行。

    • standby:備份作業是從待命 Kubernetes 叢集執行。如果 SOURCE_STRATEGY 欄位設為 standby 時沒有備用執行個體,系統會改為從主要 Kubernetes 叢集備份。

  • PAUSED_BOOLEAN:指定備份方案是否已暫停。請提供下列其中一個值:

    • true:備份作業已暫停,系統不會建立排定的備份。

    • :AlloyDB Omni 運算子會根據 cronSchedule 指定的排程建立備份。false如果未明確設為 true,則這是預設值。

    預設值為 false

建立將備份儲存在 Cloud Storage 中的方案

如要啟用備份功能,並將備份檔儲存在 Cloud Storage,請按照下列步驟操作:

  1. 建立 Cloud Storage bucket。請記下您指派給這個 bucket 的名稱,後續步驟會用到。

  2. 建立服務帳戶,將備份檔新增至值區。

  3. storage.objectAdmin Identity and Access Management 角色授予服務帳戶。

  4. 為服務帳戶建立金鑰。這會將私密金鑰下載至本機環境。

  5. 將下載的金鑰檔案重新命名為 key.json

  6. 建立包含私密金鑰的 Kubernetes 密鑰:

    kubectl create secret generic SECRET_NAME --from-file=KEY_PATH -n NAMESPACE

    更改下列內容:

    • :您要建立的 Kubernetes Secret 名稱,例如 gcs-keySECRET_NAME

    • KEY_PATH:您在上一個步驟下載的 key.json 檔案本機檔案系統路徑。

    • NAMESPACE:資料庫叢集的命名空間。

  7. 套用下列資訊清單:

      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: BackupPlan
      metadata:
        name: BACKUP_PLAN_NAME
        namespace: NAMESPACE
      spec:
        dbclusterRef: DB_CLUSTER_NAME
        backupSchedules:
          full: "FULL_CRON_SCHEDULE"
          differential: "DIFF_CRON_SCHEDULE"
          incremental: "INCR_CRON_SCHEDULE"
        backupRetainDays: RETENTION_DAYS
        backupSourceStrategy: SOURCE_STRATEGY
        paused: PAUSED_BOOLEAN
        backupLocation:
          type: GCS
          gcsOptions:
            bucket: BUCKET_URL
            key: BACKUP_PATH
            secretRef:
              name: SECRET_NAME
              namespace: NAMESPACE
    

    更改下列內容:

    • BACKUP_PLAN_NAME:這個備份方案資源的名稱,例如 backup-plan-1

    • NAMESPACE:此備份計畫的 Kubernetes 命名空間。必須與資料庫叢集的命名空間相符。

    • DB_CLUSTER_NAME:資料庫叢集的名稱,這是您建立時指派的名稱。

    • FULL_CRON_SCHEDULE:建立完整備份的備份時間表,其中包含所有資料,並以 cron 格式表示。舉例來說,設為「0 0 * * 0」即可在每週日 00:00 進行完整備份。

    • DIFF_CRON_SCHEDULE:備份排程,用於建立初始完整備份。後續備份作業會根據資料的間隔變更 (以 cron 格式表示) 進行差異備份。舉例來說,如要設定在每週三 22:00 執行差異備份,請輸入「0 22 * * 3」。

    • INCR_CRON_SCHEDULE:備份排程,用於建立備份,其中包含自上次完整、差異或增量備份後變更的資料。格式為 cron。舉例來說,設為「0 21 * * *」即可每天 21:00 執行增量備份。

    • RETENTION_DAYS:AlloyDB Omni 運算子保留這項備份的天數。必須是介於 190 之間的整數。預設值為 14

    • SOURCE_STRATEGY:決定備份作業是從主要還是待命 Kubernetes 叢集執行。預設值為 primary。可選用的值如下:

      • primary:備份作業會從主要 Kubernetes 叢集執行。

      • standby:備份作業是從待命 Kubernetes 叢集執行。如果 SOURCE_STRATEGY 欄位設為 standby 時沒有備用執行個體,系統會改為從主要 Kubernetes 叢集備份。

    • PAUSED_BOOLEAN:指定備份方案是否已暫停。請提供下列其中一個值:

      • true:備份作業已暫停,系統不會建立排定的備份。

      • :AlloyDB Omni 運算子會根據 cronSchedule 指定的排程建立備份。false如果未明確設為 true,則這是預設值。

      預設值為 false

    • BUCKET_URL:您在先前步驟中建立的 Cloud Storage bucket 名稱。這不是 bucket 的完整網址,請勿在 bucket 名稱加上 gs:// 前置字串。

    • BACKUP_PATH:AlloyDB Omni 運算子在 Cloud Storage 值區中寫入備份的目錄路徑。路徑必須是絕對路徑,開頭為 /

    • SECRET_NAME:您在先前步驟中建立的 Kubernetes 密鑰名稱。

將備份檔建立到與 S3 相容的儲存空間

您可以使用 s30options 欄位,將備份檔傳送至與 S3 相容的端點。

以下程序中的步驟為高階步驟。如要取得特定用途的操作說明,請參閱 S3 供應商的說明文件。

如要在與 S3 相容的儲存空間中啟用備份功能,請按照下列高階步驟操作:

  1. 建立 S3 儲存空間 bucket。請記下您指派給這個 bucket 的名稱,因為後續步驟會用到。
  2. 如要存取 S3 儲存空間值區,請建立主體,例如服務帳戶或使用者。請洽詢 S3 供應商,瞭解是否需要授予主體預先定義的角色或政策。
  3. 授予您在上一步建立的主體讀寫權限。這個步驟可讓您讀取及寫入 S3 儲存空間值區。
  4. 為您建立的主體建立存取金鑰。存取金鑰包含金鑰 ID 和金鑰密鑰。這項作業會將金鑰下載到本機環境。
  5. 建立包含金鑰的 Kubernetes 密鑰:

    kubectl create secret generic SECRET_NAME --from-literal=access-key-id=KEY_ID --from-literal=access-key=KEY -n NAMESPACE

    更改下列內容:

    • SECRET_NAME:您要建立的 Kubernetes Secret 名稱,例如 s3-key
    • KEY_ID:存取金鑰的金鑰 ID。
    • KEY:存取金鑰的密鑰。
    • NAMESPACE:用於保存密鑰名稱的空間。這個值不得重複。
  6. 套用下列資訊清單:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: BackupPlan
    metadata:
      name: BACKUP_PLAN_NAME
      namespace: NAMESPACE
    spec:
      dbclusterRef: DB_CLUSTER_NAME
      backupSchedules:
        full: "FULL_CRON_SCHEDULE"
        differential: "DIFF_CRON_SCHEDULE"
        incremental: "INCR_CRON_SCHEDULE"
      backupRetainDays: RETENTION_DAYS
      backupSourceStrategy: SOURCE_STRATEGY
      paused: PAUSED_BOOLEAN
      backupLocation:
        type: S3
        s3Options:
          bucket: BUCKET_NAME
          region: REGION
          endpoint: S3ENDPOINT
          key: BACKUP_PATH
          secretRef:
            namespace: NAMESPACE
            name: SECRET_NAME
          certRef:
            name: CA_BUNDLE_SECRET_NAME
            namespace: NAMESPACE
    

    更改下列內容:

    • BACKUP_PLAN_NAME:這個備份計畫資源的名稱,例如 backup-plan-1
    • NAMESPACE:此備份方案的 Kubernetes 命名空間。命名空間必須與資料庫叢集的命名空間相符。
    • DB_CLUSTER_NAME:資料庫叢集的名稱,這是您建立叢集時指派的名稱。
    • FULL_CRON_SCHEDULE:備份時間表,用於建立包含所有資料的完整備份,以 cron 格式表示。舉例來說,如要每週日 00:00 進行完整備份,請將 FULL_CRON_SCHEDULE 設為
      0 0 * * 0
    • DIFF_CRON_SCHEDULE:備份時間表,用於建立備份 (一開始是完整備份)。後續備份作業會根據資料的間隔變更,以 cron 格式進行差異備份。 舉例來說,如要在每週三的 22:00 執行差異備份,請設為 0 22 * * 3
    • INCR_CRON_SCHEDULE:備份時間表,用於建立備份,當中包含自上次完整、差異或增量備份後變更的資料。格式為 cron。舉例來說,如要每天 21:00 執行增量備份,請將此值設為 0 21 * * *
    • RETENTION_DAYS:AlloyDB Omni Kubernetes 運算子保留這項備份的天數。這個參數必須是介於 190 之間的整數。預設值為 14
    • SOURCE_STRATEGY:決定備份作業是從主要還是待命 Kubernetes 叢集執行。預設值為 primary。可用的值如下:
      • primary:備份作業會從主要 Kubernetes 叢集執行。
      • standby:備份作業是從待命 Kubernetes 叢集執行。如果 SOURCE_STRATEGY 欄位設為 standby 時沒有備用執行個體,系統會改為從主要 Kubernetes 叢集備份。
    • PAUSED_BOOLEAN:指定備份方案是否已暫停。請提供下列其中一個值:
      • true:備份作業已暫停,系統不會建立排定的備份。
      • false:預設值。AlloyDB Omni 運算子會根據 cronSchedule 指定的排程建立備份。如果未明確設為 true,則這是預設值。
    • BUCKET_NAME:您建立的 S3 儲存空間 bucket 名稱。bucket 名稱並非 bucket 的完整網址。請勿在 bucket 名稱前加上 gs://
    • REGION:儲存 S3 bucket 的區域。
    • S3ENDPOINT:S3 儲存空間值區的端點。
    • BACKUP_PATH:AlloyDB Omni 運算子將備份寫入 S3 儲存空間 bucket 的目錄路徑。路徑必須是絕對路徑,且開頭必須為 /
    • NAMESPACE:密鑰名稱不得重複的空間。
    • :您為建立的 Kubernetes 密鑰選擇的名稱。SECRET_NAME
    • CA_BUNDLE_SECRET_NAME:PEM 編碼的 CA 憑證集區,S3 伺服器會使用這些憑證驗證憑證。請確認套件已納入名為 ca.crt 的金鑰底下的密鑰。

      以下範例說明如何建立包含憑證的密鑰,其中 PEM_FILE_PATHca 組合檔案的路徑:

      kubectl create secret generic CA_BUNDLE_SECRET_NAME -n NAMESPACE --from-file=ca.crt=PEM_FILE_PATH
      

手動建立備份

您可以隨時手動建立備份資源,方法是使用已套用至資料庫叢集的任何備份方案。AlloyDB Omni 運算子會將所選備份方案的儲存位置和保留期限套用至新的手動備份。

如要從主要或待命 Kubernetes 叢集手動建立備份,您必須使用 backupSourceRole 欄位指定備份的來源資料庫執行個體,並套用下列資訊清單:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Backup
metadata:
  name: BACKUP_NAME
  namespace: NAMESPACE
spec:
  dbclusterRef: DB_CLUSTER_NAME
  backupPlanRef: BACKUP_PLAN_NAME
  manual: true
  backupSourceRole: SOURCE_ROLE
  physicalBackupSpec:
    backupType: BACKUP_TYPE

更改下列內容:

  • BACKUP_NAME:這個備份的名稱,例如 backup-1

  • NAMESPACE:這次還原作業的 Kubernetes 命名空間。必須與資料庫叢集的命名空間相符。

  • BACKUP_PLAN_NAME:備份方案資源的名稱,這個備份作業屬於該資源。必須與您建立備份方案時選擇的名稱相符。

  • DB_CLUSTER_NAME:資料庫叢集的名稱,這是您建立時指派的名稱。

  • SOURCE_ROLE:指定手動備份來源資料庫執行個體的角色。預設值為 primary。你可以選擇下列其中一個值:

    • primary:從主要 Kubernetes 叢集設定備份。
    • standby:從待命 Kubernetes 叢集設定備份。
  • BACKUP_TYPE:指定要建立的手動備份類型。請選擇下列其中一個值:

    • full:建立包含所有資料的完整備份。

    • diff:建立差異備份,這項備份會依據上次的完整備份。後續備份作業會根據資料期間的變更進行差異備份。

    • incr:建立增量備份,其中包含上次完整或差異備份後異動的資料,因此必須先執行完整或差異備份。

監控及列出備份

備份計畫和備份內容都是 Kubernetes 叢集中的資源。如要查看相關資訊,請使用 kubectl get 指令。

查看備份方案摘要

如要查看資料庫叢集的備份計畫相關資訊,請執行下列指令:

kubectl get backupplan.alloydbomni.dbadmin.goog -n NAMESPACE

NAMESPACE 替換為資料庫叢集的命名空間。

輸出結果會與下列內容相似:

NAME               PHASE   LASTBACKUPTIME         NEXTBACKUPTIME
backup-plan-prod   Ready   2023-10-26T17:26:43Z   2023-10-27T00:00:00Z

查看備份清單

如要查看資料庫叢集可用的備份清單,請執行下列指令:

kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE

NAMESPACE 替換為資料庫叢集的命名空間。

輸出結果會與下列內容相似:

NAME                              PHASE       COMPLETETIME
backup-plan-prod-20231026172643   Succeeded   2023-10-26T17:26:53Z
manual-backup-1                   Succeeded   2023-10-26T18:15:27Z
manual-backup-2                   InProgress

輸出表格中的每一列都代表備份資源,並具有下列屬性:

  • 備份名稱。
  • 備份狀態,其中 Succeeded 表示備份已可供還原。
  • 備份的建立時間戳記。

從備份還原

AlloyDB 可讓您從個別備份還原資料,或使用特定時間點的備份複製叢集。

從具名備份還原

如要從備份還原,並以備份中的資料取代資料庫叢集中的資料,請按照下列步驟操作。

  1. 列出階段為 Succeeded 的所有備份。

    kubectl get backup.alloydbomni.dbadmin.goog -n NAMESPACE | grep Succeeded

    NAMESPACE 替換為資料庫叢集的命名空間。

    如果至少有一個合適的備份候選項目,輸出內容會類似於下列內容:

    backup-plan-prod-20231026172643   Succeeded   2023-10-26T17:26:53Z
    manual-backup-1                   Succeeded   2023-10-26T18:15:27Z
    
  2. 從上一個步驟列出的備份中,選擇要還原的備份。請記下名稱,以便在後續步驟中使用。

  3. 套用下列資訊清單:

      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: Restore
      metadata:
        name: RESTORE_NAME
        namespace: NAMESPACE
      spec:
        sourceDBCluster: DB_CLUSTER_NAME
        backup: BACKUP_NAME
    

    更改下列內容:

    • RESTORE_NAME:要搭配這個資訊清單建立的資料還原資源使用的名稱,例如 restore-1

    • DB_CLUSTER_NAME:資料庫叢集名稱,這是您建立叢集時指派的名稱。

    • BACKUP_NAME:您在上一步中選擇的備份名稱。

從某個時間點複製叢集

AlloyDB Omni 運算子可讓您從復原期間內的任意時間點複製叢集資料。復原時間範圍的長度直接取決於保留期限。

舉例來說,如果保留期限設為 14 天,您就無法復原超過 14 天前的資料。您可以在復原時間範圍內還原至任何時間點。 AlloyDB Omni 運算子會將備份和記錄檔保留時間延長一天。

  1. 監控復原期間,找出還原時間點:

    kubectl get backupplan.alloydbomni.dbadmin.goog BACKUP_NAME -n NAMESPACE -o json | jq .status.recoveryWindow
    

    以下是回應範例:

    recoveryWindow:
    begin: "2024-01-31T02:54:35Z"
    

    還原資源時會使用 RFC 3339 時間戳記格式的時間戳記值。

  2. 建立並套用下列還原資源資訊清單:

    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: Restore
    metadata:
      name: RESTORE_NAME
      namespace: NAMESPACE
    spec:
      sourceDBCluster: DB_CLUSTER_NAME
      pointInTime: "DATE_AND_TIME_STAMP"
      clonedDBClusterConfig:
        dbclusterName: NEW_DB_CLUSTER_NAME
    

    更改下列內容:

    • RESTORE_NAME:要搭配這個資訊清單建立的資料還原資源使用的名稱,例如 restore-1

    • DB_CLUSTER_NAME:資料庫叢集的名稱,這是您建立叢集時指派的名稱。

    • DATE_AND_TIME_STAMP:您要還原的連續備份時間戳記 (RFC 3339 格式,精確度達分鐘單位),例如 2024-03-05T15:32:10Z

    • NEW_DB_CLUSTER_NAME:新資料庫叢集的名稱。

查看還原狀態

  1. 查看還原作業的進度:

    kubectl get restore.alloydbomni.dbadmin.goog -n NAMESPACE

    NAMESPACE 替換為資料庫叢集的命名空間。

    如要持續執行指令,請加上 -Aw 旗標。

    輸出結果會與下列內容相似:

    NAME        PHASE               COMPLETETIME   RESTOREDPOINTINTIME
    restore-1   RestoreInProgress
    

    如果輸出資料表中的 PHASE 欄值為 ProvisionSucceeded,表示還原作業已完成。

  2. 查看還原或複製的資料庫叢集上線進度:

    kubectl get dbclusters -A -n NAMESPACE

    NAMESPACE 替換為資料庫叢集的命名空間。

    如要持續執行指令,請加上 -Aw 旗標。

    輸出結果會與下列內容相似:

    NAMESPACE   NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE
    default     db-cluster-1       10.128.0.55       Ready          DBClusterReady
    

    如果輸出資料表中的 DBCLUSTERPHASE 欄值為 DBClusterReady,表示還原或複製的資料庫叢集已可供使用。

刪除備份

通常不需要手動刪除備份。AlloyDB Omni 運算子會自動刪除超過保留期限的備份,保留期限是在建立備份方案時指定。

如要手動刪除備份,備份必須符合下列條件:

  • 備份方案儲存的備份不只一個。AlloyDB Omni 運算子要求每個備份方案至少要有一個備份。

  • 備份資料沒有其他備份資料依附。舉例來說,完整備份和依附於該備份的差異或增量備份,或是增量備份和依附於該備份的差異備份。

如要刪除備份,請執行下列指令:

kubectl delete backup.alloydbomni.dbadmin.goog/BACKUP_NAME -n NAMESPACE

更改下列內容:

  • BACKUP_NAME:要刪除的備份名稱。

  • NAMESPACE:資料庫叢集的命名空間。

調整備份磁碟大小

如要調整 Kubernetes 叢集中儲存備份資料的本機磁碟大小,請完成下列步驟:

  1. 請依下列方式更新 DBCluster 資訊清單的 resources.disks 欄位:

    spec:
      primarySpec:
        resources:
          disks:
            - name: BACKUP_DISK
              size: 10Gi
    

    BACKUP_DISK 替換為儲存備份的磁碟名稱。

  2. 套用資訊清單,強制執行更新。

    AlloyDB Omni 運算子會立即將更新後的規格套用至 DBCluster。

修改執行中資料庫叢集的備份磁碟時,會受到下列限制:

  • 只有在指定的 storageClass 支援磁碟區擴充時,您才能增加磁碟大小。
  • 無法縮減磁碟大小。

更新備份方案

每個備份計畫都是 Kubernetes 資源。如要更新設定,請執行下列其中一項操作:

  • 編輯並重新套用備份方案的資訊清單檔案。

  • 使用 kubectl patch 指令。

舉例來說,如要暫停執行中的備份方案,請將資訊清單的 paused 屬性變更為 true,然後重新套用資訊清單。

刪除備份方案

如要刪除備份方案並移除所有備份資源,請執行下列指令:

kubectl delete backupplan.alloydbomni.dbadmin.goog/BACKUP_PLAN_NAME -n NAMESPACE

更改下列內容:

  • BACKUP_PLAN_NAME:要刪除的備份方案名稱。

  • NAMESPACE:資料庫叢集的命名空間。

如要暫停備份方案,但不要刪除,請將備份方案資源的 paused 屬性設為 true。暫停的備份方案仍會儲存備份,並允許手動建立備份。