Cassandra 백업 및 복구

이 섹션에서는 Apigee 하이브리드 런타임 영역에 설치된 Apache Cassandra 데이터베이스 링의 데이터 백업과 복구를 구성하는 방법을 설명합니다. Cassandra Datastore도 참조하세요.

Cassandra 백업에 대해 알아야 할 사항

Cassandra는 각 리전 또는 데이터 센터에 데이터 복사본이 최소 3개 이상 있도록 구성된 복제된 데이터베이스입니다. Cassandra는 스트리밍 복제 및 읽기 복구를 사용하여 특정 시점에 각 리전 또는 데이터 센터의 데이터 복제본을 유지합니다.

하이브리드에서 Cassandra 백업은 기본적으로 사용 설정되지 않습니다. 하지만 실수로 데이터가 삭제되는 경우를 대비하여 Cassandra 백업을 사용 설정하는 것이 좋습니다.

백업되는 항목

이 주제에서 설명하는 백업 구성에서는 다음 항목을 백업합니다.

  • 사용자 스키마를 포함한 Cassandra 스키마(Apigee 키스페이스 정의)
  • 노드당 Cassandra 파티션 토큰 정보
  • Cassandra 데이터의 스냅샷

백업 데이터가 저장되는 위치

백업된 데이터는 Google Cloud Storage 버킷에 저장되고 개발자가 이 버킷을 만들어야 합니다. 이 주제에서는 버킷 만들기와 구성을 설명합니다.

Cassandra 백업 예약

백업은 런타임 영역에서 크론 작업으로 예약됩니다. Cassandra 백업을 예약하려면 다음 안내를 따르세요.

  1. 다음 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 서비스 계정에 대한 자세한 내용은 서비스 계정 만들기 및 관리를 참조하세요.
  2. create-service-account 명령어는 서비스 계정 비공개 키가 포함된 JSON 파일을 저장합니다. 파일은 명령어가 실행되는 동일한 디렉터리에 저장됩니다. 다음 단계에서는 이 파일의 경로가 필요합니다.
  3. Cloud Storage 버킷 생성 버킷에 적절한 데이터 보관 정책을 지정합니다. 데이터 보관 정책을 15일로 설정하는 것이 좋습니다.
  4. overrides.yaml 파일을 엽니다.
  5. 다음 cassandra.backup 속성을 추가하여 백업을 사용 설정합니다. 이미 구성된 속성을 삭제하지 마세요.
    cassandra:
      ...
    
      backup:
        enabled: true
        serviceAccountPath: SA_JSON_FILE_PATH
        dbStorageBucket: CLOUD_STORAGE_BUCKET_PATH
        schedule: BACKUP_SCHEDULE_CODE
    
      ...
    각 항목의 의미는 다음과 같습니다.
    속성 설명
    enabled 백업은 기본적으로 사용 중지되어 있습니다. 이 속성을 true로 설정해야 합니다.
    serviceAccountPath ./tools/create-service-account를 실행할 때 다운로드된 서비스 계정 JSON 파일의 파일 시스템 경로입니다.
    dbStorageBucket gs://BUCKET_NAME 형식의 Cloud Storage 버킷 경로입니다. gs://는 필수 항목입니다.
    schedule 백업이 시작되는 시간이며 표준 crontab 구문에 지정되어 있습니다. 기본값: 0 2 * * *
    예를 들면 다음과 같습니다.
    ...
    
    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"
    
      ... 
  6. 구성 변경사항을 새 클러스터에 적용합니다. 예를 들면 다음과 같습니다.
    ./apigeectl apply -f MY_OVERRIDES.yaml

백업 복원

복원은 백업 위치에서 데이터를 가져와 pod 수가 동일한 새 Cassandra 클러스터에 복원합니다. 새 클러스터에는 런타임 영역 클러스터와 다른 네임스페이스가 있어야 합니다.

Cassandra 백업을 복원하려면 다음 안내를 따르세요.

  1. 새 네임스페이스로 새 Kubernetes 클러스터를 만듭니다. 원래 하이브리드 설치에 사용했던 것과 동일한 클러스터/네임스페이스를 사용할 수 없습니다.
  2. 루트 하이브리드 설치 디렉터리에 새 overrides-restore.yaml 파일을 만듭니다.
  3. 전체 Cassandra 구성을 원본 overrides.yaml 파일에서 새 overrides-restore.yaml 파일로 복사합니다. 예시는 다음 명령어를 참조하세요.
    cp ./overrides.yaml ./overrides-restore.yaml
  4. 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
    
      ...
    
    

    위의 자리표시자를 다음 값으로 채웁니다.

    속성 설명
    enabled 복원은 기본적으로 사용 중지되어 있습니다. 이 속성을 true로 설정해야 합니다.
    snapshotTimestamp

    복원할 백업 스냅샷의 타임스탬프입니다. 사용할 수 있는 타임스탬프를 확인하려면 dbStorageBucket으로 이동하여 버킷에 있는 파일을 확인합니다. 각 파일 이름은 다음과 같은 타임스탬프 값을 포함합니다.

    backup_20210203213003_apigee-cassandra-default-0.tgz

    여기서 20210203213003은 해당 시점에 생성된 백업을 복원하려는 경우 사용하는 snapshotTimestamp 값입니다.

    serviceAccountPath 백업용으로 만든 서비스 계정의 파일 시스템 경로입니다.
    dbStorageBucket

    백업 데이터가 다음 형식으로 저장되는 Cloud Storage 버킷 경로입니다.

    gs://BUCKET_NAME

    gs://는 필수 항목입니다.

    다음은 overrides-restore.yaml 파일의 복원 구성 섹션의 예시입니다.

    ...
        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: "20190417002207"
            serviceAccountPath: "/Users/myhome/.ssh/my_cassandra_backup.json"
            dbStorageBucket: "gs://myname-cassandra-backup"
            image:
              pullPolicy: Always
        ...
    
    
    
  5. 다음 명령어를 사용하여 새 Cassandra 클러스터를 만듭니다.
    ./apigeectl init  -f ../overrides-restore.yaml
    
    ./apigeectl apply  -f ../overrides-restore.yaml
    
  6. 복원이 완료되면 restore 구성을 삭제하고 backup 구성을 overrides-restore.yaml 파일에 추가하여 복원된 클러스터에서 백업을 다시 구성할 수 있습니다.

    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