1. 소개
데이터를 주기적으로 백업하는 것은 모든 프로덕션 데이터베이스 배포에서 중요한 부분으로, 재해 발생 시 데이터 복구를 보장하고 복원이 필요할 때 데이터 불일치를 최소화하는 데 도움이 됩니다.
카우치베이스는 다음을 제공합니다. cbbackupmgr 유틸리티는 수년에 걸쳐 개선되어 훨씬 더 높은 성능으로 대규모 데이터 세트를 백업하는 엔터프라이즈급 백업 및 복원 도구가 되었으므로 프로덕션에서 이 도구를 사용할 것을 권장합니다. 다음 사항을 언급할 가치가 있습니다. 카우치베이스 서버 6.5 백업-스토리지 엔진을 전면 개편하고 더 높은 압축률을 도입하여 백업-복원 성능이 크게 향상되고 각 백업 스냅샷에 필요한 스토리지가 줄어들어 비용을 절감할 수 있게 되었습니다.
2. 모범 사례
하지만 cbbackupmgr 이 Couchbase_HOME 아래에 존재한다면, 이는 not 클러스터의 활성 노드 중 하나에서 이 유틸리티를 실행하는 것이 좋습니다. 활성 요청의 리소스를 놓고 경쟁하게 되어 데이터베이스 시스템의 성능을 저해할 수 있기 때문입니다.
따라서 데이터베이스 클러스터와 백업 노드 모두에 대해 리소스를 더 잘 관리할 수 있도록 Couchbase 바이너리만 설치되고 Couchbase 서비스는 실행되지 않는 별도의 인스턴스(백업 및 복원 필요 시)를 제공하는 것이 가장 좋습니다.

위 그림에서 볼 수 있듯이, 5개의 노드로 구성된 Couchbase 클러스터 외에 별도의 백업/복구 노드가 프로비저닝되어 있습니다. 또 다른 모범 사례는 데이터베이스의 필수 스냅샷을 저장할 수 있는 충분한 공간을 확보하기 위해 Couchbase 데이터 세트 크기의 5배 이상을 저장할 수 있는 충분한 스토리지를 할당하는 것입니다. 복구 지점 목표 (RPO)를 설정할 수 있습니다.
3. 백업 전략
cbbackupmgr 는 DBA가 비즈니스 요구 사항에 가장 적합한 백업 전략을 구현할 수 있는 명령 모음을 제공합니다. 다음은 몇 가지 명령어입니다:
- cbbackupmgr 백업 - Couchbase 클러스터의 데이터 백업.
- cbbackupmgr 컴팩트 - 백업 압축
- cbbackupmgr 병합 - 백업 병합
- cbbackupmgr 구성 - 새 백업 리포지토리를 만듭니다.
- cbbackupmgr 목록 - 아카이브에 백업을 나열합니다.
이러한 명령을 사용하여 다음 세 가지 백업 전략 중 하나를 구현할 수 있습니다. 문서. 아래 예에서는 다음과 같이 설명합니다. 정기 병합 전략의 맥락에서, 쿠버네티스 환경 내에서 실행되는 카우치베이스 클러스터의 맥락에서.
4. 주기적 병합
이 백업 전략은 변경 사항을 백업하는 데 가장 적은 시간이 필요하고 압축 및 병합 프로세스 중에 데이터를 통합하는 데 데이터베이스 클러스터의 리소스 소비가 거의 없으므로 데이터베이스 오버헤드가 가장 낮습니다(백업 노드에서 발생하므로).
간단히 설명하면 다음과 같습니다. 정기 병합 전략이 작동합니다:
- 다음을 사용하여 백업 리포지토리 설정 cbbackupmgr 구성
- 다음을 사용하여 데이터베이스의 증분 백업(리포지토리에 있음)을 수행합니다. cbbackupmgr 백업
- 다음을 사용하여 백업 압축을 수행합니다. cbbackupmgr 컴팩트 를 사용하여 디스크 공간을 효율적으로 사용할 수 있습니다.
- 다음을 사용하여 가장 오래된 백업을 병합합니다. 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 파일을 생성하여 쿠버네티스 환경 내에서 백업을 수행하는 프로세스를 자동화했습니다. 이 블로그에 설명된 모범 사례를 사용하여 정기적으로 백업을 수행하고 복원 명령을 사용하여 백업의 유효성을 정기적으로 확인하시기 바랍니다.