本文假設您已具備下列知識:
- 來源和目標資料庫叢集是在 Google Kubernetes Engine 上建立,備份磁碟則是 Compute Engine 永久磁碟。
- 資料庫中做為備份磁碟的 Compute Engine 永久磁碟,不會用於其他資料庫叢集。
複製資料庫叢集時,請按照下列步驟操作:
- 找出備份磁碟資訊,例如來源資料庫叢集備份磁碟的永久磁碟名稱和 Compute Engine 永久磁碟控制代碼。請確認您已為來源資料庫叢集啟用備份功能,且至少有一個備份成功。如未符合上述條件,請按照「啟用及排定備份時間」一文中的操作說明進行。
- 建立
PersistentVolume
資源,在目標資料庫叢集上使用現有的備份磁碟,存取來源資料庫叢集的備份磁碟。 - 在目標資料庫叢集上建立並套用
DBCluster
資源資訊清單檔案,並停用livenessProbe
參數,然後新增備份磁碟資訊。 - 使用
pgBackRest
指令確認可存取來源備份。 - 使用
pgBackRest
指令將備份還原至目標資料庫叢集。
事前準備
- 確認您有權存取來源資料庫叢集備份檔所在的備份磁碟。
- 來源資料庫叢集備份磁碟必須可掛接至目標資料庫叢集。詳情請參閱「永久磁碟區」。如果基礎儲存空間後端不支援 ReadOnlyMany (ROX) 存取權,請確認來源叢集中的任何 Pod 都未使用備份磁碟。
- 由於來源備份磁碟已掛接至目標資料庫叢集,因此
pgBackRest.conf
檔案會照常重複使用。 - 確認您以
postgres
使用者身分登入資料庫。
取得來源備份磁碟資訊
在還原程序中,請為來源資料庫叢集判斷備份磁碟永久磁碟區要求 (PVC) 名稱。PVC 可在 Kubernetes 中管理應用程式的永久儲存空間。
下列範例指令有助於找出基礎 PV 名稱和 Compute Engine 永久磁碟控制代碼。在本例中,所有備份磁碟都是 Compute Engine 永久磁碟,可使用磁碟控制代碼 ID 在 Compute Engine VM 之間存取。
連線至目標資料庫叢集,找出 PVC 名稱:
kubectl get pvc -n DB_CLUSTER_NAMESPACE | grep DB_CLUSTER_NAME | grep backuprepodisk
更改下列內容:
DB_CLUSTER_NAMESPACE
:此備份計畫的 Kubernetes 命名空間。必須與資料庫叢集的命名空間相符。DB_CLUSTER_NAME
:這個資料庫叢集的名稱,例如my-db-cluster
。
以下是範例回應。
backuprepodisk-my-db-cluster-br-0 Bound pvc-36d8f05d-ef1a-4750-ac01-9bb330c15b3a 10Gi RWO standard-rwo 5d21h
使用上一個步驟中的備份磁碟 PVC 名稱 (例如
backuprepodisk-my-db-cluster-br-0
),找出基礎 PV 名稱和 Compute Engine 永久磁碟控制代碼:kubectl get pvc/PVC_NAME -n DB_CLUSTER_NAMESPACE -o jsonpath={.spec.volumeName}
更改下列內容:
PVC_NAME
:上一個步驟中回應的備份磁碟 PVC 名稱,例如backuprepodisk-my-db-cluster-br-0
。
根據 PV 名稱匯出設定做為變數,供後續區段使用:
export BACKUP_DISK_SIZE=$(kubectl get pv/PV_NAME -o jsonpath="{.spec.capacity.storage}") export FS_TYPE=$(kubectl get pv/PV_NAME -o jsonpath="{.spec.csi.fsType}") export VOLUME_HANDLER=$(kubectl get pv/PV_NAME -o jsonpath="{.spec.csi.volumeHandle}") export STORAGE_CLASS=$(kubectl get pv/PV_NAME -o jsonpath="{.spec.storageClassName}")
更改下列內容:
PV_NAME
:上一步回應中的備份磁碟 PV 名稱。例如「backupDiskVolume」。
建立永久磁碟區資源
使用磁碟控制代碼名稱建立 PersistentVolume
資源。
在目標 Kubernetes 叢集中,建立
PersistentVolume
資訊清單檔案:apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "${STORAGE_CLASS}" capacity: storage: "${BACKUP_DISK_SIZE}" accessModes: - ReadWriteOnce csi: driver: pd.csi.storage.gke.io volumeHandle: "${VOLUME_HANDLER}" fsType: "${FS_TYPE}"
更改下列內容:
- PV_NAME:要建立的
PersistentVolume
資源名稱。
- PV_NAME:要建立的
套用資訊清單檔案:
kubectl apply -f PV_FILENAME
更改下列內容:
- PV_FILENAME:在上一步驟中建立的
PersistentVolume
資訊清單檔案名稱。
- PV_FILENAME:在上一步驟中建立的
建立目標資料庫叢集
暫時停用 livenessProbe
參數,建立資料庫叢集。還原完成後,請重新設定 livenessProbe
參數。
建立
DBCluster
資訊清單檔案:apiVersion: v1 kind: Secret metadata: name: db-pw-DB_CLUSTER_NAME type: Opaque data: DB_CLUSTER_NAME: "ENCODED_PASSWORD" --- apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: DB_CLUSTER_NAME spec: databaseVersion: "16.8.0" primarySpec: availabilityOptions: livenessProbe: "Disabled" adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: cpu: CPU_COUNT memory: MEMORY_SIZE disks: - name: DataDisk size: DATA_DISK_SIZE - name: BackupDisk size: ${BACKUP_DISK_SIZE} storageClass: ${STORAGE_CLASS} volumeName: PV_NAME
更改下列內容:
DB_CLUSTER_NAME
:這個資料庫叢集的名稱,例如my-db-cluster
。ENCODED_PASSWORD
:預設postgres
使用者角色的資料庫登入密碼,以 Base64 字串編碼,例如ChangeMe123
的Q2hhbmdlTWUxMjM=
。CPU_COUNT
:這個資料庫叢集中每個資料庫執行個體可用的 CPU 數量。MEMORY_SIZE
:這個資料庫叢集的每個資料庫執行個體記憶體量。建議您將此值設為每個 CPU 8 GB。舉例來說,如果將 CPU_COUNT 設為2
,建議將memory
設為16Gi
。DATA_DISK_SIZE
:每個資料庫執行個體的磁碟大小,例如10Gi
。
套用資訊清單檔案:
kubectl apply -f DBCLUSTER_FILENAME
更改下列內容:
- DBCLUSTER_FILENAME:在上一步驟中建立的
DBCluster
資訊清單檔案名稱。
- DBCLUSTER_FILENAME:在上一步驟中建立的
使用 kubectl describe
指令,確認資料庫叢集資源處於 READY
狀態。
在目標資料庫叢集中驗證來源備份
執行 pgBackRest
指令,確認目標資料庫叢集可以存取來源資料庫叢集的備份。
在目標資料庫叢集中,找出資料庫叢集 Pod 詳細資料:
kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database"
回應會包含叢集資料庫 Pod 的名稱。
登入資料庫 Pod:
kubectl exec -ti DATABASE_POD_NAME -- /bin/bash
更改下列內容:
- DATABASE_POD_NAME:上一個步驟中的資料庫叢集 Pod 名稱。
更新
pgBackRest
設定檔前,請先停止 Pod:supervisorctl.par stop postgres
更新
pgBackRest
設定檔:cp /backup/pgbackrest.conf /backup/pgbackrest.conf.bak rm /backup/pgbackrest.conf cat << EOF > /backup/pgbackrest.conf [db] pg1-path=/mnt/disks/pgsql/data pg1-socket-path=/tmp pg1-user=pgbackrest
[global] log-path=/backup/logs log-level-file=info EOF
在資料庫叢集 Pod 中驗證來源備份:
pgbackrest --config-path=/backup --stanza=db --repo=1 info
以下是回應範例:
stanza: db status: ok cipher: none db (current) wal archive min/max (15): 000000010000000000000002/00000001000000000000000D full backup: 20240213-231400F timestamp start/stop: 2024-02-13 23:14:00+00 / 2024-02-13 23:17:14+00 wal start/stop: 000000010000000000000003 / 000000010000000000000003 database size: 38.7MB, database backup size: 38.7MB repo1: backup set size: 4.6MB, backup size: 4.6MB incr backup: 20240213-231400F_20240214-000001I timestamp start/stop: 2024-02-14 00:00:01+00 / 2024-02-14 00:00:05+00 wal start/stop: 00000001000000000000000D / 00000001000000000000000D database size: 38.7MB, database backup size: 488.3KB repo1: backup set size: 4.6MB, backup size: 84.2KB backup reference list: 20240213-231400F
回覆中的時間戳記可用於還原完整備份,或從復原時間範圍內的某個時間點還原。
在目標資料庫叢集中還原備份
找出要還原的備份或時間點後,請在目標資料庫叢集中執行 pgBackRest
指令。如要進一步瞭解這些指令,請參閱「還原指令」。
以下是部分 pgBackRest
還原指令範例:
從備份還原
pgbackrest --config-path=/backup --stanza=db --repo=1 restore --set=20240213-231400F --type=immediate --target-action=promote --delta --link-all --log-level-console=info
從某個時間點還原
pgbackrest --config-path=/backup --stanza=db --repo=1 restore --target="2024-01-22 11:27:22" --type=time --target-action=promote --delta --link-all --log-level-console=info
重新啟動 Pod
還原指令順利完成後,即可啟動 postgres
程序。
supervisorctl.par start postgres
postgres
程序開始後,您可以連線至主要執行個體並執行查詢,確認資料已從備份還原。詳情請參閱「連線至在 Kubernetes 上執行的 AlloyDB Omni」。
設定資料庫叢集
複製資料庫叢集後,請設定資料庫叢集規格。請務必使用下列指令開啟 livenessProbe
參數:
kubectl patch dbcluster DBCLUSTER_FILENAME --type merge -p '{"spec":{"primarySpec":{"availabilityOptions":{"livenessProbe":"Enabled"}}}}'