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

이 문서에서는 AlloyDB Omni 데이터베이스 클러스터의 로컬 백업을 사용하여 Kubernetes에서 데이터베이스 클러스터를 클론하는 방법을 설명합니다.

이 문서에서는 다음을 가정합니다.

  • 소스 및 타겟 데이터베이스 클러스터는 Google Kubernetes Engine에서 생성되며 백업 디스크는 Compute Engine 영구 디스크입니다.
  • 데이터베이스의 백업 디스크로 사용되는 Compute Engine 영구 디스크는 다른 데이터베이스 클러스터에서 사용하지 않습니다.

데이터베이스 클러스터를 클론하려면 다음 단계를 따르세요.

  1. 소스 데이터베이스 클러스터 백업 디스크의 영구 볼륨 이름 및 Compute Engine 영구 디스크 핸들러와 같은 백업 디스크 정보를 식별합니다. 소스 데이터베이스 클러스터에 백업 기능을 사용 설정했으며 백업이 하나 이상 성공적으로 완료되었는지 확인합니다. 이러한 조건이 충족되지 않으면 백업 사용 설정 및 예약의 안내를 따르세요.
  2. 대상 데이터베이스 클러스터의 기존 백업 디스크를 사용하여 소스 데이터베이스 클러스터의 백업 디스크에 액세스하는 PersistentVolume 리소스를 만듭니다.
  3. livenessProbe 매개변수가 사용 중지되고 백업 디스크 정보가 추가된 DBCluster 리소스 매니페스트 파일을 대상 데이터베이스 클러스터에 만들고 적용합니다.
  4. pgBackRest 명령어를 사용하여 소스 백업에 액세스할 수 있는지 확인합니다.
  5. pgBackRest 명령어를 사용하여 백업을 대상 데이터베이스 클러스터에 복원합니다.

시작하기 전에

  • 소스 데이터베이스 클러스터 백업이 저장된 백업 디스크에 액세스할 수 있는지 확인합니다.
  • 소스 데이터베이스 클러스터 백업 디스크를 대상 데이터베이스 클러스터에 마운트할 수 있어야 합니다. 자세한 내용은 영구 볼륨을 참고하세요. 기본 스토리지 백엔드에서 ReadOnlyMany (ROX) 액세스를 지원하지 않는 경우 백업 디스크가 소스 클러스터의 포드에서 사용되지 않는지 확인합니다.
  • 소스 백업 디스크가 대상 데이터베이스 클러스터에 마운트되므로 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 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 리소스를 만듭니다.

  1. 대상 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 리소스의 이름입니다.
  2. 매니페스트 파일을 적용합니다.

      kubectl apply -f PV_FILENAME

    다음을 바꿉니다.

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

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

livenessProbe 매개변수를 일시적으로 사용 중지하여 데이터베이스 클러스터를 만듭니다. 복원이 완료되면 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:
        databaseVersion: "15.7.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당 8GB로 설정하는 것이 좋습니다. 예를 들어 CPU_COUNT2로 설정하는 경우 memory16Gi로 설정하는 것이 좋습니다.

    • DATA_DISK_SIZE: 데이터베이스 인스턴스당 디스크 크기입니다(예: 10Gi).

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

데이터베이스 클러스터 구성

데이터베이스 클러스터를 클론한 후 데이터베이스 클러스터 사양을 구성합니다. 다음 명령어를 사용하여 livenessProbe 매개변수를 사용 설정해야 합니다.

    kubectl patch dbcluster DBCLUSTER_FILENAME --type merge -p '{"spec":{"primarySpec":{"availabilityOptions":{"livenessProbe":"Enabled"}}}}'

다음 단계