Cassandra のバックアップと復元

このセクションでは、Apigee ハイブリッドのランタイム プレーンにインストールされた Apache Cassandra データベース リングのデータのバックアップと復元を構成する方法について説明します。また、Cassandra データストアもご覧ください。

Cassandra のバックアップについて知っておくべきこと

Cassandra はレプリケートされるデータベースであり、各リージョンまたはデータセンターに 3 つ以上のデータのコピーが存在するように構成されています。Cassandra はストリーミング レプリケーションと読み取りリペアを使用して、各リージョンまたはデータセンターに任意の時点のデータレプリカを保持します。

ハイブリッドでは、Cassandra のバックアップはデフォルトで無効になっています。ただし、データを誤って削除してしまった場合に備えて、Cassandra のバックアップを有効にすることをおすすめします。

バックアップの対象

このトピックで説明するバックアップ構成では、次のエンティティがバックアップされます。

  • ユーザー スキーマを含む 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 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
    
      ...
      

    ...
    
    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. ここで
    プロパティ 説明
    backup:enabled バックアップはデフォルトでは無効になっています。このプロパティを true に設定する必要があります。
    backup:serviceAccountPath

    SA_JSON_FILE_PATH

    ./tools/create-service-account の実行時にダウンロードされたサービス アカウント JSON ファイルのファイル システム上のパス。

    backup:dbStorageBucket

    CLOUD_STORAGE_BUCKET_PATH

    Cloud Storage バケットのパス。形式は gs://BUCKET_NAME です。必ず gs:// を付ける必要があります。

    backup:schedule

    BACKUP_SCHEDULE_CODE

    バックアップの開始時刻。標準の crontab 構文で指定します。デフォルト: 0 2 * * *

  7. 構成の変更を新しいクラスタに適用します。次に例を示します。
    ./apigeectl apply -f overrides.yaml

バックアップを復元する

復元プロセスでは、バックアップのロケーションからデータが取得され、同じ数のノードを持つ新しい Cassandra クラスタにデータが復元されます。古い Cassandra クラスタからデータは取得されません。

以下の復元手順は、バックアップに Google Cloud Storage を使用する単一のリージョン デプロイを対象としています。マルチリージョン デプロイの場合は、GKE と GKE On-Prem でのマルチリージョン デプロイをご覧ください。

Cassandra のバックアップを復元するには:

  1. ハイブリッド ランタイム デプロイの復元に使用する既存の Kubernetes クラスタ内に、新しい Namespace を作成します。新しい Namespace には元の Namespace 名を使用しないでください。古い Namespace は復元に使用しないでください。
  2. ルート ハイブリッド インストール ディレクトリに、新しい overrides-restore.yaml ファイルを作成します。
  3. 元の overrides.yaml ファイルの完全な Cassandra 構成を新しい overrides-restore.yaml ファイルにコピーします。たとえば、次のコマンドのようにします。
    cp ./overrides.yaml ./overrides-restore.yaml
  4. 新しい overrides-restore.yaml ファイルに Namespace の要素を追加します。元のクラスタと同じ Namespace は使用しないでください。

    パラメータ

    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

    手順 1 で新しい Cassandra クラスタに作成した新しい Namespace の名前。元のクラスタで使用していた Namespace は使用しないでください。

    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. 次のコマンドを実行して、古い Namespace の 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. 復元が完了したら、新しい Namespace で 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 名に置き換えます。
    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

バックアップ ジョブを確認する

バックアップ 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-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