후니의 IT인프라 사전

5주차 - 백업 (AWS S3) & PITR 복원(도전과제) 본문

프로젝트&&스터디/DOIK 스터디

5주차 - 백업 (AWS S3) & PITR 복원(도전과제)

james_janghun 2022. 6. 25. 18:33

 

1. AWS CLI를 설치합니다.

# Install aws cli v2
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
apt install unzip -y && unzip awscliv2.zip
sudo ./aws/install
complete -C '/usr/local/bin/aws_completer' aws

# 이후 aws configure 작업 실시

aws configure

 

2. 백업할 S3 버킷 생성

# S3 버킷 생성
aws s3 mb s3://버킷(유일한 이름) --region ap-northeast-2

 

3. S3 버킷에 대해 Secret으로 유저정보를 저장

# My BUCKET Name 변수 지정
MyS3=<My BUCKET Name> 
MyS3=cnpg-janghun

# AWS IAM User 정보를 Secret 으로 생성
kubectl create secret generic aws-creds \
  --from-literal=ACCESS_KEY_ID=<access key here> \
  --from-literal=ACCESS_SECRET_KEY=<secret key here>

# Secret 으로 생성 확인
kubectl get secret aws-creds -o json | jq

 

4. AWS S3 백업 경로를 설정하여 클러스터에 반영

# 클러스터 신규 생성 + AWS S3 백업 설정
cat ~/DOIK/5/mycluster3.yaml
...
  backup:
    barmanObjectStore:
      destinationPath: "s3://${BUCKET}"
      s3Credentials:
        accessKeyId:
          name: aws-creds
          key: ACCESS_KEY_ID
        secretAccessKey:
          name: aws-creds
          key: ACCESS_SECRET_KEY

BUCKET=$MyS3 envsubst < ~/DOIK/5/mycluster3.yaml | kubectl apply -f -
 
# S3 하위 디렉터리 포함(--recursive) 조회
aws s3 ls s3://$MyS3 --recursive --human-readable --summarize
2022-06-17 15:49:49   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000001
2022-06-17 15:49:52   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000002
2022-06-17 15:49:54  338 Bytes mycluster/wals/0000000100000000/000000010000000000000002.00000028.backup
2022-06-17 15:50:49   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000003
2022-06-17 15:50:51   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000004
2022-06-17 15:50:53  338 Bytes mycluster/wals/0000000100000000/000000010000000000000004.00000028.backup
2022-06-17 15:55:50   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000005
2022-06-17 15:56:00   16.0 MiB mycluster/wals/0000000100000000/000000010000000000000006
Total Objects: 8
   Total Size: 96.0 MiB

 

5. 백업 실행

  백업 명령을 통해서 S3에 수동으로 백업할 수 있다.

# 백업 실행
cat << EOF | kubectl apply -f -
apiVersion: postgresql.cnpg.io/v1
kind: Backup
metadata:
  name: first-backup
spec:
  cluster:
    name: mycluster
EOF

# 백업 확인
kubectl get backup
NAME           AGE   CLUSTER     PHASE       ERROR
first-backup   2m    mycluster   completed

kubectl describe backup
...

aws s3 ls s3://$MyS3 --recursive --human-readable --summarize

 

 

6. 스케줄 백업

  정기적인 스케줄 백업이 필요하면 아래의 yaml로 정기등록 할 수 있다.

apiVersion: postgresql.cnpg.io/v1
kind: ScheduledBackup
metadata:
  name: backup-example
spec:
  schedule: "0 0 0 * * *"
  backupOwnerReference: self
  cluster:
    name: pg-backup

* 참고 : go 에서는 schedule을 총 6개로 표시하고 있음. 첫 칸부터 초, 분, 시, 일, 월, 요일  (참조문서)

Field name   | Mandatory? | Allowed values  | Allowed special characters
----------   | ---------- | --------------  | --------------------------
Seconds      | Yes        | 0-59            | * / , -
Minutes      | Yes        | 0-59            | * / , -
Hours        | Yes        | 0-23            | * / , -
Day of month | Yes        | 1-31            | * / , - ?
Month        | Yes        | 1-12 or JAN-DEC | * / , -
Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?

 

실제로 실행해보면 schedule이 0 0 0 이므로 익일 0시 0분 0초에 진행한다고 예정을 한다.

kubectl describe scheduledbackup

 

7. 백업 된 데이터로 복원하기(실패)

(해당 내용은 지속적으로 도전하고 있으나 지속 실패..)

일단 S3에 백업된 데이터로 새로운 클러스터를 bootstrap 방식으로 재생시켜야하는데, 잘 작동되지 않음.

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-restore
spec:
  [...]

  superuserSecret:
    name: superuser-secret

  bootstrap:
    recovery:
      source: clusterBackup

  externalClusters:
    - name: clusterBackup
      barmanObjectStore:
        destinationPath: https://STORAGEACCOUNTNAME.blob.core.windows.net/CONTAINERNAME/
        azureCredentials:
          storageAccount:
            name: recovery-object-store-secret
            key: storage_account_name
          storageKey:
            name: recovery-object-store-secret
            key: storage_account_key
        wal:
          maxParallel: 8

 

 

이상으로 S3를 통한 백업을 알아보았습니다. 퍼블릭 클라우드를 통해서 별도로 백업할 수 있다는 것은 매우 큰 장점입니다.