IBM Cloud Docs
IBM Cloudant バックアップおよびリカバリー

IBM Cloudant バックアップおよびリカバリー

データは IBM Cloudant クラスター内に冗長に保管されますが、追加のバックアップ対策を考慮することが重要です。 例えば、 冗長データ・ストレージでは、データの変更時におけるミスから保護されません。

災害復旧 (DR) および高可用性 (HA) の要件をサポートするために IBM® Cloudant® for IBM Cloud® に用意されている他の機能とバックアップをどのように組み合わせられるかについては、IBM Cloudant 災害復旧ガイドを参照してください。

CouchBackup の導入

IBM Cloudant には、スナップショット・バックアップおよびリストア用にサポートされるツールが用意されています。 このツールは、CouchBackup と呼ばれ、オープン・ソースです。 これは node.js ライブラリーであり、 NPMにインストールすることができます。

CouchBackup パッケージには、ライブラリーおよび以下の 2 つのコマンド・ライン・ツールが含まれています。

  1. couchbackup。データベースから JSON データをバックアップ・テキスト・ファイルにダンプします。
  2. couchrestore。バックアップ・テキスト・ファイルからデータをデータベースにリストアします。

CouchBackup ツールには制限があります。

IBM Cloudant データのバックアップ

couchbackup ツールを使用して、シンプルなバックアップを実行できます。 animaldb データベースを backup.txt という名前のテキスト・ファイルにバックアップするには、以下の例のようなコマンドを使用できます。

couchbackup --url "$SERVICE_URL" --db animaldb > backup.txt

NPM README ファイル には、以下のリストに示すオプションを含む、その他のオプションの詳細が記載されています。

  • データベースの名前および URL を設定する環境変数。

  • ログ・ファイルを使用したバックアップの進行の記録。

  • 中断したバックアップを再開する機能。

    このオプションは、中断したバックアップのログ・ファイルを使用する場合にのみ使用可能です。

  • stdout 出力のリダイレクトではなく、指定出力ファイルへのバックアップ・テキスト・ファイルの送信。

    CouchBackup ツールには制限があります。

IBM Cloudant データのリストア

データをリストアするには、couchrestore ツールを使用します。 couchrestore を使用して、バックアップ・ファイルを新規 IBM Cloudant データベースにインポートします。 次に、リストアしたデータをアプリケーションが使用しようとする前に、すべての索引を作成します。

例えば、前の例でバックアップしたデータをリストアするには、以下のようにします。

couchrestore --url "https://myaccount.cloudant.com" --db newanimaldb < backup.txt

NPM README ファイル には、その他のリストア・オプションの詳細が記載されています。

制限

CouchBackup ツールには、以下の制限があります。

  • _security の設定は、ツールによってバックアップされません。
  • 添付ファイルは、ツールによってバックアップされません。
  • バックアップは、正確な「ポイント・イン・タイム」のスナップショットではありません。 これは、データベース内の文書がバッチで取得され、同じときに他のアプリケーションが文書を更新している可能性があるためです。 したがって、データベース内のデータは、最初のバッチが読み取られたときと最後のバッチが読み取られたときの間に変化する可能性があります。
  • 設計文書内に保持されている索引定義はバックアップされますが、 索引の内容はバックアップされません。 この制限は、データのリストア時に索引を再作成する必要があることを意味します。 リストアするデータの量によっては、再作成に相当な時間がかかることがあります。

ツールの使用

NPM ページ では、データのバックアップとリストアのためのコマンド・ライン・ツールの使用の基本について詳しく説明しています。 以下の例では、特定のタスクにおけるツールの使用について説明することで、そうした詳細を実際に行う方法を示します。

CouchBackup パッケージでは、そのコア機能を使用するために以下の 2 つの方法が用意されています。

  • コマンド・ライン・ツール。これを、標準 UNIX™ コマンド・パイプラインに組み込むことができます。 多くのシナリオでは、 croncouchbackup アプリケーションのシンプルなシェル・スクリプトを組み合わせることで十分対応できます。
  • Node.jsから使用可能なライブラリー。ライブラリーを使用すると、バックアップする必要があるデータベースを動的に決定するなど、より複雑なバックアップ・プロセスを作成してデプロイすることができます。

コマンド・ライン・バックアップ・ツール、またはライブラリーとアプリケーション・コードを使用して、複雑な状況の一部としての IBM Cloudant データベースからのバックアップを実現します。 便利なシナリオとして、 cronを使用してバックアップをスケジュールし、データを自動的にアップロードすることができます。 長期保存のための Cloud Object Storage

コマンド・ライン・スクリプトの例

以下の 2 つの要件を満たさなければならないことがよくあります。

バックアップ・ファイルの圧縮

couchbackup ツールでは、バックアップ・ファイルをディスクに直接書き込むか、バックアップを stdout にストリーミングすることができます。 stdout にストリーミングする場合、データを変換してからディスクに書き込むことができます。 この機能を使用して、ストリーム内のデータを圧縮します。

couchbackup --url "$SERVICE_URL" \
  --db "animaldb" | gzip > backup.gz

この例では、gzip ツールでバックアップ・データを stdin から直接受け入れ、データを圧縮してから、stdout を介して出力します。 結果として得られた圧縮データ・ストリームをリダイレクトして、 backup.gz という名前のファイルに書き込みます。

データベースでアクセス資格情報を指定する必要がある場合は、https://$USERNAME:$PASSWORD@$ACCOUNT という形式の $SERVICE_URL を使用します (例: https://myusername:mypassword@myhost.cloudant.com)。

データを他の方法で変換する場合にパイプラインを拡張するのは単純です。 例えば、 データをディスクに書き込む前に暗号化できます。 コマンド・ライン・ツールを使用して、データをオブジェクト・ストア・サービスに直接書き込むこともできます。

cron を使用した毎時または毎日のバックアップ

定期的にデータのスナップショットを取得するように cron スケジューリング・ツールをセットアップできます。

役に立つ開始点として、couchbackup で単一のバックアップをファイルに書き込みます。ファイル名には、現在の日時を含めます。例:

couchbackup --url "https://$USERNAME:$PASSWORD@$ACCOUNT.cloudant.com" \
  --db "animaldb" > animaldb-backup-`date -u "+%Y-%m-%dT%H:%M:%SZ"`.bak

コマンドが正常に機能することを確認した後に、以下のように、cron ジョブに入力できます。

  1. バックアップを実行するサーバーに CouchBackup ツールをインストールします。
  2. バックアップを保管するフォルダーを作成します。
  3. バックアップの頻度を記述する「cron 項目」を作成します。

crontab -e コマンドを使用して、cron 項目を作成できます。 「cron」のオプションの具体的な詳細については、ご使用のシステムの資料を参照してください。

バックアップを毎日実行する cron 項目は、以下の例のようになります。

0 5 * * * couchbackup --url "https://$USERNAME:$PASSWORD@$ACCOUNT.cloudant.com" --db "animaldb" > /path/to/folder/animaldb-backup-`date -u "+%Y-%m-%dT%H:%M:%SZ"`.bak

この cron 項目では、バックアップを毎日 05:00 に作成します。 必要に応じて、cron のパターンを変更して、バックアップを毎時、毎日、毎週、または毎月実行できます。

ライブラリーとしての CouchBackup の使用

couchbackup および couchrestore コマンド・ライン・ツールは、独自の Node.js アプリケーションで使用できる、ライブラリーのラッパーです。

ライブラリーは、以下の例に示すような複雑なシナリオで役立ちます。

  • 1 つのタスクで複数のデータベースをバックアップする。 このバックアップを行うには、 _all_dbs 呼び出しを使用してすべてのデータベースを識別してから、各データベースのバックアップを個別に実行します。
  • パイプラインが長い場合に、エラーのリスクが高まる。 ご使用のアプリケーションで CouchBackup ライブラリーを使用して、できる限り早くエラーを検出して解決できます。

詳しくは、 NPM ページを参照してください。

以下のスクリプト例では、couchbackup ライブラリーと IBM® クラウド・オブジェクト・ストアの使用を組み合わせる方法を示します。 このコードでは、クロス地域 S3 API を使用してデータベースをオブジェクト・ストアにバックアップする方法を示します。

このコードの前提条件は、 IBM Cloud Object Storage - S3 API Inトロの説明に従って、 IBM Cloud Object Storage の S3 クライアント・オブジェクトを初期化することです。

/*
  Backup directly from Cloudant to an S3 bucket via a stream.
  @param {string} couchHost - URL of database root
  @param {string} couchDatabase - backup source database
  @param {object} s3Client - S3 client object
  @param {string} s3Bucket - Destination S3 bucket (must exist)
  @param {string} s3Key - Destination object's key (shouldn't exist)
  @param {boolean} shallow - Whether to use couchbackup's shallow mode
  @returns {Promise}
*/
function backupToS3(sourceUrl, s3Client, s3Bucket, s3Key, shallow) {
  return new Promise((resolve, reject) => {
    debug('Setting up S3 upload to ${s3Bucket}/${s3Key}');

    // A pass through stream that has couchbackup's output
    // written to it and it then read by the S3 upload client.
    // It has a 10 MB internal buffer.
    const streamToUpload = new stream.PassThrough({highWaterMark: 10485760});

    // Set up S3 upload.
    const params = {
      Bucket: s3Bucket,
      Key: s3Key,
      Body: streamToUpload
    };
    s3Client.upload(params, function(err, data) {
      debug('S3 upload done');
      if (err) {
        debug(err);
        reject(new Error('S3 upload failed'));
        return;
      }
      debug('S3 upload succeeded');
      debug(data);
      resolve();
    }).httpUploadProgress = (progress) => {
      debug('S3 upload progress: ${progress}');
    };

    debug('Starting streaming data from ${sourceUrl}');
    couchbackup.backup(
      sourceUrl,
      streamToUpload,
      (err, obj) => {
        if (err) {
          debug(err);
          reject(new Error('CouchBackup failed with an error'));
          return;
        }
        debug('Download from ${sourceUrl} complete.');
        streamToUpload.end();  // must call end() to complete S3 upload.
        // resolve() is called by the S3 upload
      }
    );
  });
}

その他の災害復旧オプション

IBM Cloudant 災害復旧ガイドに戻り、その他の機能について確認します。 IBM Cloudant は、完全な災害復旧セットアップを提供します。