IBM Cloud Docs
IBM Cloudant 备份和恢复

IBM Cloudant 备份和恢复

虽然数据以冗余方式存储在 IBM Cloudant 集群中,但考虑额外的备份措施仍然很重要。 例如,当更改数据时,冗余数据存储无法防止错误。

查看 IBM® Cloudant® for IBM Cloud® 灾难恢复指南 ,以了解备份与 IBM Cloudant 为支持灾难恢复 (DR) 和高可用性 (HA) 需求而提供的其他功能的匹配位置。

CouchBackup 简介

IBM Cloudant 提供了一个用于快照备份和复原的支持工具。 该工具名为 CouchBackup,是开放式源代码性质的。 它是 node.js 库,您可以将其安装在 NPM上。

CouchBackup 软件包包含库和两个命令行工具:

  1. couchbackup,用于将数据库中的 JSON 数据转储到备份文本文件。
  2. couchrestore,用于将备份文本文件中的数据复原到数据库。

CouchBackup 工具存在限制

备份 IBM Cloudant 数据

可以使用 couchbackup 工具来执行简单备份。 要将 animaldb 数据库备份到名为 backup.txt 的文本文件,可以使用类似于以下示例的命令:

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

NPM 自述文件 详细描述了其他选项,包括此列表中的选项:

  • 用于设置数据库名称和 URL 的环境变量。

  • 使用日志文件来记录备份的进度。

  • 恢复已中断备份的能力。

    此选项仅可用于已中断备份的日志文件。

  • 将备份文本文件发送到指定的输出文件,而不是重定向 stdout 输出。

    CouchBackup 工具存在限制

复原 IBM Cloudant 数据

要复原数据,请使用 couchrestore 工具。 使用 couchrestore 将备份文件导入到新的 IBM Cloudant 数据库中。 然后,确保在任何应用程序尝试使用复原的数据之前构建所有索引。

例如,要复原先前示例中备份的数据,请执行以下操作:

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

NPM 自述文件 提供其他复原选项的详细信息。

限制

CouchBackup 工具存在以下限制:

  • 工具不会备份 _security 设置。
  • 附件未由工具备份。
  • 备份不是精确的 "时间点" 快照。 原因是数据库中的文档是批量检索的,而其他应用程序可能在同时更新文档。 因此,数据库中的数据可以在读取第一个批处理和最后一个批处理的时间之间进行更改。
  • 将备份保存在设计文档中的索引定义,但不会备份索引的内容。 此限制意味着复原数据时,必须重建索引。 重建可能需要相当长的时间,具体取决于复原的数据量。

使用工具

NPM 页面 详细描述了使用命令行工具备份和复原数据的基础知识。 以下示例通过描述如何将工具用于特定任务,说明了如何实际运用这些详细信息。

CouchBackup 软件包提供了两种方法来使用其核心功能。

  • 可以将命令行工具嵌入到标准 UNIX™ 命令管道中。 对于许多方案, croncouchbackup 应用程序的简单 shell 脚本编制的组合已足以满足需求。
  • 可用于 Node.js的库。 该库允许创建和部署更复杂的备份进程,例如动态确定必须备份哪些数据库。

使用命令行备份工具或带有应用程序代码的库,作为更复杂的情况的一部分,从 IBM Cloudant 数据库启用备份。 一个有用的方案是使用 cron调度备份,并自动将数据上载到 Cloud Object Storage ,用于长期保留。

命令行脚本编制示例

您经常需要满足以下两个要求:

  • 在创建时由 "压缩" 备份 文件节省磁盘空间。
  • 定期时间间隔自动创建数据库的备份。

压缩备份文件

couchbackup 工具可以将备份文件直接写入磁盘,也可以将备份流式传送到 stdout。 流式传送到 stdout 支持在对数据进行变换之后再将其写入磁盘。 此功能用于压缩流中的数据。

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

在此示例中,gzip 工具直接通过其 stdin 接受备份数据,压缩数据,再通过 stdout 发出数据。 随后,生成的压缩数据流将重定向并写入名为 backup.gz 的文件。

如果数据库要求您提供访问凭证,请将 $SERVICE_URL 与表单 https://$USERNAME:$PASSWORD@$ACCOUNT配合使用,例如 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 用作库

couchbackupcouchrestore 命令行工具围绕可在您自己的 Node.js 应用程序中使用的库进行包装。

对于更复杂的方案,库会很有用,例如:

  • 在一个任务中备份多个数据库。 您可以通过使用 _all_dbs 调用来标识所有数据库,然后分别执行每个数据库的备份来执行此备份。
  • 管道越长,出错的风险越高。 通过使用 CouchBackup 库,应用程序可以尽早检测并处理任何错误。

有关更多信息,请参阅 NPM 页面

以下脚本样本说明了如何将 couchbackup 库与 IBM® Cloud Object Storage 组合使用。 此代码说明了可以如何使用跨区域 S3 API 将数据库备份到对象存储。

代码的先决条件是通过遵循 IBM Cloud Object Storage - S3 API Intro中的指示信息来初始化 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 提供完整的灾难恢复设置。