이 페이지에서는 AlloyDB Omni 데이터베이스 클러스터의 로컬 백업을 사용하여 Kubernetes에서 데이터베이스 클러스터를 클론하는 방법을 보여줍니다.
이 페이지의 단계에서는 소스 및 대상 데이터베이스 클러스터가 Google Kubernetes Engine에서 생성되고 백업 디스크가 Compute Engine 영구 디스크라고 가정합니다. 또한 데이터베이스에서 백업으로 사용되는 Compute Engine 영구 디스크가 다른 데이터베이스 클러스터에서 사용되지 않는다고 가정합니다.
다음 워크플로는 클론하는 데 사용되는 단계를 설명합니다.
- 소스 데이터베이스 클러스터 백업 디스크의 영구 볼륨 이름, Compute Engine 영구 디스크 핸들러와 같은 백업 디스크 정보를 식별합니다.
- 대상 데이터베이스 클러스터의 기존 백업 디스크를 사용하여 소스 데이터베이스 클러스터의 백업 디스크에 액세스하는
PersistentVolume
리소스를 만듭니다. livenessProbe
매개변수가 사용 중지되고 백업 디스크 정보가 추가된DBCluster
리소스 매니페스트 파일을 대상 데이터베이스 클러스터에 만들고 적용합니다.pgBackRest
명령어를 사용하여 소스 백업에 액세스할 수 있는지 확인합니다.pgBackRest
명령어를 사용하여 백업을 대상 데이터베이스 클러스터에 복원합니다.
시작하기 전에
- 소스 데이터베이스 클러스터 백업이 저장된 백업 디스크에 액세스할 수 있는지 확인합니다.
- 소스 데이터베이스 클러스터 백업 디스크를 대상 데이터베이스 클러스터에 마운트할 수 있어야 합니다. 디스크를 마운트할 수 있도록 하는 단계에 관한 자세한 내용은 영구 볼륨을 참고하세요.
- 소스 백업 디스크가 대상 데이터베이스 클러스터에 마운트되므로
pgBackRest.conf
파일은 있는 그대로 재사용됩니다. postgres
사용자로 데이터베이스에 로그인했는지 확인합니다.
소스 백업 디스크 정보 가져오기
복원 프로세스의 일환으로 소스 데이터베이스 클러스터의 백업 디스크 영구 볼륨 클레임 (PVC) 이름을 확인합니다. PVC는 Kubernetes 내에서 애플리케이션의 영구 스토리지를 관리하는 데 사용됩니다.
다음 샘플 명령어는 기본 PV 이름과 Compute Engine 영구 디스크 핸들러를 찾는 데 도움이 됩니다. 이 예에서 모든 백업 디스크는 Compute Engine 영구 디스크이며, 디스크 핸들러 식별자를 사용하여 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 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 이름입니다.
대상 데이터베이스 클러스터에 영구 볼륨 리소스 만들기
디스크 핸들러 이름을 사용하여 PersistentVolume
리소스를 만듭니다.
대상 데이터베이스 클러스터에서
PersistentVolume
매니페스트 파일을 만듭니다.apiVersion: v1 kind: PersistentVolume metadata: name: backupdisk spec: storageClassName: "${STORAGE_CLASS}" capacity: storage: "${DISK_SIZE}" accessModes: - ReadWriteOnce csi: driver: pd.csi.storage.gke.io volumeHandle: "${VOLUME_HANDLER}" fsType: "${FS_TYPE}"
매니페스트 파일을 적용합니다.
kubectl apply -f PV_FILENAME
다음을 바꿉니다.
- PV_FILENAME: 이전 단계에서 만든
PersistentVolume
매니페스트 파일의 이름입니다.
- PV_FILENAME: 이전 단계에서 만든
대상 데이터베이스 클러스터 만들기
복원 프로세스가 완료되는 동안 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: primarySpec: availabilityOptions: livenessProbe: "Disabled" adminUser: passwordRef: name: db-pw-DB_CLUSTER_NAME resources: memory: 100Gi cpu: 10 disks: - name: DataDisk size: 40Gi - name: BackupDisk size: ${DISK_SIZE} storageClass: ${STORAGE_CLASS} volumeName: backupdisk
다음을 바꿉니다.
DB_CLUSTER_NAME
: 이 데이터베이스 클러스터의 이름입니다(예:my-db-cluster
).ENCODED_PASSWORD
: 기본postgres
사용자 역할의 데이터베이스 로그인 비밀번호로, base64 문자열로 인코딩됩니다(예:ChangeMe123
의 경우Q2hhbmdlTWUxMjM=
).
매니페스트 파일을 적용합니다.
kubectl apply -f DBCLUSTER_FILENAME
다음을 바꿉니다.
- DBCLUSTER_FILENAME: 이전 단계에서 만든
DBCluster
매니페스트 파일의 이름입니다.
- DBCLUSTER_FILENAME: 이전 단계에서 만든
kubectl describe
명령어를 사용하여 데이터베이스 클러스터 리소스가 READY
상태인지 확인합니다.
대상 데이터베이스 클러스터에서 소스 백업 확인
pgBackRest
명령어를 실행하여 대상 데이터베이스 클러스터에서 소스 데이터베이스 클러스터 백업에 액세스할 수 있는지 확인합니다.
대상 데이터베이스 클러스터에서 데이터베이스 클러스터 포드 세부정보를 찾습니다.
kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database"
응답에는 클러스터 데이터베이스 포드의 이름이 포함됩니다.
데이터베이스 포드에 로그인합니다.
kubectl exec -ti DATABASE_POD_NAME -- /bin/bash
다음을 바꿉니다.
- DATABASE_POD_NAME : 이전 단계의 데이터베이스 클러스터 포드의 이름입니다.
pgBackRest
구성 파일을 업데이트하기 전에 pod를 중지합니다.supervisorctl.par stop postgres
pgBackRest
구성 파일을 업데이트합니다.cp /backup/pgbackrest.conf 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
데이터베이스 클러스터 포드에서 소스 백업을 확인합니다.
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
포드 다시 시작
복원 명령어가 완료되면 postgres
프로세스를 시작할 수 있습니다.
supervisorctl.par start postgres
postgres
프로세스가 시작되면 기본 인스턴스에 연결하고 쿼리를 실행하여 백업에서 데이터가 복원되었는지 확인할 수 있습니다. 자세한 내용은 Kubernetes에서 실행되는 AlloyDB Omni에 연결을 참고하세요.