Redis 备份与恢复¶
需要向 Redis 数据存储添加备份和恢复功能。
Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/redis-backup-restore
问题描述¶
使用 Redis 数据存储创建的 Trove 实例目前没有创建备份或从备份恢复的方法。需要添加此功能。
提议的变更¶
Redis 目前有两种持久化策略:RDB * 和 AOF †(两者可以同时使用)。两种策略的备份方法相同,但是如果启用了 AOF(无论是否也启用了 RDB),则恢复方法略有不同。
- 注意:预计所有必要的更改都将在 Trove guestagent 中进行
代码。
备份¶
将使用 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 服务器
数据库¶
无
公共 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
预计不会出现向后兼容性问题。
备选方案¶
无
升级影响¶
无
依赖项¶
无
测试¶
不需要新的测试(除了必要的单元测试)。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