Redis 复制

需要向 Redis 数据存储添加复制功能。

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

问题描述

目前,只能创建单个 Redis 实例。虽然有用,但拥有多个从节点复制自指定主节点也是期望的。此规范将解决此功能。

提议的变更

Redis 复制使用起来非常简单(并且配置简单),它允许 Redis 从节点成为主服务器的精确副本。1

复制

Redis 复制具有以下特性

  • 异步

  • 多个从节点

  • 从节点复制从节点

  • 非阻塞的从节点初始化

为了提高性能,可以关闭主节点上的持久性。但是,如果系统重新启动并且 Redis 自动启动,这可能会导致数据丢失。因此,主节点需要启用持久性。

创建 Redis 复制网络由 Redis SLAVEOF 命令处理。将创建新的实例(或一组实例),并在每个实例上执行 SLAVEOF 命令。无需创建备份并将其恢复,因为 Redis 已经将此功能内置到 SLAVEOF 命令中。这意味着 Redis 复制策略需要绕过创建备份以添加到快照信息中,并且需要修改任务管理器以处理这种情况。

Note: Redis replication could be enabled using the current backup/restore
implementation, however once the slave restarts (or starts for the first
time), it will automatically do a full resync, thus rendering the backup
obsolete.  [1]_

主节点上必须有足够的磁盘空间,以允许 Redis 将其数据持久化到存储中。

Note: Starting in version 2.8.18, Redis has the (experimental) ability to
stream the backup directly to the slave.  Since this behaviour is still
considered experimental (in version 3.0), a specific version of Redis will
not be required - beyond being >= 2.8 - as the feature could be removed in
a future release.  If it exists, however, it can be used by Redis to
increase performance on systems with slow disks.  A configuration parameter
will be provided to allow operators to turn this feature on.

每个从节点上的 Redis 配置文件将设置相应的值,以便数据库后续启动将保持从节点状态。作为从节点配置的一部分,所有从节点也将设置为只读。与 MySQL 实现类似,不允许从节点复制从节点。将来可以增强此功能以包含此功能。

创建复制网络的步骤如下

  • 创建必要的配置文件。这将具有以下设置

    • slaveof <master_ip> <master_port>

    • slave-read-only

    • repl-diskless-sync-delay(如果指定了多个从节点)

  • 使用正确的配置文件创建 ‘n’ 个新的从节点实例

分离副本

需要实现当前的 detach-replica API。预计不需要对 API 进行任何补充。

故障转移

需要实现当前的故障转移 API(eject-replica-source 和 promote-to-replica-source)。在驱逐当前的副本源时,需要选择一个从节点作为新的副本源。这将通过覆盖 _most_current_replica() 方法并使其查询每个从节点并选择 ‘master_last_io_seconds_ago’ 值最小的从节点来完成。这很可能将是拥有最当前数据的从节点。

配置

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

  • replication_strategy

数据库

公共 API

公共 API 安全

Python API

现有的 Python 绑定已经足够,预计不需要进行任何更改。

CLI (python-troveclient)

实施这些更改后,以下 Trove CLI 命令现在将完全适用于 Redis

  • create –replica_of <id> –replica_count <n>

  • eject-replica-source

  • promote-to-replica-source

  • detach-replica

内部 API

Guest Agent

需要将以下文件添加到客户代理中,其中将驻留相应的实现

guestagent/strategies/replication/experimental/redis_sync.py

将更新以下现有文件

guestagent/datastore/experimental/redis/manager.py
guestagent/datastore/experimental/redis/service.py
guestagent/datastore/experimental/redis/system.py

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

备选方案

目前没有提出替代解决方案。

实现

负责人

主要负责人

peterstac

里程碑

完成目标里程碑

Liberty-2

工作项

  • 为 Redis 创建复制策略。

  • 实现 detach_replica、promote_to_replica_source 和 eject_replica_source 的 API 调用。

升级影响

依赖项

测试

不需要新的测试(除了必要的单元测试)。Redis 的 int-tests 组将被修改,以便在集成测试运行期间运行与复制相关的命令。

文档影响

应修改数据存储特定的文档,以指示 Redis 现在支持复制,以及相应的分离/故障转移命令。

参考资料

1

Redis 复制:https://redis.ac.cn/topics/replication