Cassandra 备份和恢复

本部分介绍了如何为在 Apigee Hybrid 运行时层面中安装的 Apache Cassandra 数据库环配置数据备份和恢复。另请参阅 Cassandra 数据存储区

Cassandra 备份的重要性

备份是防范灾难场景的重要措施。每个备份都是创建备份时存在的当前 Cassandra 数据的一致快照。这包括 Cassandra 数据以及 Cassandra 集群中的架构 / 元数据。通过备份,用户可以将 Apigee Hybrid 实例恢复到之前已知的良好状态,这是在发生灾难时使 Hybrid 实例恢复在线状态的关键步骤。根据 Hybrid 实例大小,单个备份集可以有一个或多个备份文件。例如,如果 Hybrid 实例具有三个 Cassandra 节点,则备份集包含三个备份文件。如果 Hybrid 实例有 30 个 Cassandra 节点,则备份集包含 30 个备份文件。这意味着从备份恢复 Hybrid 实例的时间取决于需要恢复的备份集中的备份文件的数量。

关于 Cassandra 备份,您需要了解哪些信息?

Cassandra 是复制的数据库,配置为在每个区域或数据中心至少有 3 个数据副本。Cassandra 使用流式复制和读取修复来维护在每个区域或数据中心中给定时间点的数据副本。

在混合中,Cassandra 备份默认处于停用状态。不过,最好在数据因灾难性故障丢失时启用 Cassandra 备份。Cassandra 备份适用于灾难恢复,而非恢复因意外删除而丢失的数据。

根据 override.yaml 文件中设置的时间表创建备份。如需了解如何安排备份,请参阅安排 Cassandra 备份部分。将备份时间表应用于 Hybrid 集群后,系统会根据该时间表定期执行 Kubernetes 备份作业。该作业会在 Hybrid 集群中的每个 Cassandra 节点上触发备份脚本,该脚本收集节点上的所有数据,创建归档文件,并将归档文件发送到 override.yaml 文件中的 Cassandra 备份配置指定的 Google Cloud 存储桶。

备份了哪些内容?

本主题中介绍的备份配置可备份以下实体:

  • Cassandra 架构,包括用户架构(Apigee 密钥空间定义)
  • 每个节点的 Cassandra 分区令牌信息
  • Cassandra 数据的快照

备份数据存储在何处?

备份数据存储在您必须创建的 Google Cloud Storage 存储分区中。本主题涵盖创建和配置存储分区。

安排 Cassandra 备份

备份作为运行时层面中的 cron 作业进行安排。如需安排 Cassandra 备份,请执行以下操作:

  1. 运行以下 create-service-account 命令以创建具有标准 roles/storage.objectAdmin 角色的 Google Cloud 服务帐号 (SA)。此 SA 角色允许您将备份数据写入 Cloud Storage。在 Hybrid 安装根目录下执行以下命令:
    ../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 存储分区。 为存储分区指定合理的数据保留政策。Apigee 建议采用 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

    Cloud Storage 存储分区路径,格式如下:gs://BUCKET_NAMEgs:// 是必需的。

    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_credentials 等数据的意外删除。
  • 多区域部署中的一个或多个区域出现故障。

恢复时的注意事项:

  • 停用时间:在恢复期间的停机时间。
  • 数据丢失:上次有效备份与恢复完成之间存在数据丢失问题。
  • 恢复时间:恢复时间取决于数据和集群的大小。
  • 择优挑选数据:您无法仅选择要恢复的特定数据。恢复操作会恢复您选择的整个备份。

恢复功能会从备份位置获取数据,并将其恢复到具有相同节点数的新 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

    您在第 1 步中为新的 Cassandra 集群创建的新命名空间的名称。请勿使用原始集群所用的命名空间。

    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. 创建新的 Hybrid 运行时部署。这将创建新的 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_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.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

验证备份作业

您还可以在安排备份 Cron 作业后验证备份作业。安排 Cron 作业后,您应该会看到类似如下的内容:

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

验证

通过测试 Ingress 的 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. 使用部署在 Apigee 环境中的现有 apiproxy 以及 API 密钥或访问令牌来测试 Ingress:
    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 地址。