백업

K8 환경에서의 Couchbase 백업/복원

1. 소개

데이터를 주기적으로 백업하는 것은 모든 프로덕션 데이터베이스 배포에서 중요한 부분으로, 재해 발생 시 데이터 복구를 보장하고 복원이 필요할 때 데이터 불일치를 최소화하는 데 도움이 됩니다.

카우치베이스는 다음을 제공합니다. cbbackupmgr 유틸리티는 수년에 걸쳐 개선되어 훨씬 더 높은 성능으로 대규모 데이터 세트를 백업하는 엔터프라이즈급 백업 및 복원 도구가 되었으므로 프로덕션에서 이 도구를 사용할 것을 권장합니다. 다음 사항을 언급할 가치가 있습니다. 카우치베이스 서버 6.5 백업-스토리지 엔진을 전면 개편하고 더 높은 압축률을 도입하여 백업-복원 성능이 크게 향상되고 각 백업 스냅샷에 필요한 스토리지가 줄어들어 비용을 절감할 수 있게 되었습니다.


2. 모범 사례

하지만 cbbackupmgr 이 Couchbase_HOME 아래에 존재한다면, 이는 not 클러스터의 활성 노드 중 하나에서 이 유틸리티를 실행하는 것이 좋습니다. 활성 요청의 리소스를 놓고 경쟁하게 되어 데이터베이스 시스템의 성능을 저해할 수 있기 때문입니다.

따라서 데이터베이스 클러스터와 백업 노드 모두에 대해 리소스를 더 잘 관리할 수 있도록 Couchbase 바이너리만 설치되고 Couchbase 서비스는 실행되지 않는 별도의 인스턴스(백업 및 복원 필요 시)를 제공하는 것이 가장 좋습니다.

Backup Manager

위 그림에서 볼 수 있듯이, 5개의 노드로 구성된 Couchbase 클러스터 외에 별도의 백업/복구 노드가 프로비저닝되어 있습니다. 또 다른 모범 사례는 데이터베이스의 필수 스냅샷을 저장할 수 있는 충분한 공간을 확보하기 위해 Couchbase 데이터 세트 크기의 5배 이상을 저장할 수 있는 충분한 스토리지를 할당하는 것입니다. 복구 지점 목표 (RPO)를 설정할 수 있습니다.

3. 백업 전략

cbbackupmgr 는 DBA가 비즈니스 요구 사항에 가장 적합한 백업 전략을 구현할 수 있는 명령 모음을 제공합니다. 다음은 몇 가지 명령어입니다:

이러한 명령을 사용하여 다음 세 가지 백업 전략 중 하나를 구현할 수 있습니다. 문서. 아래 예에서는 다음과 같이 설명합니다. 정기 병합 전략의 맥락에서, 쿠버네티스 환경 내에서 실행되는 카우치베이스 클러스터의 맥락에서.

4. 주기적 병합

이 백업 전략은 변경 사항을 백업하는 데 가장 적은 시간이 필요하고 압축 및 병합 프로세스 중에 데이터를 통합하는 데 데이터베이스 클러스터의 리소스 소비가 거의 없으므로 데이터베이스 오버헤드가 가장 낮습니다(백업 노드에서 발생하므로).

간단히 설명하면 다음과 같습니다. 정기 병합 전략이 작동합니다:

  1. 다음을 사용하여 백업 리포지토리 설정 cbbackupmgr 구성
  2. 다음을 사용하여 데이터베이스의 증분 백업(리포지토리에 있음)을 수행합니다. cbbackupmgr 백업
  3. 다음을 사용하여 백업 압축을 수행합니다. cbbackupmgr 컴팩트 를 사용하여 디스크 공간을 효율적으로 사용할 수 있습니다.
  4. 다음을 사용하여 가장 오래된 백업을 병합합니다. cbbackupmgr 병합 를 사용하여 리포지토리의 백업 수가 무한정 늘어나지 않고 공간 요구 사항을 계속 확인할 수 있습니다.

참고: 위의 단계는 다음에서 캡처한 것입니다. 백업-위드-주기적-병합.sh 스크립트를 사용하여 주기적으로 백업하는 데 사용할 것입니다.

5. 카우치베이스 데이터 백업

지난 블로그에서 Couchbase Autonomous Operator에 대해 단계별로 설명한 바 있습니다. 퍼시스턴트 볼륨을 사용하여 자가 복구가 가능한 고가용성 Couchbase 클러스터를 배포하는 방법. 이러한 단계를 따라 클러스터를 이미 배포했다고 가정하면, 아래 단계에서는 다음을 사용하여 자동 백업 기능을 설정하는 방법을 설명합니다. 크론잡. 데이터를 정기적으로 백업하고 실제로 재해 복구가 필요하기 전에 백업 복원을 테스트하여 복원 프로세스를 확인하는 것이 가장 좋은 방법입니다.

이 기능은 운영자가 제공하지 않으며 클러스터 관리자가 백업 정책을 정의하고 데이터 복원을 테스트하도록 맡깁니다. 이 섹션에서는 필요한 기능을 수행하는 데 사용할 수 있는 몇 가지 일반적인 패턴에 대해 설명합니다.

5.1. 스토리지 클래스 생성

아래의 쿠버네티스 리소스 정의는 전체 클러스터의 상태를 저장하는 백업의 일반적인 배열을 보여줍니다. 먼저 StorageClass 를 사용하여 포맷합니다. xfs 를 사용하여 최적의 성능을 구현할 수 있습니다.

# 백업/복원 작업을 위한 스토리지 클래스 생성
apiVersion: storage.k8s.io/v1
종류: StorageClass
메타데이터:
  레이블
    k8s-addon: storage-aws.addons.k8s.io
  이름: gp2-백업-스토리지
매개변수
  유형: gp2
  fsType: xfs
프로비저너: 쿠버네티스.io/aws-ebs
리클레임폴리시: Retain
볼륨바인딩모드: WaitForFirstConsumer

에서 위의 정의를 사용하여 backup-sc.yaml 파일을 만들면 다음과 같이 스토리지 클래스를 만들 수 있습니다:

$ kubectl create -f backup-sc.yaml -n emart

5.2. 영구 볼륨 만들기

영구 볼륨은 장애 발생 시 데이터를 안전하게 보관하기 위해 청구됩니다. 예상 데이터 세트 크기, 데이터 보존 일수, 증분 백업 사용 여부에 따라 클레임 크기를 계획해야 합니다.

# 백업 스토리지 볼륨 정의
종류를 정의합니다: 퍼시스턴트볼륨클레임
API 버전: v1
메타데이터:
  이름: 백업-pvc
spec:
  storageClassName: gp2-backup-storage
  리소스
    요청
      storage: 50Gi
  accessModes:
    - 읽기-쓰기-한 번

위의 정의를 backup-pvc.yaml 를 클릭하고 클레임을 생성합니다:

$ kubectl create -f backup-pvc.yaml -n emart

5.3. 백업 리포지토리 구성

데이터의 스냅샷을 주기적으로 찍으려면 먼저 백업 아카이브 위치를 구성해야 합니다. 영구 볼륨을 마운트하고 백업 리포지토리를 초기화하는 작업이 만들어집니다. 리포지토리의 이름은 카우치베이스 이후 사양에서 클러스터 이름에 매핑됩니다.

# 백업 리포지토리 만들기
종류: Job
api 버전: batch/v1
메타데이터
  이름: 카우치베이스-클러스터-백업-구성
spec:
  template:
    spec:
      컨테이너:
        - 이름: 백업 구성
          이미지: couchbase/server:enterprise-6.5.0
          명령을 실행합니다: ["cbbackupmgr", "config", "--archive", "/backups", "--repo", "couchbase"]
          볼륨 마운트:
            - 이름: "couchbase-cluster-backup-volume"
              마운트경로: "/backups"
      볼륨:
        - 이름: 카우치베이스-클러스터-백업-볼륨
          퍼시스턴트볼륨클레임:
            클레임명: 백업-pvc
      restartPolicy: Never

위의 정의를 config.yaml 를 클릭하고 백업 리포지토리를 만듭니다:

$ kubectl create -f config.yaml -n emart

5.3. 크론잡으로 백업 실행

에 설명된 대로 크론잡을 만듭니다. 주기적-백업.yaml 파일을 생성하고, a) 포드에서 백업 스크립트를 다운로드하고 b) 스크립트를 실행하고 영구 스토리지 볼륨을 사용하여 클러스터 데이터를 백업하는 방식으로 Couchbase 클러스터를 백업합니다.

kind: 크론잡
apiVersion: batch/v1beta1
메타데이터:
  이름: 카우치베이스-클러스터-백업-생성
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          컨테이너:
            #D백업을 주기적으로 병합하는 스크립트를 삭제하여 실행할 때마다 새 스크립트를 가져올 수 있도록 합니다.
            - 이름: delete-script
              이미지: couchbase/server:enterprise-6.5.0
              명령을 실행합니다: ["rm", "/backups/backup-with-periodic-merge.sh"]
              볼륨 마운트:
                - 이름: "couchbase-cluster-backup-volume"
                  마운트경로 "/backups"
          initContainers:
            #Dgit 리포지토리에서 백업 스크립트 다운로드
            - 이름: wget-backup-script
              이미지: couchbase/server:enterprise-6.5.0
              명령을 실행합니다: ["wget", "https://raw.githubusercontent.com/couchbaselabs/cboperator-hol/master/eks/cb-operator-guide/files/sh/backup-with-periodic-merge.sh", "-P", "/backups/."]
              볼륨 마운트:
                - 이름: "couchbase-cluster-backup-volume"
                  mountPath: "/backups"
            1TP5백업 스크립트의 모드를 실행으로 변경합니다.
            - 이름: chmod-script
              이미지: couchbase/server:enterprise-6.5.0
              명령을 실행합니다: ["chmod", "700", "/backups/backup-with-periodic-merge.sh"]
              볼륨 마운트:
                - 이름: "couchbase-cluster-backup-volume"
                  마운트경로 "/backups"
            1TP5a) 백업 b) 압축 c) 각 스냅샷과 병합을 수행할 수 있도록 스크립트를 실행합니다.
            - 이름: 주기적 병합
              이미지: couchbase/server:enterprise-6.5.0
              명령을 실행합니다: ["sh", "-c" ,"/backups/backup-with-periodic-merge.sh --cluster cbdemo-srv.emart.svc"]
              볼륨 마운트:
                - 이름: "couchbase-cluster-backup-volume"
                  마운트 경로 "/backups"
          볼륨
            - 이름: 카우치베이스-클러스터-백업-볼륨
              퍼시스턴트볼륨클레임:
                클레임명: 백업-pvc
          restartPolicy: Never

위의 YAML에서는 5분마다 백업을 실행하고 있지만, 비즈니스 RPO를 충족할 수 있도록 빈도를 변경할 수 있습니다. Couchbase 클러스터는 네임스페이스 내에 배포되므로 emart 따라서 동일한 네임스페이스에 백업 크론잡을 배포합니다:

$ kubectl 적용 -f 주기적-백업.yaml -n emart

크론잡.배치/카우치베이스-클러스터-백업-생성 생성

5.4 정기 백업 작업 확인

이 시점에서 5분마다 크론잡이 시작되는 것을 볼 수 있습니다. 그리고 일단 활성화되면 세 번 실행됩니다. initContainers (와겟-백업-스크립트, chmod-스크립트, 주기적-병합)를 순차적으로 실행한 다음 코인테이너 (삭제-스크립트):

$ kubectl get pods -n emart -w

이름 준비 상태 재시작 나이
백업-노드 1/1 실행 중 0 1일
cbdemo-0000 1/1 Running 0 5d
cbdemo-0001 1/1 Running 0 5일
cbdemo-0002 1/1 Running 0 5d
CBDEMO-0003 1/1 Running 0 5D
CBDEMO-0004 1/1 Running 0 5D
COUCHBASE-OPERATOR-7654D844CB-GN4BW 1/1 Running 0 5D
COUCHBASE-OPERATOR-ADMISSION-7FF868F54C-5PKLX 1/1 Running 0 5d

couchbase-cluster-backup-create-1580357820-tz2hg 0/1 보류 중 0 2s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 보류 중 0 2s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 Init:0/3 0 2s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 Init:1/3 0 3s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 Init:2/3 0 4s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 Init:2/3 0 6s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 PodInitializing 0 27s
couchbase-cluster-backup-create-1580357820-tz2hg 0/1 Completed 0 30s

각각의 로그를 볼 수 있습니다. initContainers 포드에 상태가 표시된 후 완료. . initContainers 우리가 관심을 갖는 것은 주기적 병합:

$ kubectl 로그 couchbase-cluster-backup-create-1580357820-tz2hg -n emart -c 주기적-병합


---------------------------------------------------------
1단계: 백업 시작 : 2020년 1월 30일 목요일 04:17:12 UTC 2020
백업 실행 중...
 명령: cbbackupmgr 백업 --아카이브 /backups --repo couchbase --클러스터 couchbase://cbdemo-srv.emart.svc --사용자 이름 관리자 --password 암호 --스레드 2
경고: 터미널 너비가 80자 미만이므로 진행률 표시줄을 사용할 수 없습니다.
백업이 성공적으로 완료되었습니다.
"gamesim-sample" 버킷 백업에 성공했습니다.
변이 백업됨; 586, 변이 백업에 실패했습니다: 0
삭제 백업 완료: 0, 삭제 백업에 실패했습니다: 0
"travel-sample" 버킷 백업 성공
변이 백업됨; 0, 변이 백업에 실패했습니다: 0
삭제 백업 성공: 0, 삭제 백업에 실패했습니다: 0
---------------------------------------------------------
2단계 시작: 압축 : Thu Jan 30 04:17:20 UTC 2020
백업 스냅샷 목록 ...

2020-01-28T23_01_37.592188562Z
2020-01-28T23_03_34.160387835Z
2020-01-28T23_05_08.103740281Z
2020-01-30T04_17_12.702824188Z
마지막 백업 이름: 2020-01-30T04_17_12.702824188Z
백업 압축 중...
 명령: cbbackupmgr compact --archive /backups --repo couchbase --backup 2020-01-30T04_17_12.702824188Z
압축 성공, 0바이트 해제됨
---------------------------------------------------------
3단계: 이전 백업 병합 시작 : 2020-01-30 Thu 04:17:24 UTC 2020

 크기 항목 이름
 604.93MB - + 카우치베이스
 192.00MB - + 2020-01-28T23_01_37.592188562Z
 192.00MB - + 맥주 샘플
 37B 0 analytics.json
 414B 0 bucket-config.json
 192.00MB 7303 + 데이터
 192.00MB 7303 1024 샤드
 2B 0 full-text.json
 1.94KB 1 gsi.json
 784B 1 views.json
 192.02MB - + 2020-01-28t23_03_34.160387835z
 192.02MB - + travel-sample
 0B 0 analytics.json
 416B 0 bucket-config.json
 192.00MB 31591 + 데이터
 192.00MB 31591 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json
 64.02MB - + 2020-01-28t23_05_08.103740281z
 64.02MB - + travel-sample
 0B 0 analytics.json
 416B 0 bucket-config.json
 64.00MB 0 + 데이터
 64.00MB 0 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json
 156.89MB - + 2020-01-30t04_17_12.702824188z
 92.88MB - + gamesim-sample
 0B 0 analytics.json
 417B 0 버킷-config.json
 92.88MB 586 + 데이터
 92.88MB 586 1024 샤드
 2B 0 full-text.json
 1.95KB 1 gsi.json
 501B 1 views.json
 64.02MB - + 여행 샘플
 0B 0 analytics.json
 416B 0 bucket-config.json
 64.00MB 0 + 데이터
 64.00MB 0 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json
시작 2020-01-28T23_01_37.592188562Z, 종료 2020-01-28T23_03_34.160387835Z
이전 백업을 병합하는 중...
 명령: cbbackupmgr merge --archive /backups --repo couchbase --start 2020-01-28T23_01_37.592188562Z --end 2020-01-28T23_03_34.160387835Z

병합이 성공적으로 완료되었습니다.

크기 항목 이름
 412.92MB - + 카우치베이스
 192.02MB - + 2020-01-28t23_03_34.160387835z
 192.02MB - + travel-sample
 37B 0 analytics.json
 416B 0 bucket-config.json
 192.00MB 31591 + 데이터
 192.00MB 31591 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json
 64.02MB - + 2020-01-28t23_05_08.103740281z
 64.02MB - + travel-sample
 0B 0 analytics.json
 416B 0 bucket-config.json
 64.00MB 0 + 데이터
 64.00MB 0 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json
 156.89MB - + 2020-01-30t04_17_12.702824188z
 92.88MB - + gamesim-sample
 0B 0 analytics.json
 417B 0 버킷-config.json
 92.88MB 586 + 데이터
 92.88MB 586 1024 샤드
 2B 0 full-text.json
 1.95KB 1 gsi.json
 501B 1 views.json
 64.02MB - + 여행 샘플
 0B 0 analytics.json
 416B 0 bucket-config.json
 64.00MB 0 + 데이터
 64.00MB 0 1024 샤드
 2B 0 full-text.json
 15.57KB 10 gsi.json
 2B 0 views.json

참고: 위의 로그에서 볼 수 있듯이 병합 단계 이전에는 4개의 백업을 사용할 수 있었고 병합 후에는 3개의 백업 스냅샷이 있습니다. 복원 포인트 in 백업-위드-주기적-병합.sh 스크립트.

이것으로 백업 섹션을 마칩니다.

6. 복원

백업과 마찬가지로, Kubernetes 작업으로 데이터를 새로운 Couchbase 클러스터로 복원할 수 있습니다.

kind: Job
apiVersion: batch/v1
메타데이터:
  이름: couchbase-cluster-restore
spec:
  template:
    spec:
      컨테이너:
        - 이름: 카우치베이스-클러스터-복구
          이미지: couchbase/server:enterprise-6.0.2
          명령을 실행합니다: ["cbbackupmgr", "restore", "--archive", "/backups", "--repo", "couchbase", "--cluster", "couchbase://cbdemo-srv.emart.svc", "--username", "Administrator", "--password", "password"]
          볼륨 마운트:
            - 이름: "couchbase-cluster-backup-volume"
              마운트 경로 "/backups"
      볼륨:
        - 이름: 카우치베이스-클러스터-백업-볼륨
          퍼시스턴트볼륨클레임:
            클레임명: 백업-pvc
      restartPolicy: Never

임시 백업-복원 파드를 생성하여 사용 가능한 백업을 확인하거나 문제를 해결하려는 경우 동일한 퍼시스턴트 볼륨 클레임 를 새 파드에 추가합니다. 저장할 수 있는 파드의 정의는 다음과 같습니다. 백업-팟.yaml:

apiVersion: v1
종류: 파드
메타데이터:
  이름: 백업-노드
spec:  파드 콘텐츠의 # 사양
  컨테이너의 사양:
    - 이름: 백업-포드
      이미지: 카우치베이스/서버:엔터프라이즈-6.5.0
      # 그냥 돌리고 영원히 기다린다.
      명령어를 실행한다: [ "/bin/bash", "-c", "--" ]를 실행합니다.
      args: [ "while true; do sleep 30; done;" ] ]
      볼륨 마운트:
        - 이름: "couchbase-cluster-backup-volume"
          mountPath: "/backups"
  볼륨:
    - 이름: 카우치베이스-클러스터-백업-볼륨
      퍼시스턴트볼륨클레임:
        클레임명: 백업-pvc
  restartPolicy: Never

kubectl을 실행하여 일시적으로 파드를 불러온다:

$ kubectl apply -f br/backup-pod.yaml -n emart
$ kubectl get pods -n emart

이름 준비 상태 재시작 나이
백업-노드 1/1 실행 중 0 3d1h
cbdemo-0000 1/1 Running 0 7d1h
cbdemo-0001 1/1 Running 0 7d1h
CBDEMO-0002 1/1 Running 0 7D1H
CBDEMO-0003 1/1 Running 0 7D1H
CBDEMO-0004 1/1 Running 0 7D1H
COUCHBASE-OPERATOR-7654D844CB-GN4BW 1/1 Running 0 7D2H
COUCHBASE-OPERATOR-ADMISSION-7FF868F54C-5PKLX 1/1 Running 0 7D2H

백업 노드가 실행 중이면 해당 파드에 로그인할 수 있습니다:

$ kubectl 실행 -it 백업 노드 -n 이마트 -- /bin/bash

root@backup-node:/

그리고 실행 cbbackupmgr 목록 명령을 사용하여 기존 백업을 볼 수 있습니다:

# cbbackupmgr 목록 --repo 카우치베이스 --아카이브 /백업

크기 항목 이름
256.04MB - + 카우치베이스
0B - + 2020-01-30T04_17_12.702824188Z
0B - + gamesim-sample
0B 0 analytics.json
0B 0 + 데이터
0B 0 오류: 데이터 샤드를 찾을 수 없음
0B 0 full-text.json
0B 0 gsi.json
0B 0 views.json
128.02MB - + 2020-01-30t04_18_13.021340423z
....

또한 다음을 실행할 수도 있습니다. cbbackupmgr 복원 명령을 수동으로 실행합니다:

# cbbackupmgr restore --아카이브 /backups --repo couchbase --클러스터 couchbase://cbdemo-srv.emart.svc --사용자 이름 관리자 -비밀번호 비밀번호

복원이 완료되면 포드를 삭제하기만 하면 됩니다:

$ kubectl delete -f backup-pod.yaml -n emart

7. 결론

미리 정의된 간격으로 주기적으로 백업을 수행하는 프로세스를 자동화하는 백업 크론잡을 구성하는 방법을 단계별로 안내해 드렸습니다. 여기서는 백업-위드-주기적-병합.sh 단일 스크립트 내에서 백업, 압축 및 병합을 실행하는 스크립트입니다. 그런 다음 이 스크립트는 주기적-백업.yaml 파일을 생성하여 쿠버네티스 환경 내에서 백업을 수행하는 프로세스를 자동화했습니다. 이 블로그에 설명된 모범 사례를 사용하여 정기적으로 백업을 수행하고 복원 명령을 사용하여 백업의 유효성을 정기적으로 확인하시기 바랍니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 Anuj Sahni, 클라우드 및 솔루션 아키텍처 리더, Couchbase

<strong>아누즈 사니</strong> 는 AWS, Azure, GCP에서 확장 가능한 고성능 엔터프라이즈 애플리케이션을 설계한 20년 이상의 경험을 보유한 노련한 클라우드 및 솔루션 아키텍처 리더입니다. 현재 <strong>카우치베이스의 카펠라 팀</strong>, 에서 클라우드 네이티브 기술을 사용하여 조직이 애플리케이션을 현대화하고 클라우드 마이그레이션을 탐색하도록 돕고 있습니다. Couchbase에 입사하기 전에 Anuj는 <strong>오라클의 수석 제품 관리자</strong>에서 항상 가용성이 보장되는 분산형 데이터 플랫폼에 중점을 두고 오라클 NoSQL 데이터베이스 및 오라클 서비스 클라우드의 전략적 이니셔티브를 이끌었습니다. 그는 <strong>전기 및 컴퓨터 공학 석사</strong> 에서 <strong>플로리다 대학교</strong> 데이터 아키텍처 분야에서 활발한 활동을 하고 있는 사고의 리더입니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.