Redis 备份与恢复

需要向 Redis 数据存储添加备份和恢复功能。

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

问题描述

使用 Redis 数据存储创建的 Trove 实例目前没有创建备份或从备份恢复的方法。需要添加此功能。

提议的变更

Redis 目前有两种持久化策略:RDB * 和 AOF (两者可以同时使用)。两种策略的备份方法相同,但是如果启用了 AOF(无论是否也启用了 RDB),则恢复方法略有不同。

注意:预计所有必要的更改都将在 Trove guestagent 中进行

代码。

*

Redis 数据库

仅追加文件

备份

将使用 redis-cli 工具创建备份。无论 Redis 中配置的持久化策略如何,此过程都相同。过程如下 1

  • 确定写入备份文件的目录。此目录存储在 Redis 配置文件(通常为 /etc/redis/redis.conf)的 dir 关键字下。目前此位置在 redis config.template 文件中硬编码,但未来可以通过配置组公开。

  • 查找上一次 Redis 持久化运行的时间,并暂时保留该信息。通过 redis-cli 执行 LASTSAVE 命令可以完成此操作,这对于确定下一次运行何时完成至关重要(如下所述)。

  • 使用 redis-cli 工具启动备份。通过执行 BGSAVE 命令来完成此操作。2 注意:如果 Redis 持久化已关闭(在 config.template 中默认情况下已打开),则必须有足够的磁盘空间来写入备份文件。

  • 等待备份完成。通过使用上述 LASTSAVE 命令进行轮询,并等待时间戳更改来确定。3

  • 压缩/加密备份

  • 将压缩/加密的输出流式传输到 Swift 中的 database_backups 容器中。如果持久化已关闭,则可以删除备份文件。

恢复

从备份恢复 Redis 服务器取决于服务器上运行的持久化方法。4

要从备份恢复 Redis 服务器 1

  • 确定是否启用了 AOF 模式

如果 AOF 已禁用

  • 确定备份文件所在的位置

  • 确保 Redis 服务器未运行(如果需要,请停止)

  • 删除现有的 dump.rdb 文件

  • 从存储中检索备份

  • 将备份放入正确的位置

  • 更改所有权为 redis:redis

  • 启动 Redis 服务器

如果 AOF 已启用

  • 确定备份文件所在的位置

  • 确保 Redis 服务器未运行(如果需要,请停止)

  • 删除现有的 dump.rdb 和 appendonly.aof

  • 从存储中检索备份

  • 将备份放入正确的位置

  • 更改所有权为 redis:redis

  • 在 Redis 配置文件中禁用 AOF

  • 启动 Redis 服务器

  • 创建一个新的 AOF 文件

  • 停止 Redis 服务器

  • 在 Redis 配置文件中启用 AOF

  • 启动 Redis 服务器

配置

需要更新以下配置选项的默认值

  • backup_namespace

  • restore_namespace

  • backup_strategy

数据库

公共 API

公共 API 安全

Python API

现有的 Python 绑定已足够,预计不需要更改。

CLI (python-troveclient)

实施这些更改后,以下 Trove CLI 命令现在将可以与 Redis 完全配合使用

  • backup-create

  • backup-delete

  • backup-list

  • backup-list-instance

  • backup-show

  • create –backup

内部 API

Guest Agent

需要将以下文件添加到 guest agent 中,其中将驻留相应的实现

guestagent/strategies/backup/experimental/redis_impl.py
guestagent/strategies/restore/experimental/redis_impl.py

将更新以下现有文件

guestagent/datastore/experimental/redis/manager.py

预计不会出现向后兼容性问题。

备选方案

实现

负责人

主要负责人

peterstac

里程碑

完成目标里程碑

Liberty-1

工作项

需要实现备份和恢复的 API 调用。

升级影响

依赖项

测试

不需要新的测试(除了必要的单元测试)。Redis 的 int-tests 组将被修改,以便在集成测试运行期间运行与备份相关的命令。如果可以设置一个第三方 Redis CI 来测试 Redis 集成功能,那将很好,但目前尚不可用。

文档影响

应修改数据存储特定的文档,以指示现在支持 Redis Trove 实例的备份和恢复。

参考资料

1(1,2)

备份和恢复过程:http://zdk.blinkenshell.org/redis-backup-and-restore

2

创建 Redis 备份:https://redis.ac.cn/commands/bgsave

3

如何确定备份何时完成:https://redis.ac.cn/commands/lastsave

4

Redis 持久化:https://redis.ac.cn/topics/persistence