CouchDB 备份与恢复

在 Trove 中添加 CouchDB 备份和恢复功能的支持。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/couchdb-backup-restore

问题描述

CouchDB 是 Trove 支持的 NoSQL 数据库之一。虽然 Trove 提供了备份和恢复的支持,但此功能尚未针对 CouchDB 实现。

提议的变更

在 CouchDB 中进行完整备份的推荐方法是对数据文件进行简单的文件系统复制 1。由于 CouchDB 官方不支持增量备份,因此此功能将不会在此版本中实现。

CouchDB 是一种基于文档的数据库系统,每个数据库由多个文档组成,每个文档都是 JSON 结构。在 CouchDB 中,每个文档都与一个修订号相关联。每个数据库都存储为单个 .couch 文件,该文件是追加写入的(每次对文档进行更改时,不会覆盖现有文档,而是创建一个具有更新版本号的新文档)。这使得通过简单地复制此 .couch 文件来执行完整备份变得容易。

以下步骤概述了 CouchDB 的完整备份和恢复过程。

备份过程如下所述

  1. 定位要备份的数据库文件。默认情况下,数据库文件位于 /var/lib/couchdb 目录下(此位置将在 /etc/couchdb 目录下的 couchdb 配置文件中指定)。在 CouchDB 中,每个数据库完全包含在一个单独的追加写入文件中。这意味着我们可以在写入时进行备份。

  2. 压缩和/或加密数据库文件,并将其流式传输到 Swift 存储。

恢复过程如下所述

  1. 从存储流式传输并解压缩备份到数据库文件目录(此位置在 /etc/couchdb 配置文件中指定)

  2. 更改文件的所有者为 CouchDB 用户和组

配置

以下配置选项将使用 CouchDB 的相应值进行更新

  • 备份命名空间

  • 恢复命名空间

  • backup_strategy

数据库

公共 API

公共 API 安全

Python API

CLI (python-troveclient)

在进行这些更改后,以下命令将对 CouchDB 有效

  • backup-create

  • backup-delete

  • backup-list

  • create –backup

内部 API

Guest Agent

CouchDB guestagent 将被修改以添加对完整备份和恢复功能的支持。此外,还将添加新的策略来支持这些新功能。

将修改以下 guestagent 文件
  • trove/guestagent/datastore/experimental/couchdb/manager.py

并且将添加以下新的策略文件用于 CouchDB
  • trove/guestagent/strategies/backup/experimental/couchdb_impl.py

  • trove/guestagent/strategies/restore/experimental/couchdb_impl.py

备选方案

由于 CouchDB 官方不支持增量备份,因此替代方法是使用 CouchDB 复制接口。CouchDB 的复制接口支持主-主复制模型,并在数据库级别进行复制。它使用 REST API 在源系统和目标系统上的数据库之间触发复制。如果数据库不在同一系统上,则应以 URI 格式指定源/目标

http://<地址>:<端口>/<数据库名称>

将本地服务器上的数据库 ‘db1’ 复制到 x.x.x.x 服务器上的远程服务器的请求示例是

curl -X POST -d ‘{“source”:”db1”,”target”:”http://x.x.x.x:5984:db1”}’

https://:5984/_replicate

当从源系统到目标系统启用数据库的复制时,它使用文档修订号来跟踪差异并检测冲突并解决它。

Dashboard 影响 (UX)

待定 (在批准后添加的部分)

实现

负责人

Mariam John (mariamj@us.ibm.com)

里程碑

Mitaka

工作项

此功能将只有一个工作项。这包括实现 CouchDB 备份和恢复的策略,并进行必要的 guestagent 更改。这还将包括测试新功能所需的测试用例。

升级影响

依赖项

测试

  • 添加新的测试用例以测试 CouchDB 的备份和恢复功能

    • 添加新的单元测试以测试新实现的功能

    • 将一个新的 CouchDB 辅助类添加到现有的集成测试框架。

文档影响

数据存储文档应更新以反映启用的功能。

附录