본문 바로가기
서버구축 (WEB,DB)

Kubernetes(K8S) 환경 PostgreSQL 백업 및 복구

by 날으는물고기 2023. 11. 20.

Kubernetes(K8S) 환경 PostgreSQL 백업 및 복구

PostgreSQL 데이터베이스를 Kubernetes 환경에서 백업하고 복원하는 과정을 정리해 보겠습니다.

 

1. 백업 파일 생성

원본 PostgreSQL 컨테이너 내부로 접속하여 백업 파일을 생성합니다.

# 컨테이너 내부로 접속
kubectl -n {네임스페이스} exec -it {POD 이름} -- bash

# 백업 파일 생성
cd /var/lib/postgresql
pg_dumpall -U postgres > backup.sql

 

2. 백업 파일 이동

컨테이너 내부에서 생성된 백업 파일을 노드로 가져오거나, 다른 클러스터로 복사합니다.

  • 컨테이너 내부에서 백업 파일을 노드로 가져오기
kubectl -n {네임스페이스} cp {POD 이름}:/var/lib/postgresql/backup.sql backup.sql
  • 다른 클러스터로 백업 파일 복사 (선택)
scp backup.sql {user}@{ip}:{path}

백업 파일을 복원할 PostgreSQL 컨테이너 내부로 복사합니다.

kubectl -n {네임스페이스} cp backup.sql {POD 이름}:/var/lib/postgresql/backup.sql

 

3. 복원 실행

복원할 PostgreSQL 컨테이너 내부로 접속하여 백업을 실행합니다.

# 컨테이너 내부로 접속
kubectl -n {네임스페이스} exec -it {POD 이름} -- bash

# 복원 실행
psql -f backup.sql -U postgres

 

4. ConfigMap과 Secret 백업 및 복원

ConfigMap 및 Secret을 백업하고 복원하기 위한 절차를 추가합니다.

  • ConfigMap 백업
kubectl -n {네임스페이스} get configmap {configmap 이름} -o json --export > configmap-backup.json
  • ConfigMap 복원
kubectl -n {네임스페이스} create configmap {configmap 이름} --from-file=configmap-backup.json
  • Secret 백업
kubectl -n {네임스페이스} get secret {secret 이름} -o json --export > secret-backup.json
  • Secret 복원:
kubectl -n {네임스페이스} create secret generic {secret 이름} --from-file=secret-backup.json

 

5. tar 바이너리가 없는 경우 대체 방법

만약 tar 바이너리가 없어서 kubectl cp 명령어를 사용할 수 없는 경우, 다음 대체 방법을 사용할 수 있습니다.

(백업) 원본 DB → 노드

kubectl -n {네임스페이스} exec {POD 이름} -- cat /var/lib/postgresql/backup.sql > backup.sql

(복원) 노드 → 복원 DB

kubectl -n {네임스페이스} create configmap backup --from-file backup.sql

그리고 백업 파일을 복원할 PostgreSQL Pod의 YAML 파일에 다음과 같이 ConfigMap을 마운트합니다. 예를 들어, Pod의 Volume과 VolumeMount를 구성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: postgres-pod
spec:
  containers:
    - name: postgres-container
      image: postgres:latest
      ports:
        - containerPort: 5432
      volumeMounts:
        - mountPath: /var/lib/postgresql/backup.sql
          name: backup
          subPath: backup.sql
  volumes:
    - name: backup
      configMap:
        name: backup

위의 YAML 코드에서 /var/lib/postgresql/backup.sql 경로는 복원할 파일의 경로에 맞게 변경하십시오. 이렇게하면 ConfigMap을 Pod 내부로 마운트하여 데이터를 복원할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: postgres-pod
spec:
  containers:
    - name: postgres-container
      image: postgres:latest
      ports:
        - containerPort: 5432
      volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-data
  volumes:
    - name: postgres-data
      hostPath:
        path: /path/to/your/host/directory

위의 YAML 코드에서 /path/to/your/host/directory를 백업 파일이 있는 디렉토리 경로로 변경하십시오. 이렇게 하면 백업 파일이 Pod 내의 PostgreSQL 컨테이너로 마운트됩니다. 이제 데이터베이스 백업과 ConfigMap 백업, Secret 백업을 수행하고 필요한 경우 복원할 수 있는 포괄적인 프로세스가 제공됩니다.

 

PostgreSQL 데이터베이스를 삭제하고 백업된 SQL 파일을 수행하려면 다음 단계를 따를 수 있습니다.

  1. PostgreSQL 컨테이너 내부로 접속
    백업 파일을 수행하기 전에 PostgreSQL 컨테이너 내부로 접속해야 합니다.
    kubectl -n {네임스페이스} exec -it {POD 이름} -- bash
  2. 데이터베이스 삭제
    현재 데이터베이스를 삭제하기 위해 dropdb 명령어를 사용합니다.
    예를 들어, 데이터베이스 이름이 "mydatabase"인 경우:
    dropdb -U postgres mydatabase
    이 명령어를 사용하여 데이터베이스를 완전히 삭제할 수 있습니다. 주의해야 할 점은 이 작업은 데이터를 완전히 지우므로 신중하게 수행해야 합니다.
  3. 백업된 SQL 파일 수행
    데이터베이스를 삭제한 후, 백업된 SQL 파일을 다음과 같이 psql 명령어를 사용하여 실행할 수 있습니다.
    psql -U postgres -d postgres -a -f backup.sql
    여기서 -d 옵션은 목표 데이터베이스를 지정합니다. "postgres"는 기본 데이터베이스로 사용되며 백업된 데이터를 복원할 데이터베이스 이름으로 변경할 수 있습니다.

이러한 단계를 따르면 현재 데이터베이스를 삭제하고 백업된 SQL 파일을 새로운 데이터베이스에 복원할 수 있습니다. 데이터를 삭제하는 작업은 주의해야 하며 필요한 경우에만 수행해야 합니다.

 

PostgreSQL에서 다른 세션이 사용 중인 데이터베이스를 강제로 삭제하려면 다음 단계를 따를 수 있습니다. 그러나 이 작업은 주의해야 하며 신중하게 수행해야 합니다. 데이터베이스에 접속 중인 세션을 중단시키기 때문에 사용자에게 영향을 미칠 수 있습니다. (예시, 데이터베이스 : awx)

  1. 세션 확인
    먼저 사용 중인 세션을 확인하려면 다음 쿼리를 사용할 수 있습니다. 여기서 "awx"는 삭제하려는 데이터베이스 이름입니다.
    SELECT * FROM pg_stat_activity WHERE datname = 'awx';
    이 쿼리를 실행하면 현재 해당 데이터베이스에 연결된 세션 목록이 표시됩니다.
  2. 세션 종료
    데이터베이스를 사용하는 세션을 종료하려면 pg_terminate_backend 함수를 사용합니다. 예를 들어, 특정 세션을 종료하려면 다음과 같이 사용합니다. 여기서 pg_terminate_backend 함수에는 세션 ID가 필요합니다. 여기서 {pid}는 종료하려는 세션의 프로세스 ID입니다.
    SELECT pg_terminate_backend({pid});
    위의 쿼리를 실행하면 해당 세션을 종료할 수 있습니다. 이 작업을 반복하여 모든 원하는 세션을 종료할 수 있습니다.아래 명령을 실행하면 해당 데이터베이스에 대한 활성 세션을 모두 종료합니다.
    SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'awx' AND state = 'active';
    pg_stat_activity 뷰를 사용하여 client_addr가 "127.0.0.1"이 아닌 데이터베이스 세션을 서브쿼리로 가져와서 pg_terminate_backend로 세션을 종료하는 쿼리를 아래와 같이 작성할 수 있습니다.
    SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'awx' -- 데이터베이스 이름
    AND client_addr <> '127.0.0.1';
    이 쿼리는 'awx' 데이터베이스에서 client_addr가 '127.0.0.1'이 아닌 세션을 찾아서 해당 세션을 pg_terminate_backend 함수를 사용하여 종료합니다. 이를 사용하여 로컬이 아닌 원격 세션을 종료할 수 있습니다.
  3. 데이터베이스 삭제
    세션을 종료한 후, 다시 dropdb 명령어를 사용하여 데이터베이스를 삭제합니다.
    dropdb -U postgres awx
    이제 데이터베이스를 삭제할 수 있어야 합니다.
    이러한 절차를 따르면 다른 사용자의 세션을 종료하고 데이터베이스를 삭제할 수 있습니다. 그러나 주의해야 하며, 데이터베이스에 접속 중인 사용자에게 영향을 미칠 수 있으므로 신중하게 사용해야 합니다.
  4. 데이터베이스 생성
    데이터베이스가 없는 경우, 원하는 데이터베이스를 먼저 생성해야 합니다. 예를 들어, "awx" 데이터베이스를 생성하려면 다음 명령을 사용하세요.
    createdb -U postgres awx
    이렇게 하면 "awx" 데이터베이스가 생성됩니다.
    awx 데이터베이스를 생성하고 awx 사용자를 소유자로 지정합니다.
    CREATE DATABASE awx WITH OWNER = awx;
    위의 명령은 awx 데이터베이스를 생성하고, 이 데이터베이스의 소유자(Owner)를 awx 사용자로 지정합니다. 이제 awx 사용자는 awx 데이터베이스의 소유자 권한을 가지게 됩니다.
  5. 권한 부여 (선택)
    awx 사용자에 대한 추가 권한을 설정하려면 필요한 권한을 부여할 수 있습니다. 예를 들어, awx 사용자에게 데이터베이스 관리 권한을 부여하려면 다음과 같이 수행할 수 있습니다.
    GRANT ALL PRIVILEGES ON DATABASE awx TO awx;
    위의 명령은 awx 사용자에게 awx 데이터베이스에 대한 모든 권한을 부여합니다.

이러한 방법을 통해서 사용중인 데이터베이스를 완전히 삭제하고 재생성할 수 있습니다.

728x90

댓글