运行 Trove 在生产环境

本文档并非在所有生产环境中部署 Trove 的权威指南。根据您的具体情况和限制,部署 Trove 的方法有很多种。我们希望本文档能让云运营商或发行版创建者对 Trove 组件的实际组装方式有一个基本的了解。通过此了解,应该更清楚地了解 Trove 的组件如何在生产云环境中跨物理硬件进行划分或复制,从而有助于实现数据库即服务软件的可扩展性和弹性。

为了保持本指南的较高层次,并避免通过指定为完成以下任务应运行的确切命令而导致过时或特定于运营商/发行版的环境假设,我们将仅描述需要完成的内容,并让云运营商或发行版创建者“做好正确的事情”来完成其环境中的任务。如果您需要有关运行特定命令以完成以下任务的指导,我们建议阅读此项目 devstack 子目录中的 plugin.sh 脚本。devstack 插件以正确的顺序执行 Trove 的所有基本组件,本指南将是对该过程的详细说明。

环境假设

本指南的范围是提供有关在生产环境中设置 Trove 所有组件的基本概述,假设将使用默认的内置驱动程序和组件。

为了本指南的目的,我们将因此假设以下核心组件已经为您的生产 OpenStack 环境设置好

  • RabbitMQ

  • MySQL

  • Keystone

  • Nova

  • Cinder

  • Neutron

  • Glance

  • Swift

生产部署演练

创建 Trove 服务用户

默认情况下,Trove 将使用“trove”用户,在“service”租户中具有“admin”角色,用于 keystone 身份验证以及与所有其他服务的交互。

服务租户部署

在生产环境中,为 Trove 实例创建的几乎所有云资源(Swift 对象用于备份数据和公共实例的浮动 IP 地址除外)都应仅对 Trove 服务用户可见。作为 DBaaS 用户,他们应该只在创建后看到 Trove 实例,并且不知道底层 Nova VM、Cinder 卷、Neutron 管理网络和安全组。与 Trove 实例交互的唯一方法是与 Trove API 交互。

自 Ussuri 版本发布以来,服务租户部署是 Trove 的默认配置。

安装 Trove 控制器软件

Trove 控制器服务应放置在可以访问数据库、oslo 消息传递系统和其他 OpenStack 服务的位置。Trove 使用标准的 python setuptools,因此软件本身的安装应该很简单。

为了提供控制器软件的可扩展性和可用性,建议在单独的物理主机上运行各个 Trove 控制器组件的多个实例。

管理网络

Trove 使用一个专用的“管理网络”,控制器用于与 Trove 实例内部运行的客户代理进行通信,反之亦然。Trove 部署的所有实例都将在此网络上具有接口。因此,重要的是部署在此网络上的子网足够大,以允许在云安装的整个生命周期中可能部署的最大数量的实例和控制器。

通常,在创建 Trove 实例后,将有 2 个网卡附加到实例 VM,一个用于用户定义的网络上的数据库流量,一个用于管理目的。Trove 将检查用户的子网是否与管理网络冲突。

您还可以创建一个管理 Neutron 安全组,该安全组将应用于管理端口。基本上,不需要允许任何内容访问管理端口,Trove 实例内的网络通信大部分是出站流量(例如,客户代理启动与 RabbitMQ 的连接)。但是,允许从控制器访问 Trove 实例的 SSH 访问(例如,TCP 端口 22)可能对故障排除有所帮助,尽管在生产环境中这并非绝对必要。

为了 SSH 进入 Trove 实例(如上所述,有帮助但不是必需的),云管理员需要创建和配置 Nova 密钥对。

最后,您需要向此网络添加路由或接口,以便 Trove 实例内部运行的客户代理能够连接到 RabbitMQ。

RabbitMQ 考虑事项

trove-taskmanager 和 trove-conductor 都通过消息传递系统(即 RabbitMQ)与 Trove 实例内部的客户代理进行通信。一旦客户代理启动并运行,它将侦听一个专门为该特定实例设置的消息队列,即 guestagent.<guest ID>,接收来自 trove-taskmanager 的请求,用于设置数据库软件、创建数据库和用户、重新启动数据库服务等操作。同时,trove-guestagent 会定期通过消息传递系统将状态更新信息发送到 trove-conductor。

话虽如此,需要配置 RabbitMQ 用户名和密码到 trove-guestagent 配置文件中,这可能会给云部署者带来安全问题。如果客户实例受到损害,则客户凭据受到损害,这意味着消息传递系统受到损害。

作为解决方案的一部分,Trove 在 Ocata 版本中引入了一个 安全增强 功能,使用加密密钥来保护控制平面和客户实例之间的消息,从而保证一个受损的客户实例不会影响其他实例或其他云用户。

配置 Trove

默认 Trove 配置文件位置是 /etc/trove/trove.conf。您可以通过运行以下命令生成示例配置文件

cd <trove dir>
pip install -e .
oslo-config-generator --namespace trove.config --namespace oslo.messaging --namespace oslo.log --namespace oslo.policy --output-file /etc/trove/trove.conf.sample

典型的配置选项(不是完整列表)是

DEFAULT 组
enable_secure_rpc_messaging

是否应通过加密保护 RPC 消息传递流量。

taskmanager_rpc_encr_key

用于加密发送到 trove-taskmanager 的 RPC 消息的密钥(OpenSSL aes_cbc),由 trove-api 使用。

instance_rpc_encr_key

用于加密从 trove-taskmanager 发送到客户实例的 RPC 消息以及从客户实例发送到 trove-conductor 的消息的密钥。此密钥由 trove-taskmanager 自动生成,并在创建实例时注入到客户实例中。

inst_rpc_key_encr_key

用于在将每实例 PRC 加密密钥存储到 Trove 数据库之前对其进行加密的数据库加密密钥。

management_networks

管理网络,当前只允许一个管理网络。

management_security_groups

应用于数据库实例的管理端口的管理安全组列表。

cinder_volume_type

用于创建附加到 Trove 实例的卷的 Cinder 卷类型。

nova_keypair

要注入到数据库实例以启用 SSH 访问的 Nova 密钥对的名称。

default_datastore

如果用户未提供,则要使用的默认数据存储 ID 或名称。如果默认值为 None,则实例创建请求中该字段将变为必需。

max_accepted_volume_size

实例的默认最大卷大小(以 GB 为单位)。

max_instances_per_tenant

每个租户的默认最大实例数。

max_backups_per_tenant

每个租户的默认最大备份数。

transport_url

消息服务器连接 URL,例如 rabbit://stackrabbit:password@10.0.119.251:5672/

control_exchange

Trove 消息传递服务的交换名称,可以通过 transport_url 选项中指定的交换名称覆盖。

reboot_time_out

等待服务器重新启动的最大时间(以秒为单位)。

usage_timeout

等待 Trove 实例变为 ACTIVE 以进行创建的最大时间(以秒为单位)。

restore_usage_timeout

等待 Trove 实例变为 ACTIVE 以进行还原的最大时间(以秒为单位)。

agent_call_high_timeout

等待客户代理完成“慢”请求(例如重新启动实例服务器)的最大时间(以秒为单位)。

database_service_uid

数据库服务用户的 UID(GID)。

keystone_authtoken 组

与大多数其他 OpenStack 服务一样,Trove 使用 Keystone 身份验证中间件 进行身份验证和授权。

service_credentials 组

此部分中的选项与 keystone_authtoken 中的选项大致相同,但您可以为 Trove 与 Nova、Neutron、Cinder 等其他 OpenStack 服务进行通信配置另一个服务用户。

  • auth_url

  • region_name

  • project_name

  • username

  • password

  • project_domain_name

  • user_domain_name

database 组
connection

用于连接到数据库的 SQLAlchemy 连接字符串,例如 mysql+pymysql://root:password@127.0.0.1/trove?charset=utf8

如果默认 API 访问策略不满足要求,云管理员还需要提供策略文件 /etc/trove/policy.yaml。要生成包含所有默认策略的示例策略文件,请在仓库文件夹中运行 tox -egenpolicy,新文件将位于 etc/trove/policy.yaml.sample 中。

警告

自 Trove 15.0.0 (Wallaby) 版本以来,JSON 格式的策略文件已被弃用。此 oslopolicy-convert-json-to-yaml 工具将以向后兼容的方式将现有的 JSON 格式策略文件迁移到 YAML。

配置 Trove 客户代理

trove 客户代理的配置文件是从 trove 控制器节点复制的(默认文件路径 /etc/trove/trove-guestagent.conf)在创建实例时。

专门针对 trove 客户代理的一些配置选项

  • 自定义容器镜像注册表。

    Trove 客户代理默认从 docker hub 拉取容器镜像,可以通过设置

    [guest_agent]
    container_registry =
    container_registry_username =
    container_registry_password =
    

    然后在特定的数据库配置部分,可以使用自定义的容器注册表,例如:

    [mysql]
    docker_image = your-registry/your-repo/mysql
    backup_docker_image = your-registry/your-repo/db-backup-mysql
    
  • 设置每个数据存储的用户名、UID、GID

    当前,当数据库容器运行时,它由用户:database(UID:1001)和组:database(GID:1001)拥有。

    在某些情况下,您可能需要设置文件、目录或容器的所有者以适应您自己的数据存储镜像。

    为此,您可以配置 trove-guestagent.conf 中的 database_service_uname、database_service_uid、database_service_gid 选项,如下所示

    [<datastore_manage>]
    database_service_uid = 1001
    database_service_gid = 0
    database_service_uname = postgres
    

使 Trove 适用于每个数据存储的多个版本

当 Trove 执行备份/还原操作时,Trove 客户代理会拉取与数据库实例运行的数据存储版本匹配的标签的容器镜像。为了确保 trove 客户代理可以正确运行备份/还原,您需要确保镜像在注册表中具有适当的标签。例如:如果您的数据存储管理器是“mariadb”,其名称是“MariaDB”,并且它有两个数据存储版本

openstack datastore version list MariaDB
+--------------------------------------+------+---------+
| ID                                   | Name | Version |
+--------------------------------------+------+---------+
| 550aebf7-df97-49f1-bf24-7cd7b69fa365 | 10.3 | 10.3    |
| ee988cc3-bb30-4aaf-9837-e90a34f60d37 | 10.4 | 10.4    |
+--------------------------------------+------+---------+

配置 backup_docker_image 选项如下

[mariadb]
# Database docker image. (string value)
docker_image = your-registry/your-repo/db-mariadb

# The docker image used for backup and restore. (string value)
backup_docker_image = your-registry/your-repo/db-backup-mariadb

注意

不要为镜像配置镜像标签。因为如果镜像不包含标签,Trove 将使用数据存储版本作为标签。

管理员需要确保 Docker 备份镜像在 docker 注册表中具有 2 个标签(10.3 & 10.4)。例如:your-registry/your-repo/db-backup-mariadb:10.3 & your-registry/your-repo/db-backup-mariadb:10.4

最后,当 trove-guestagent 执行备份/还原时,它将使用等于数据存储版本的标签拉取此镜像。

配置备份存储策略

默认情况下,trove 使用 swift 作为备份存储后端。使用 swift 存储后端备份和还原实例相对较慢。因为 trove 客户代理需要先运行备份容器,然后执行备份操作并最终将其保存到 swift。

trove 还支持 cinder 存储策略。与 Swift 相比,Cinder 可以更快地执行备份/还原操作,因为客户代理不需要在实例中执行备份,而是 Trove 任务管理器调用 Cinder api 对数据磁盘进行快照。然后稍后从快照还原。

swift 和 cinder 的优缺点

  • Swift 后端支持从任何可访问的位置还原,但速度较慢。

  • Cinder 后端备份速度更快,但不支持跨存储系统还原。

管理员可以根据需求为备份和复制配置不同的策略。

例如

/etc/trove/trove-guestagent.conf 中设置相关选项

[DEFAULT]
storage_strategy = swift
replica_snapshot_driver = cinder

同时在 /etc/trove/trove.conf 中设置相关选项。

[DEFAULT]
storage_strategy = swift
replica_snapshot_driver = cinder

注意

管理员需要在 trove-geustagent.conftrove.conf 中设置这些选项

初始化 Trove 数据库

Caracal 版本更改:数据库迁移引擎已从 sqlalchemy-migrate 更改为 alembic,并且删除了 sqlalchemy-migrate

这由此仓库的 trove/db/sqlalchemy/migrations/versions 目录下的 alembic 脚本控制。可以使用 trove-manage 脚本(应与 Trove 控制器软件一起安装)来帮助初始化 Trove 数据库。请注意,此工具查看 /etc/trove/trove.conf 文件以获取其数据库凭据,因此必须在配置 Trove 之后才能初始化数据库。

启动 Trove 控制器

我们建议使用 upstart / systemd 脚本来确保 Trove 控制器的所有组件都已启动并保持运行。

准备客户镜像

当前支持的数据库是:MySQL 5.7.X、MariaDB 10.4.X。PostgreSQL 12.4 得到部分支持。

现在 Trove 系统已安装,下一步是构建我们将用于 DBaaS 正常运行的镜像。这可能是最重要的步骤,因为这将是特定数据存储使用的黄金标准。

注意

为了简单起见,尤其是对于测试,我们可以使用 OpenStack 本身提供的预构建镜像。这些镜像应严格用于测试和开发用途,不应在生产环境中使用。镜像可供下载,位于 http://tarballs.openstack.org/trove/images/

从 Victoria 版本开始,Trove 为所有支持的数据存储使用单个客户镜像。数据库服务作为容器在 Trove 实例内部运行,这简化了数据存储管理和维护。

对于生产系统,建议创建和维护您自己的镜像,以便符合公司安全团队制定的标准。在Trove社区中,我们使用 Disk Image Builder(DIB) 来创建Trove镜像,所有元素都位于仓库的 integration/scripts/files/elements 文件夹中。

Trove 提供了一个名为 trovestack 的脚本来帮助构建镜像,请参考 使用 trovestack 构建镜像 了解更多信息。请确保在生产环境中将 dev_mode=false 设置为 false。

镜像创建成功后,云管理员需要将其上传到 Glance 并使其仅对服务用户可访问。建议在创建 Glance 镜像时使用标签。

准备数据存储

镜像上传后,云管理员应创建数据存储、数据存储版本和特定版本的配置参数。

建议为每个数据存储配置默认版本。

trove-manage 只能在 trove 控制器节点上使用。

命令示例

$ # Creating datastore 'mysql' and datastore version 5.7.29.
$ openstack datastore version create 5.7.29 mysql mysql "" \
  --image-tags trove,mysql \
  --active --default \
  --version-number 5.7.29
$ # Register configuration parameters for the datastore version
$ trove-manage db_load_datastore_config_parameters mysql 5.7.29 ${trove_repo_dir}}/trove/templates/mysql/validation-rules.json

配额管理

每个 OpenStack 项目可以创建的资源数量由配额控制。除非云管理员通过 配额 API 进行更改,否则每个项目的默认 Trove 资源配额在 Trove 配置文件中设置如下。

[DEFAULT]
max_instances_per_tenant = 10
max_backups_per_tenant = 50

与此同时,trove 服务项目本身也需要配额来创建与 trove 实例对应的云资源,例如:

openstack quota set \
  --instances 200 \
  --server-groups 200 \
  --volumes 200 \
  --secgroups 200 \
  --ports 400 \
  <trove-service-project>

Trove 部署验证

如果已遵循以上所有说明,现在应该可以使用 OpenStack CLI 部署 Trove 实例,并与 Trove V1 API 通信。

请参考 创建和访问数据库 了解详细步骤。