이 섹션에서는 Apigee 하이브리드 런타임 영역에 설치된 Apache Cassandra 데이터베이스 링의 데이터 백업과 복구를 구성하는 방법을 설명합니다. Cassandra Datastore도 참조하세요.
Cassandra 백업에 대해 알아야 할 사항
Cassandra는 각 리전 또는 데이터 센터에 데이터 복사본이 최소 3개 이상 있도록 구성된 복제된 데이터베이스입니다. Cassandra는 스트리밍 복제 및 읽기 복구를 사용하여 특정 시점에 각 리전 또는 데이터 센터의 데이터 복제본을 유지합니다.
하이브리드에서 Cassandra 백업은 기본적으로 사용 설정되지 않습니다. 하지만 실수로 데이터가 삭제되는 경우를 대비하여 Cassandra 백업을 사용 설정하는 것이 좋습니다.
백업되는 항목
이 주제에서 설명하는 백업 구성에서는 다음 항목을 백업합니다.
- 사용자 스키마를 포함한 Cassandra 스키마(Apigee 키스페이스 정의)
- 노드당 Cassandra 파티션 토큰 정보
- Cassandra 데이터의 스냅샷
백업 데이터가 저장되는 위치
백업된 데이터는 Google Cloud Storage 버킷에 저장되고 개발자가 이 버킷을 만들어야 합니다. 이 주제에서는 버킷 만들기와 구성을 설명합니다.
Cassandra 백업 예약
백업은 런타임 영역에서 cron
작업으로 예약됩니다. Cassandra 백업을 예약하려면 다음 안내를 따르세요.
- 다음
create-service-account
명령어를 실행하여 표준roles/storage.objectAdmin
역할이 있는 Google Cloud 서비스 계정(SA)을 만듭니다. 이 SA 역할을 사용하면 백업 데이터를 Cloud Storage에 쓸 수 있습니다. 하이브리드 설치 루트 디렉터리에서 다음 명령어를 실행합니다../tools/create-service-account apigee-cassandra OUTPUT_DIR
예를 들면 다음과 같습니다../tools/create-service-account apigee-cassandra ./service-accounts
Google Cloud 서비스 계정에 대한 자세한 내용은 서비스 계정 만들기 및 관리를 참조하세요. create-service-account
명령어는 서비스 계정 비공개 키가 포함된 JSON 파일을 저장합니다. 파일은 명령어가 실행되는 동일한 디렉터리에 저장됩니다. 다음 단계에서는 이 파일의 경로가 필요합니다.- Cloud Storage 버킷 생성 버킷에 적절한 데이터 보존 정책을 지정합니다. 데이터 보존 정책을 15일로 설정하는 것이 좋습니다.
overrides.yaml
파일을 엽니다.- 다음
cassandra.backup
속성을 추가하여 백업을 사용 설정합니다. 이미 구성된 속성을 삭제하지 마세요.매개변수
cassandra: ... backup: enabled: true serviceAccountPath: SA_JSON_FILE_PATH dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH schedule: BACKUP_SCHEDULE_CODE ...
예
... cassandra: storage: type: gcepd capacity: 50Gi gcepd: replicationType: regional-pd sslRootCAPath: "/Users/myhome/ssh/cassandra.crt" sslCertPath: "/Users/myhome/ssh/cassandra.crt" sslKeyPath: "/Users/myhome/ssh/cassandra.key" auth: default: password: "abc123" admin: password: "abc234" ddl: password: "abc345" dml: password: "abc456" nodeSelector: key: cloud.google.com/gke-nodepool value: apigee-data backup: enabled: true serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json" dbStorageBucket: "gs://myname-cassandra-backup" schedule: "45 23 * * 6" ...
각 항목의 의미는 다음과 같습니다. - 구성 변경사항을 새 클러스터에 적용합니다. 예를 들면 다음과 같습니다.
./apigeectl apply -f overrides.yaml
속성 | 설명 |
---|---|
backup:enabled |
백업은 기본적으로 사용 중지되어 있습니다. 이 속성을 true 로 설정해야 합니다. |
backup:serviceAccountPath |
SA_JSON_FILE_PATH
|
backup:dbStorageBucket |
CLOUD_STORAGE_BUCKET_PATH
|
backup:schedule |
BACKUP_SCHEDULE_CODE 백업이 시작되는 시간이며 표준 crontab 구문에 지정되어 있습니다. 기본값: |
백업 복원
복원은 백업 위치에서 데이터를 가져와 노드 수가 동일한 새 Cassandra 클러스터에 복원합니다. 이전 Cassandra 클러스터에서는 데이터를 가져오지 않습니다.
아래의 복원 안내는 백업에 Google Cloud Storage를 사용하는 단일 리전 배포에 적용됩니다. 다른 배포인 경우 다음을 참조하세요.
- 백업에 Google Cloud Storage를 사용하지 않는 단일 리전 배포의 경우 Google Cloud 없이 백업 및 복구를 참조하세요.
- 멀티 리전 배포의 경우 GKE 및 GKE On-Prem의 멀티 리전 배포를 참조하세요.
Cassandra 백업을 복원하려면 다음 안내를 따르세요.
- 하이브리드 런타임 배포를 복원하는 데 사용되는 기존 Kubernetes 클러스터 내에 새 네임스페이스를 만듭니다. 새 네임스페이스에 원본 네임스페이스 이름을 사용하지 마세요. 복원에 이전 네임스페이스를 사용하지 마세요.
- 루트 하이브리드 설치 디렉터리에 새
overrides-restore.yaml
파일을 만듭니다. - 전체 Cassandra 구성을 원본
overrides.yaml
파일에서 새overrides-restore.yaml
파일로 복사합니다. 예시는 다음 명령어를 참조하세요.cp ./overrides.yaml ./overrides-restore.yaml
- 새
overrides-restore.yaml
파일에 네임스페이스 요소를 추가합니다. 원본 클러스터에 사용한 네임스페이스와 동일한 네임스페이스를 사용하지 마세요.매개변수
namespace: YOUR_RESTORE_NAMESPACE cassandra: ... restore: enabled: true snapshotTimestamp: TIMESTAMP serviceAccountPath: SA_JSON_FILE_PATH dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH image: pullPolicy: Always ...
예
... namespace: cassandra-restore cassandra: storage: type: gcepd capacity: 50Gi gcepd: replicationType: regional-pd sslRootCAPath: "/Users/myhome/ssh/cassandra.crt" sslCertPath: "/Users/myhome/ssh/cassandra.crt" sslKeyPath: "/Users/myhome/ssh/cassandra.key" auth: default: password: "abc123" admin: password: "abc234" ddl: password: "abc345" dml: password: "abc456" nodeSelector: key: cloud.google.com/gke-nodepool value: apigee-data restore: enabled: true snapshotTimestamp: "20210203213003" serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json" dbStorageBucket: "gs://myname-cassandra-backup" image: pullPolicy: Always ...
각 항목의 의미는 다음과 같습니다.
속성 설명 namespace
YOUR_RESTORE_NAMESPACE
새 Cassandra 클러스터의 1단계에서 만든 새 네임스페이스의 이름입니다. 원래 클러스터에 사용한 네임스페이스와 동일한 네임 스페이스를 사용하지 마세요.
restore:enabled
복원은 기본적으로 사용 중지되어 있습니다. 이 속성을 true
로 설정해야 합니다.restore:snapshotTimestamp
TIMESTAMP
복원할 백업 스냅샷의 타임스탬프입니다. 사용할 수 있는 타임스탬프를 확인하려면
dbStorageBucket
으로 이동하여 버킷에 있는 파일을 확인합니다. 각 파일 이름에는 다음과 같은 타임스탬프 값이 포함됩니다.backup_20210203213003_apigee-cassandra-default-0.tgz
여기서 20210203213003은 해당 시점에 생성된 백업을 복원하려는 경우에 사용하는
snapshotTimestamp
값입니다.restore:serviceAccountPath
SA_JSON_FILE_PATH
백업용으로 만든 서비스 계정의 파일 시스템 경로입니다.
restore:dbStorageBucket
CLOUD_STORAGE_BUCKET_PATH
백업 데이터가 다음 형식으로 저장되는 Cloud Storage 버킷 경로입니다.
gs://BUCKET_NAME
gs://
는 필수 항목입니다. - 다음 명령어를 실행하여 이전 네임스페이스의 Cassandra 노드에서
app
라벨을 변경합니다.kubectl label pods --overwrite --namespace=OLD_NAMESPACE -l app=apigee-cassandra app=apigee-cassandra-old
- 새 하이브리드 런타임 배포를 생성합니다. 그러면 새 Cassandra 클러스터가 생성되고 백업 데이터가 클러스터로 복원되기 시작합니다.
./apigeectl init -f ../overrides-restore.yaml
./apigeectl apply -f ../overrides-restore.yaml
-
복원이 완료되면 새 네임스페이스에서 Cassandra 클러스터를 사용하도록 트래픽을 전환해야 합니다. 다음 명령어를 실행하여 트래픽을 전환합니다.
kubectl get rs -n OLD_NAMESPACE # look for the 'apigee-connect' replicaset
kubectl patch rs -n OLD_NAMESPACE APIGEE_CONNECT_RS_NAME -p '{"spec":{"replicas" : 0}}'
- 트래픽 전환이 완료되면
restore
구성을 삭제하고backup
구성을overrides-restore.yaml
파일에 추가하여 복원된 클러스터에서 백업을 다시 구성할 수 있습니다. YOUR_RESTORE_NAMESPACE를 1단계에서 만든 새 네임스페이스 이름으로 바꿉니다.namespace: YOUR_RESTORE_NAMESPACE cassandra: ... backup: enabled: true serviceAccountPath: SA_JSON_FILE_PATH dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH schedule: BACKUP_SCHEDULE_CODE ...
그런 후 다음 명령어를 사용하여
backup
구성을 적용합니다../apigeectl apply -f ../overrides-restore.yaml
복원 로그 보기
복원 작업 로그를 확인하고 grep
을 사용하여 error
를 확인하여 복원 로그에 오류가 없는지 확인할 수 있습니다.
복원이 완료되었는지 확인
다음 명령어를 사용하여 복원 작업이 완료되었는지 확인합니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE apigee-cassandra-default-0 1/1 Running 0 1h apigee-cassandra-default-1 1/1 Running 0 1h apigee-cassandra-default-2 1/1 Running 0 59m apigee-cassandra-restore-b4lgf 0/1 Completed 0 51m
복원 로그 보기
다음 명령어를 사용하여 복원 로그를 봅니다.
kubectl logs -f apigee-cassandra-restore-b4lgf
출력은 다음과 비슷합니다.
Restore Logs: Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] to download file gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1/backup_20190405011309_schema.tgz INFO: download successfully extracted the backup files from gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 finished downloading schema.cql to create schema from 10.32.0.28 Warnings : dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0 dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0 Warnings : dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0 dclocal_read_repair_chance table option has been deprecated and will be removed in version 4.0 INFO: the schema has been restored starting apigee-cassandra-default-0 in default starting apigee-cassandra-default-1 in default starting apigee-cassandra-default-2 in default 84 95 106 waiting on waiting nodes $pid to finish 84 Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] INFO: restore downloaded tarball and extracted the file from gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 INFO: restore downloaded tarball and extracted the file from gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 INFO: restore downloaded tarball and extracted the file from gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 INFO 12:02:28 Configuration location: file:/etc/cassandra/cassandra.yaml …... INFO 12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed Summary statistics: Connections per host : 3 Total files transferred : 2 Total bytes transferred : 0.378KiB Total duration : 5048 ms Average transfer rate : 0.074KiB/s Peak transfer rate : 0.075KiB/s progress: [/10.32.1.155]0:1/1 100% 1:1/1 100% [/10.32.0.28]1:1/1 100% 0:1/1 100% [/10.32.3.220]0:1/1 100% 1:1/1 100% total: 100% 0.000KiB/s (avg: 0.074KiB/s) INFO 12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed progress: [/10.32.1.155]0:1/1 100% 1:1/1 100% [/10.32.0.28]1:1/1 100% 0:1/1 100% [/10.32.3.220]0:1/1 100% 1:1/1 100% total: 100% 0.000KiB/s (avg: 0.074KiB/s) INFO 12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed INFO 12:02:41 [Stream #e013ee80-5863-11e9-8458-353e9e3cb7f9] All sessions completed INFO: ./apigee/data/cassandra/data/ks1/user-9fbae960571411e99652c7b15b2db6cc restored successfully INFO: Restore 20190405011309 completed INFO: ./apigee/data/cassandra/data/ks1/user-9fbae960571411e99652c7b15b2db6cc restored successfully INFO: Restore 20190405011309 completed waiting on waiting nodes $pid to finish 106 Restore finished
백업 작업 확인
또한 백업 cronjob이 예약되면 백업 작업을 확인할 수 있습니다. cronjob이 예약되면 다음과 같은 출력이 표시됩니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE apigee-cassandra-default-0 1/1 Running 0 2h apigee-cassandra-default-1 1/1 Running 0 2h apigee-cassandra-default-2 1/1 Running 0 2h apigee-cassandra-backup-1554515580-pff6s 0/1 Running 0 54s
백업 로그 확인
백업 작업은 다음과 같습니다.
schema.cql
파일을 만듭니다.- 스토리지 버킷에 업로드합니다.
- 노드를 에코하여 데이터를 백업하고 동시에 업로드합니다.
- 모든 데이터가 업로드될 때까지 기다립니다.
kubectl logs -f apigee-cassandra-backup-1554515580-pff6s
출력은 다음과 비슷합니다.
myusername-macbookpro:cassandra-backup-utility myusername$ kubectl logs -f apigee-cassandra-backup-1554577680-f9sc4 starting apigee-cassandra-default-0 in default starting apigee-cassandra-default-1 in default starting apigee-cassandra-default-2 in default 35 46 57 waiting on process 35 Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false} Snapshot directory: 20190406190808 INFO: backup created cassandra snapshot 20190406190808 tar: Removing leading `/' from member names /apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/ /apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/20190406190808/ /apigee/data/cassandra/data/ks1/mytest3-37bc2df0587811e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Data.db Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false} Requested creating snapshot(s) for [all keyspaces] with snapshot name [20190406190808] and options {skipFlush=false} Snapshot directory: 20190406190808 INFO: backup created cassandra snapshot 20190406190808 tar: Removing leading `/' from member names /apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/ /apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/20190406190808/ /apigee/data/cassandra/data/system/hints-2666e20573ef38b390fefecf96e8f0c7/snapshots/20190406190808/manifest.json /apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/ /apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/20190406190808/ /apigee/data/cassandra/data/system/prepared_statements-18a9c2576a0c3841ba718cd529849fef/snapshots/20190406190808/manifest.json /apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/ /apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/20190406190808/ /apigee/data/cassandra/data/system/range_xfers-55d764384e553f8b9f6e676d4af3976d/snapshots/20190406190808/manifest.json /apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/ /apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/20190406190808/ /apigee/data/cassandra/data/system/peer_events-59dfeaea8db2334191ef109974d81484/snapshots/20190406190808/manifest.json /apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/ /apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/20190406190808/ /apigee/data/cassandra/data/system/built_views-4b3c50a9ea873d7691016dbc9c38494a/snapshots/20190406190808/manifest.json …… /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/ /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/ /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Filter.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-CompressionInfo.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Index.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Statistics.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Data.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Index.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Statistics.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-TOC.txt /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Statistics.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Summary.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Filter.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Summary.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Index.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/manifest.json /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Filter.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-2-big-Digest.crc32 /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Summary.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Data.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-TOC.txt /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/schema.cql /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-CompressionInfo.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Digest.crc32 /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-TOC.txt /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-Data.db /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-3-big-Digest.crc32 /apigee/data/cassandra/data/ks2/user-d6d39d70586311e98e8d875b0ed64754/snapshots/20190406190808/mc-1-big-CompressionInfo.db …… /tmp/tokens.txt / [1 files][ 0.0 B/ 0.0 B] Operation completed over 1 objects. / [1 files][ 0.0 B/ 0.0 B] Operation completed over 1 objects. INFO: backup created tarball and transferred the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 INFO: removing cassandra snapshot INFO: backup created tarball and transferred the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 INFO: removing cassandra snapshot Requested clearing snapshot(s) for [all keyspaces] INFO: Backup 20190406190808 completed waiting on process 46 Requested clearing snapshot(s) for [all keyspaces] INFO: Backup 20190406190808 completed Requested clearing snapshot(s) for [all keyspaces] waiting on process 57 INFO: Backup 20190406190808 completed waiting result to get schema from 10.32.0.28 INFO: /tmp/schema.cql has been generated Activated service account credentials for: [apigee-cassandra-backup-svc@gce-myusername.iam.gserviceaccount.com] tar: removing leading '/' from member names tmp/schema.cql Copying from <TDIN>... / [1 files][ 0.0 B/ 0.0 B] Operation completed over 1 objects. INFO: backup created tarball and transferred the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1 finished uploading schema.cql