Cassandra のバックアップと復元

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

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

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

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

バックアップされるもの

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

  • ユーザー スキーマを含む Cassandra スキーマ(Apigee キースペースの定義)
  • ノードごとの Cassandra パーティション トークン情報
  • Cassandra データのスナップショット

バックアップ データの保存場所

バックアップ データは Google Cloud Storage(GCS)バケットに保存されます。このバケットはユーザーが作成する必要があります。バケットの作成と構成については後述します。

Cassandra のバックアップ スケジュールの設定

バックアップはランタイム プレーンで cron ジョブとしてスケジュールされます。Cassandra のバックアップをスケジュールするには、次の手順に従います。

  1. 次の create-service-account コマンドを実行して、標準の roles/storage.objectAdmin 役割を持つ GCP サービス アカウント(SA)を作成します。この SA の役割には、バックアップ データを Google Cloud Storage(GCS)に書き込む権限があります。Hybrid インストール環境のルート ディレクトリで次のコマンドを実行します。
    ./tools/create-service-account apigee-cassandra output-dir
    次に例を示します。
    ./tools/create-service-account apigee-cassandra ./service-accounts
    GCP サービス アカウントの詳細については、サービス アカウントの作成と管理をご覧ください。
  2. 上記の create-service-account コマンドにより、サービス アカウントの秘密鍵を含む JSON ファイルが作成され、コマンドを実行したディレクトリに保存されます。以降のステップでこのファイルのパスが必要になります。
  3. GCS バケットを作成します。バケットの保持ポリシーとして妥当なデータ保持期間を指定してください。15 日のデータ保持ポリシーを使用することをおすすめします。
  4. overrides.yaml ファイルを開きます。
  5. 次の cassandra.backup プロパティを追加してバックアップを有効にします。すでに構成されているプロパティは削除しないでください。
    cassandra:
          ...
    
          backup:
            enabled: true
            serviceAccountPath: sa_json_file_path
            dbStorageBucket: gcs_bucket_path
            schedule: backup_schedule_code
    
          ...
    ここで
    プロパティ 説明
    enabled バックアップはデフォルトでは無効になっています。このプロパティを true に設定する必要があります。
    serviceAccountPath ./tools/create-service-account の実行時にダウンロードされたサービス アカウント JSON ファイルのファイルシステム上のパス。
    dbStorageBucket GCS ストレージ バケットのパス。形式は gs://bucket_name です。必ず gs:// を付ける必要があります。
    schedule バックアップの開始時刻。標準の crontab 構文で指定します。デフォルト: 0 2 * * *

    注: バックアップをスケジュールする際、バックアップ構成をクラスタに適用した後すぐにバックアップが開始されるようにはしないでください。バックアップ構成を適用すると、Kubernetes によって Cassandra ノードが再作成されます。ノードが再起動する前にバックアップが開始されると、バックアップは失敗します(ノードの再起動にはおそらく数分かかります)。

    次に例を示します。
        ...
    
        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 -c 2_cassandra -v beta2

バックアップの復元

復元操作では、バックアップ場所からデータが取得され、同じ数のポッドを持つ新しい Cassandra クラスタにそのデータが復元されます。復元先の新しいクラスタは、ランタイム プレーン クラスタとは異なる名前空間を持つ必要があります。

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

  1. 新しい名前空間を持つ新しい Kubernetes クラスタを作成します。元の Hybrid インストール環境で使用していたものと同じクラスタ / 名前空間を使用することはできません。
  2. Hybrid インストール環境のルート ディレクトリに新しい overrides-restore.yaml ファイルを作成します。
  3. オリジナルの overrides.yaml ファイルから完全な Cassandra 構成をコピーして新しいファイルに貼り付けます。
  4. 名前空間の要素を追加します。元のクラスタで使用していたものと同じ名前空間は使用しないでください。
  5.     namespace: your-restore-namespace
    
        cassandra:
          storage:
            type: gcepd
            capacity: 50Gi
            gcepd:
              replicationType: regional-pd
          nodeSelector:
            key: cloud.google.com/gke-nodepool
            value: apigee-data
          sslRootCAPath: path_to_root_ca_file
          sslCertPath: path_to_ssl_cert_file
          sslKeyPath: path_to_ssl_key_file
          auth:
            default:
              password: your_cassandra_password
            admin:
              password: admin_password
            ddl:
              password: ddl_password
            dml:
              password: dml_password
    
          restore:
              enabled: true
              snapshotTimestamp: timestamp
              serviceAccountPath: sa_json_file_path
              dbStorageBucket: gcs_bucket_path
              image:
                pullPolicy: Always
        
    ここで
    プロパティ 説明
    ssl*Pathauth.* 元の Cassandra データベースの作成時に使用したのと同じ TLS 認証情報を使用します。
    snapshotTimestamp 復元するバックアップ スナップショットのタイムスタンプ。
    serviceAccountPath バックアップ用に作成したサービス アカウントのファイルシステム上のパス。
    dbStorageBucket バックアップが保存されている GCS ストレージ バケットのパス。形式は gs://bucket_name です。必ず gs:// を付ける必要があります。
    次に例を示します。
    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
    
        

    ここで、snapshotTimestamp は、復元するバックアップに関連付けられたタイムスタンプです。

  6. 新しい Cassandra クラスタを作成します。
          ./apigeectl apply -c 2_cassandra -v beta2 -f ./overrides-restore.yaml
          ./apigeectl apply -c 2_cassandra-role -v beta2 

復元ログの表示

復元ジョブのログをチェックし、error を grep して復元ログにエラーがないことを確認できます。

復元が完了したことを確認する

復元操作が完了したかどうかを確認するには:

    kubectl get pods

    NAME                           READY     STATUS      RESTARTS   AGE
    apigee-cassandra-0             1/1       Running     0          1h
    apigee-cassandra-1             1/1       Running     0          1h
    apigee-cassandra-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 sucessfully 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-0 in default
    starting apigee-cassandra-1 in default
    starting apigee-cassandra-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-0          1/1       Running     0          2h
    apigee-cassandra-1          1/1       Running     0          2h
    apigee-cassandra-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-0 in default
    starting apigee-cassandra-1 in default
    starting apigee-cassandra-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 transfered the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
    INFO: removing cassandra snapshot
    INFO: backup created tarball and transfered 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 ...
    / [1 files][    0.0 B/    0.0 B]
    Operation completed over 1 objects.
    INFO: backup created tarball and transfered the file to gs://gce-myusername-apigee-cassandra-backup/apigeecluster/dc-1
    finished uploading schema.cql