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’ 值最小的从节点来完成。这很可能将是拥有最当前数据的从节点。
数据库¶
无
公共 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 现在支持复制,以及相应的分离/故障转移命令。