로컬 백업을 사용하여 Kubernetes에서 데이터베이스 클러스터 클론

이 페이지에서는 AlloyDB Omni 데이터베이스 클러스터의 로컬 백업을 사용하여 Kubernetes에서 데이터베이스 클러스터를 클론하는 방법을 보여줍니다.

이 페이지의 단계에서는 소스 및 대상 데이터베이스 클러스터가 Google Kubernetes Engine에서 생성되고 백업 디스크가 Compute Engine 영구 디스크라고 가정합니다. 또한 데이터베이스에서 백업으로 사용되는 Compute Engine 영구 디스크가 다른 데이터베이스 클러스터에서 사용되지 않는다고 가정합니다.

다음 워크플로는 클론하는 데 사용되는 단계를 설명합니다.

  1. 소스 데이터베이스 클러스터 백업 디스크의 영구 볼륨 이름, Compute Engine 영구 디스크 핸들러와 같은 백업 디스크 정보를 식별합니다.
  2. 대상 데이터베이스 클러스터의 기존 백업 디스크를 사용하여 소스 데이터베이스 클러스터의 백업 디스크에 액세스하는 PersistentVolume 리소스를 만듭니다.
  3. livenessProbe 매개변수가 사용 중지되고 백업 디스크 정보가 추가된 DBCluster 리소스 매니페스트 파일을 대상 데이터베이스 클러스터에 만들고 적용합니다.
  4. pgBackRest 명령어를 사용하여 소스 백업에 액세스할 수 있는지 확인합니다.
  5. pgBackRest 명령어를 사용하여 백업을 대상 데이터베이스 클러스터에 복원합니다.

시작하기 전에

  • 소스 데이터베이스 클러스터 백업이 저장된 백업 디스크에 액세스할 수 있는지 확인합니다.
  • 소스 데이터베이스 클러스터 백업 디스크를 대상 데이터베이스 클러스터에 마운트할 수 있어야 합니다. 디스크를 마운트할 수 있도록 하는 단계에 관한 자세한 내용은 영구 볼륨을 참고하세요.
  • 소스 백업 디스크가 대상 데이터베이스 클러스터에 마운트되므로 pgBackRest.conf 파일은 있는 그대로 재사용됩니다.
  • postgres 사용자로 데이터베이스에 로그인했는지 확인합니다.

소스 백업 디스크 정보 가져오기

복원 프로세스의 일환으로 소스 데이터베이스 클러스터의 백업 디스크 영구 볼륨 클레임 (PVC) 이름을 확인합니다. PVC는 Kubernetes 내에서 애플리케이션의 영구 스토리지를 관리하는 데 사용됩니다.

다음 샘플 명령어는 기본 PV 이름과 Compute Engine 영구 디스크 핸들러를 찾는 데 도움이 됩니다. 이 예에서 모든 백업 디스크는 Compute Engine 영구 디스크이며, 디스크 핸들러 식별자를 사용하여 Compute Engine VM 전반에서 액세스할 수 있습니다.

  1. 대상 데이터베이스 클러스터에 연결하여 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
  2. 이전 단계의 백업 디스크 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).
  3. 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 리소스를 만듭니다.

  1. 대상 데이터베이스 클러스터에서 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}"
    
  2. 매니페스트 파일을 적용합니다.

      kubectl apply -f PV_FILENAME

    다음을 바꿉니다.

    • PV_FILENAME: 이전 단계에서 만든 PersistentVolume 매니페스트 파일의 이름입니다.

대상 데이터베이스 클러스터 만들기

복원 프로세스가 완료되는 동안 livenessProbe 매개변수를 일시적으로 사용 중지하여 데이터베이스 클러스터를 만듭니다.

  1. 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=).

  2. 매니페스트 파일을 적용합니다.

      kubectl apply -f DBCLUSTER_FILENAME

    다음을 바꿉니다.

    • DBCLUSTER_FILENAME: 이전 단계에서 만든 DBCluster 매니페스트 파일의 이름입니다.

kubectl describe 명령어를 사용하여 데이터베이스 클러스터 리소스가 READY 상태인지 확인합니다.

대상 데이터베이스 클러스터에서 소스 백업 확인

pgBackRest 명령어를 실행하여 대상 데이터베이스 클러스터에서 소스 데이터베이스 클러스터 백업에 액세스할 수 있는지 확인합니다.

  1. 대상 데이터베이스 클러스터에서 데이터베이스 클러스터 포드 세부정보를 찾습니다.

      kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database"

    응답에는 클러스터 데이터베이스 포드의 이름이 포함됩니다.

  2. 데이터베이스 포드에 로그인합니다.

      kubectl exec -ti DATABASE_POD_NAME  -- /bin/bash

    다음을 바꿉니다.

    • DATABASE_POD_NAME : 이전 단계의 데이터베이스 클러스터 포드의 이름입니다.
  3. pgBackRest 구성 파일을 업데이트하기 전에 pod를 중지합니다.

      supervisorctl.par stop postgres
  4. 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
  5. 데이터베이스 클러스터 포드에서 소스 백업을 확인합니다.

    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에 연결을 참고하세요.

다음 단계