Cassandra 백업 및 복구

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

Cassandra 백업이 중요한 이유

백업은 재해 시나리오에 대비할 수 있는 중요한 보호 수단입니다. 각 백업은 해당 백업이 생성되었던 당시의 Cassandra 데이터에 대한 일관된 스냅샷입니다. 여기에는 Cassandra 클러스터 내의 스키마/메타데이터와 함께 Cassandra 데이터가 포함됩니다. 사용자는 백업을 통해 자신의 Apigee Hybrid 인스턴스를 이전에 알려진 정상 상태로 복원할 수 있습니다. 이는 재해 발생 시 Hybrid 인스턴스를 온라인 상태로 되돌리기 위한 중요한 단계입니다. 하이브리드 인스턴스 크기에 따라 단일 백업 세트에 하나 이상의 백업 파일이 있을 수 있습니다. 예를 들어 하이브리드 인스턴스에 Cassandra 노드가 3개 있으면 백업 세트에는 3개의 백업 파일이 포함됩니다. 하이브리드 인스턴스에 Cassandra 노드가 30개 있으면 백업 세트에 30개의 백업 파일이 포함됩니다. 즉, 백업에서 하이브리드 인스턴스를 복원하는데 걸리는 시간은 백업 세트에서 복원해야 하는 백업 파일의 수에 따라 다릅니다.

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

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

하이브리드에서 Cassandra 백업은 기본적으로 사용 설정되지 않습니다. 하지만 치명적인 오류로 인해 데이터가 손실될 경우를 대비해 Cassandra 백업을 사용 설정하는 것이 좋습니다. Cassandra 백업은 재해 복구 시 사용하기 위한 것이며 실수로 삭제하여 손실된 데이터를 복원하기 위한 것이 아닙니다.

백업은 override.yaml 파일에 설정된 일정에 따라 생성됩니다. 백업을 예약하는 방법에 대한 안내는 Cassandra 백업 예약 섹션을 참조하세요. 백업 일정이 하이브리드 클러스터에 적용되면 일정에 따라 Kubernetes 백업 작업이 주기적으로 실행됩니다. 백업 작업은 하이브리드 클러스터의 각 Cassandra 노드에서 백업 스크립트를 트리거하며 백업 스크립트는 노드의 모든 데이터를 수집하고, 데이터의 보관 파일을 만들고, 보관 파일을 override.yaml 파일의 Cassandra 백업 구성에 지정된 Google Cloud Storage 버킷으로 보냅니다.

백업되는 항목

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

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

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

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

Cassandra 백업 예약

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

  1. 다음 create-service-account 명령어를 실행하여 표준 roles/storage.objectAdmin 역할이 있는 Google Cloud 서비스 계정(SA)을 만듭니다. 이 SA 역할을 사용하면 백업 데이터를 Cloud Storage에 쓸 수 있습니다. 하이브리드 설치 루트 디렉터리에서 다음 명령어를 실행합니다.
    ../tools/create-service-account --env prod \
      --profile apigee-cassandra \
      --name CASSANDRA_BACKUP_SA_NAME \
      --dir OUTPUT_DIR

    각 항목의 의미는 다음과 같습니다.

    • CASSANDRA_BACKUP_SA_NAME은 서비스 계정의 이름입니다.
    • OUTPUT_DIR는 도구가 서비스 계정 .json 파일을 출력할 디렉터리입니다.

    예를 들면 다음과 같습니다.
    ./tools/create-service-account --env prod \
      --profile apigee-cassandra \
      --name my-cassandra-backup-sa  --dir ./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
    
      ...
      

    예시

    ...
    
    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-sa.json"
        dbStorageBucket: "gs://myname-cassandra-backup"
        schedule: "45 23 * * 6"
    
      ... 
  6. 각 항목의 의미는 다음과 같습니다.
    속성 설명
    backup:enabled 백업은 기본적으로 사용 중지되어 있습니다. 이 속성을 true로 설정해야 합니다.
    backup:serviceAccountPath

    SA_JSON_FILE_PATH

    ./tools/create-service-account를 실행할 때 다운로드된 서비스 계정 JSON 파일의 파일 시스템 경로입니다.

    backup:dbStorageBucket

    CLOUD_STORAGE_BUCKET_PATH

    gs://BUCKET_NAME 형식의 Cloud Storage 버킷 경로입니다. gs://는 필수 항목입니다.

    backup:schedule

    BACKUP_SCHEDULE_CODE

    백업이 시작되는 시간이며 표준 crontab 구문에 지정되어 있습니다. 기본값: 0 2 * * *

  7. 구성 변경사항을 새 클러스터에 적용합니다. 예를 들면 다음과 같습니다.
    ./apigeectl apply -f overrides.yaml
  8. 백업 작업을 확인합니다. 예를 들면 다음과 같습니다.
    kubectl get cronjob -n apigee
    NAME                      SCHEDULE     SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    apigee-cassandra-backup   33 * * * *   False     0        <none>          94s

백업 복원

재해로 인해 Apigee Hybrid 인스턴스의 모든 데이터가 복구 불가능하게 손실되는 것과 같은 치명적인 오류가 발생한 경우 백업을 사용하여 Apigee 인프라를 처음부터 복원합니다. 멀티 리전 배포가 있는 경우 단일 리전 장애에서 복구를 실행하면 해제 기능을 사용하여 영향을 받은 리전을 삭제한 다음 영향을 받은 리전에서 DN 확장을 사용하게 됩니다. Apigee Cassandra 배포와 운영 아키텍처는 단일 리전에 대해 중복성과 내결함성을 처리합니다. 프로덕션 사용 사례에서는 Apigee Hybrid를 멀티 리전 구성으로 배포하는 것이 권장되므로 리전 장애를 백업에서 복구하는 대신 문서화된 리전 해제 및 확장 절차를 사용하여 다른 라이브 리전 중 하나에서 복구할 수 있습니다.

다음과 같은 이유로는 백업을 사용하지 마세요.

  • Cassandra 노드에 오류가 발생함
  • 앱, 개발자, API 사용자 인증 정보와 같은 데이터를 실수로 삭제함
  • 멀티 리전 배포에서 하나 이상의 리전이 작동 중지됨

복원할 때 고려해야 할 사항은 다음과 같습니다.

  • 다운타임: 복원이 진행되는 동안 다운타임이 발생합니다.
  • 데이터 손실: 유효한 백업이 마지막으로 실행된 시간과 복원이 완료된 시간 사이에 데이터 손실이 발생합니다.
  • 복원 시간: 복원 시간은 데이터 및 클러스터의 크기에 따라 다릅니다.
  • 데이터 선택: 특정 데이터만 선택하여 복원할 수 없습니다. 복원은 내가 선택한 전체 백업을 복원합니다.

복원은 백업 위치에서 데이터를 가져와 노드 수가 동일한 새 Cassandra 클러스터에 복원합니다. 이전 Cassandra 클러스터에서는 클러스터 데이터를 가져오지 않습니다.

아래의 복원 안내는 백업에 Google Cloud Storage를 사용하는 단일 리전 배포에 적용됩니다. 다른 배포인 경우 다음을 참조하세요.

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

  1. 하이브리드 런타임 배포를 복원할 새 Kubernetes 클러스터를 새 네임스페이스를 사용하여 만듭니다. 원래 하이브리드 설치에 사용했던 것과 동일한 클러스터 및 네임스페이스는 사용할 수 없습니다.
  2. 루트 하이브리드 설치 디렉터리에 새 overrides-restore.yaml 파일을 만듭니다.
  3. 전체 구성을 원본 overrides.yaml 파일에서 새 overrides-restore.yaml 파일로 복사합니다. 예를 들면 다음과 같습니다.
    cp ./overrides.yaml ./overrides-restore.yaml
  4. overrides-restore.yaml에서 namespacerestore 요소를 추가하고 cassandra 속성의 TLS 인증 사용자 인증 정보가 올바른지 확인합니다.

    매개변수

        namespace: YOUR_RESTORE_NAMESPACE
        cassandra:
          ...
          sslRootCAPath: PATH_TO_ROOT_CA_FILE
          sslCertPath: PATH_TO_SSL_CERT_FILE
          sslKeyPath: PATH_TO_SSL_KEY_FILE
          ...
          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
    
        ...

    각 항목의 의미는 다음과 같습니다.

    속성 설명
    sslRootCAPath
    sslCertPath
    sslKeyPath

    PATH_TO_ROOT_CA_FILE
    PATH_TO_SSL_CERT_FILE
    PATH_TO_SSL_KEY_FILE

    원본 Cassandra 데이터베이스를 만들 때 사용했던 것과 동일한 TLS 인증 사용자 인증 정보를 사용합니다.

    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://는 필수 항목입니다.

  5. 다음 명령어를 실행하여 이전 네임스페이스의 Cassandra 노드에서 app 라벨을 변경합니다.
    kubectl label pods --overwrite --namespace=OLD_NAMESPACE -l app=apigee-cassandra app=apigee-cassandra-old
    
  6. 새 하이브리드 런타임 배포를 생성합니다. 그러면 새 Cassandra 클러스터가 생성되고 백업 데이터가 클러스터로 복원되기 시작합니다.
    ./apigeectl init  -f ../overrides-restore.yaml
    
    ./apigeectl apply  -f ../overrides-restore.yaml
    
  7. 복원이 완료되면 새 네임스페이스에서 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}}'
    
  8. 트래픽 전환이 완료되면 restore 구성을 삭제하고 backup 구성을 overrides-restore.yaml 파일에 추가하여 복원된 클러스터에서 백업을 다시 구성할 수 있습니다. YOUR_RESTORE_NAMESPACE1단계에서 만든 새 네임스페이스 이름으로 바꿉니다.
    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.1.6]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.1.6]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-1.6451.680-pff6s   0/1       Running     0          54s

백업 로그 확인

백업 작업은 다음과 같습니다.

  • schema.cql 파일을 만듭니다.
  • 스토리지 버킷에 업로드합니다.
  • 노드를 에코하여 데이터를 백업하고 동시에 업로드합니다.
  • 모든 데이터가 업로드될 때까지 기다립니다.
kubectl logs -f apigee-cassandra-backup-1.6451.680-pff6s

출력은 다음과 비슷합니다.

myusername-macbookpro:cassandra-backup-utility myusername$ kubectl logs -f apigee-cassandra-backup-1.64577680-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

검증

인그레스의 IP 주소를 테스트하고 해당 IP를 일부 트래픽으로 테스트하여 복원을 검증합니다.

  1. 다음 명령어를 사용하여 EXTERNAL-IP를 가져옵니다.
    kubectl get svc -n istio-system
    NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                                                      AGE
    istio-ingressgateway       LoadBalancer   10.11.123.45   34.56.78.90   15021:32225/TCP,80:32208/TCP,443:31942/TCP,15012:32689/TCP,15443:31936/TCP   1d
  2. 다음 예시와 같이 명령줄에서 gcloud 인증 사용자 인증 정보를 가져오거나 새로 고칩니다.

    TOKEN=$(gcloud auth print-access-token)
  3. API 키 또는 액세스 토큰과 함께 Apigee 환경에 배포된 기존 API 프록시를 사용하여 인그레스를 테스트합니다.
    Curl -v https://EXTERNAL-IP/basepath -H 'envgroup hostalias'

    예를 들면 다음과 같습니다.

    curl -v 'https://example.com/oauth/client_credential' \
      --resolve edgehybrid-staging-func-runtime-wf.hybrid.e2e.apigeeks.net:443:34.56.78.90 \
      -H 'Authorization: Bearer ${TOKEN}'

새 클러스터 및 트래픽 컷오버의 DNS 구성

유효성 검사에 만족하면 트래픽을 새 클러스터로 리디렉션하고 DNS 항목을 새 인그레스 EXTERNAL-IP 주소로 변경합니다.