为 Redis 实现 root-enable/root-disable/root-show

Trove 目前支持启用 root 用户、禁用 root 用户以及显示数据库实例的 root 启用状态,但 Redis 缺乏此功能。此蓝图概述了为 Redis 实现身份验证管理框架和 API。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/root-enable-in-redis

问题描述

Trove 目前不支持 Redis 实例的 root-enable、root-disable、root-show。

提议的变更

为 Redis 实现 root-enable、root-disable 和 root-show API。它将支持两种场景,包括 Redis 单实例和 Redis 副本实例,这些操作仅支持主实例,但可以对从实例产生影响。

此实现不支持 Redis 实例集群。

以下是详细信息

Root-enable

  • 预条件检查,以确保执行此操作不是集群或从实例。

  • 获取给定实例的从实例。

  • 尝试获取原始身份验证密码以进行回滚。

  • 为给定实例执行 root 启用。考虑到它是一个单实例或 Redis 副本集的主实例,如果发生任何错误,则使用原始身份验证密码回滚并引发异常。

  • 如果一切顺利,并且存在一些从实例,则获取 root 密码并使用上述 root 密码执行 root 启用。如果存在任何失败的从实例,则将其 ID 存储到列表中。

  • 返回 Redis root 创建视图以及失败的从实例 ID 列表。

Root-disable

  • 预条件检查,以确保执行此操作不是集群或从实例。

  • 获取给定实例的从实例。

  • 尝试获取原始身份验证密码以进行回滚。

  • 为给定实例执行 root 禁用。考虑到它是一个单实例或 Redis 副本集的主实例,如果发生任何错误,则使用原始身份验证密码回滚并引发异常。

  • 如果一切顺利,并且存在一些从实例,则执行 root 禁用。如果存在任何失败的从实例,则将其 ID 存储到列表中。

  • 如果有任何失败的从实例,则返回 HTTP 代码 200 以及失败的从实例列表。如果没有,则返回 None 以及 HTTP 代码 204。

Root-show

使用 mysql 的 root-show。它可以满足我们的要求。

配置

更改以下配置值

cfg.StrOpt('root_controller',
           default='trove.extensions.redis.service.RedisRootController',
           help='Root controller implementation for redis.'),

删除 trove/templates/redis/validation-rules.json 中的 requirepass,以避免通过配置组修改身份验证。

数据库

公共 API

更改 root-enable 和 root-disable 的返回内容。由于 Redis 没有 root 用户,因此只需将用户名显示为“-”即可。如果存在任何失败的从实例,则返回它们。例如

{
    "failed_slaves": [
        "67c2f6d6-7c01-4ce9-bb18-aa951ca5a39b"
    ],
    "user": {
        "password": "bdQhBXVpk7TE689aGgqdNmJmg4qHdpdBegae",
        "name": "-"
    }
}

公共 API 安全

Python API

CLI (python-troveclient)

更改返回内容以满足上述 API。

内部 API

Guest Agent

这项工作需要一些 guest manager 的实现

  • 在执行 root 启用时,将 requirepass 和 masterauth 添加到 redis.conf 中,并应用覆盖以在不重启 Redis 服务的情况下生效。重建 admin 客户端,以确保 guest agent 仍然可以与任务管理器通信,因为此补丁 1 中已经完成了启用/禁用 Redis 中的 root 功能。

  • 在执行 root 禁用时,删除 redis.conf 中的 requirepass 和 masterauth,并应用覆盖以在不重启 Redis 服务的情况下生效。同样,重建 admin 客户端。

备选方案

我们可以通过配置组实现 Redis 的身份验证管理,但看起来使用 root-enable 和 root-disable менее удобно。

Dashboard 影响 (UX)

实现

负责人

主要负责人

fanzhang <zh.f@outlook.com>

里程碑

完成目标里程碑

Queens-Q2

工作项

  • 实现 Redis root 控制器、服务、模型和视图。

  • 实现 Redis guest agent,包括管理器、服务和模型。

升级影响

依赖项

测试

在 int_tests.py 内部,将 root_actions_groups 添加到 Redis 支持的组中,以便在适当修改以满足 Redis 的 root 操作功能后重用一些场景测试。

将添加单元测试来测试派生的控制器功能,例如

  • 测试单个 Redis 实例上的 root-enable。

  • 测试 Redis 复制的主实例上的 root-enable。

  • 测试 Redis 复制的从实例上的 root-enable。

  • 测试 is_cluster=True 时的 root-enable。

  • 测试上述情况下的 root-delete。

还将添加单元测试来测试 guest-agent 内部实现的功能,包括 enable_root 和 disable_root。

文档影响

文档 2 应更新为添加以下功能

  • 在 Redis 中启用/禁用 root 的成功响应示例。

  • 在 Redis 中启用/禁用 root 的失败响应示例。

但添加不是强制性的。

附录

无。