构建客户镜像

概述

当 Trove 收到创建数据库实例的命令时,它会通过启动 Glance 中存储的适当客户镜像的 Nova 实例来执行此操作。本文档向您展示构建客户镜像的步骤。

注意

为了测试目的,Trove 客户镜像的某些特定数据库会定期构建并在 http://tarballs.openstack.org/trove/images/ 中 Trove 上游 CI 中发布。

自 Victoria 版本发布以来,Trove 支持在客户实例内部将数据库服务作为 docker 容器运行,因此我们无需为不同的数据库服务维护多个镜像。这就是您可以在 Ussuri 和 Train 版本的 http://tarballs.openstack.org/trove/images/ 中看到 MySQL 和 MariaDB 镜像的原因。

此外,如果您在 devstack 环境中安装 Trove,除非在 devstack local.conf 文件中通过设置 TROVE_ENABLE_IMAGE_BUILD=false 来禁用,否则客户镜像将在 Glance 中自动创建和注册。

自 Yoga 版本发布以来,Trove 将默认 use_nova_server_config_drive 设置为 False。此更改在某些情况下会破坏实例配置。为了避免这种情况,请确保您的 DIB_CLOUD_INIT_DATASOURCES 环境包含 OpenStack,以配置 cloud-init 使用元数据服务。如果更改环境后 cloud-init 仍然无法注入文件,请要求您的 IaaS 提供商管理员启用 OpenStack 元数据服务。

Trove 客户实例的高级概述

在最基本层面上,Trove 客户实例是 Trove 响应创建命令而启动的 Nova 实例。本节描述了 Trove 客户实例的各个组件。

操作系统

官方支持的操作系统是 Ubuntu,功能测试基于此运行。

Docker

自 Vitoria 版本发布以来,数据库服务在 trove 客户实例内部作为 docker 容器运行,因此在构建客户镜像时应安装 docker。这也意味着 trove 客户实例应该能够从镜像仓库(无论是用户端口还是 trove 管理端口)拉取 docker 镜像,相关的容器镜像选项是

[mysql]
docker_image
backup_docker_image

[postgresql]
docker_image
backup_docker_image

[mariadb]
docker_image
backup_docker_image

Trove 客户代理

客户代理在用于运行数据库引擎的 Nova 实例内部运行。该代理侦听消息总线上的主题,并负责实际翻译和执行发送到它的任务管理器组件的命令,以用于特定的数据存储。

Trove 客户代理负责数据存储 docker 容器管理。

注入到客户代理的配置

当 TaskManager 启动客户 VM 时,它会将配置文件注入到 VM 中,包括

  • /etc/trove/conf.d/guest_info.conf:包含有关客户的一些信息,例如客户标识符、租户 ID 等。

  • /etc/trove/conf.d/trove-guestagent.conf:客户代理服务的配置文件。

除了这些配置文件之外,Trove 还支持在启动实例时注入用户数据以进行启动时自定义,例如网络配置、hosts 文件设置等。用户数据文件位于 cloudinit_location 配置的目录中,对于 mysql,文件名为 mysql.cloudinit

持久存储、网络

数据库在 Cinder(如果 CONF.volume_support=True)或 Nova 实例上的临时存储上存储数据。数据库服务可以通过在创建数据库实例时提供的租户网络访问。

云管理员能够配置管理网络(CONF.management_networks),这些网络对云租户不可见,但用于数据库实例和控制平面服务(例如消息队列)之间的通信。

构建客户镜像

自 Victoria 版本发布以来,单个 trove 客户镜像可用于不同的数据存储,因此无需为不同的数据存储维护不同的镜像。

使用 trovestack 构建镜像

trovestack 是 Trove 社区提供的推荐工具,用于构建客户镜像。在运行 trovestack 命令之前

git clone https://opendev.org/openstack/trove
cd trove/integration/scripts

可以通过运行以下命令创建 trove 客户镜像

$ ./trovestack build-image \
    ${guest_os} \
    ${guest_os_release} \
    ${dev_mode} \
    ${guest_username} \
    ${output_image_path}
  • 目前,只有 guest_os=ubuntuguest_os_release=jammy 经过全面测试和支持。

  • 默认输入值

    guest_os=ubuntu
    guest_os_release=jammy
    dev_mode=true
    guest_username=ubuntu
    output_image_path=$HOME/images/trove-guest-${guest_os}-${guest_os_release}-dev.qcow2
    
  • dev_mode=true 主要用于测试目的,供 trove 开发人员使用,并且需要在 trove 控制器主机上构建镜像,因为主机和客户 VM 需要在没有密码的情况下相互 ssh。在这种模式下,当 trove 客户代理代码更改时,无需重建镜像,这对于调试非常方便。Trove 客户代理将在服务初始化期间 ssh 到控制器节点并下载 trove 代码。

  • 如果 dev_mode=false,则 trove 代码用于在构建时注入到镜像中的客户代理。

  • 其他一些全局变量

    • HOST_SCP_USERNAME:仅在开发模式下使用,这是客户代理用于连接到控制器主机的用户名,例如在 devstack 环境中,它应该是 stack 用户。

  • 可以通过指定不同的镜像文件扩展名轻松更改镜像类型,例如,要构建原始镜像,可以将 $your-image-name.raw 指定为 output_image_path 参数。

例如,为了构建 Ubuntu jammy 操作系统的客户镜像,进入开发模式

$ ./trovestack build-image ubuntu jammy true ubuntu

完成镜像构建后,云管理员需要使用 trove-manage 命令在 Glance 中注册镜像,并使用 trove-manage 命令注册新的数据存储或版本,例如,在构建 MySQL 5.7.29 的镜像后

$ openstack image create trove-guest-ubuntu-jammy \
  --private \
  --disk-format qcow2 \
  --container-format bare \
  --tag trove --tag mysql \
  --file ~/images/trove-guest-ubuntu-jammy-dev.qcow2
$ openstack datastore version create 5.7.29 mysql mysql "" \
  --image-tags trove,mysql \
  --active --default
$ trove-manage db_load_datastore_config_parameters mysql 5.7.29 ${trove_repo_dir}/trove/templates/mysql/validation-rules.json

注意

trove-manage 命令需要在 Trove 控制器节点上运行。

如果您看到任何错误或需要镜像创建方面的帮助,请在 #openstack-trove IRC 频道或发送电子邮件到 openstack-discuss@lists.openstack.org 邮件列表中寻求帮助。

使用您自己的 Docker 镜像

Docker 注册表是一个本地托管的注册表,可替代从公共注册表获取镜像的需求。当您使用私有 Docker 注册表时,可以拉取和推送您自己的镜像。有关 Docker 注册表,请参阅 Docker 注册表概述

可以按如下方式在当前主机上部署一个非常简单的注册表

sudo docker run -d --net=host -e REGISTRY_HTTP_ADDR=0.0.0.0:4000 --restart=always -v /opt/trove_registry/:/var/lib/registry --name registry registry:2

在构建您自己的镜像之前,克隆 Trove 的 git 仓库并定义一些环境。请注意:您的注册表地址应可被客户代理访问。

$ git clone --branch |TROVE_BRANCH_NAME| https://opendev.org/openstack/trove
$ YOUR_TROVE_SRC_DIR=${PWD}/trove
$ YOUR_REGISTRY_IP=<10.x.y.z>
$ YOUR_REGISTRY_PORT=4000
$ YOUR_REGISTRY_HTTP_ADDR=${YOUR_REGISTRY_IP}:${YOUR_REGISTRY_PORT}
$ YOUR_REGISTRY_REPO_NAME=trove-datastores

对于 mysql 用户,您可以按如下方式拉取和推送您自己的镜像到您自己的注册表

$ DATABASE_NAME=mysql
$ DATABASE_VERSION=5.7
$ TROVE_DATABASE_IMAGE=${YOUR_REGISTRY_REPO_NAME}/${DATABASE_NAME}:${DATABASE_VERSION}
$ docker pull ${DATABASE_NAME}:${DATABASE_VERSION}
$ docker tag ${DATABASE_NAME}:${DATABASE_VERSION} ${YOUR_REGISTRY_HTTP_ADDR}/${TROVE_DATABASE_IMAGE}
$ docker push ${YOUR_REGISTRY_HTTP_ADDR}/${TROVE_DATABASE_IMAGE}

您可以按如下方式构建和推送您自己的备份镜像到您自己的注册表

$ cd ${YOUR_TROVE_SRC_DIR}/backup
$ TROVE_DATABASE_BACKUP_IMAGE=${YOUR_REGISTRY_HTTP_ADDR}/${YOUR_REGISTRY_REPO_NAME}/db-backup-${DATABASE_NAME}:${DATABASE_VERSION}
$ docker build -t ${TROVE_DATABASE_BACKUP_IMAGE} --build-arg DATASTORE=${DATABASE_NAME} --build-arg DATASTORE_VERSION=${DATABASE_VERSION} .
$ docker push ${TROVE_DATABASE_BACKUP_IMAGE}

对于 mariadb 用户,您可以按如下方式拉取和推送您自己的镜像到您自己的注册表

$ DATABASE_NAME=mariadb
$ DATABASE_VERSION=10.4
$ TROVE_DATABASE_IMAGE=${YOUR_REGISTRY_HTTP_ADDR}/${YOUR_REGISTRY_REPO_NAME}/${DATABASE_NAME}:${DATABASE_VERSION}
$ docker pull ${DATABASE_NAME}:${DATABASE_VERSION}
$ docker tag ${DATABASE_NAME}:${DATABASE_VERSION} ${TROVE_DATABASE_IMAGE}
$ docker push ${TROVE_DATABASE_IMAGE}

您可以按如下方式构建和推送您自己的备份镜像到您自己的注册表

$ cd ${YOUR_TROVE_SRC_DIR}/backup
$ TROVE_DATABASE_BACKUP_IMAGE=${YOUR_REGISTRY_HTTP_ADDR}/${YOUR_REGISTRY_REPO_NAME}/db-backup-${DATABASE_NAME}:${DATABASE_VERSION}
$ docker build -t ${TROVE_DATABASE_BACKUP_IMAGE} --build-arg DATASTORE=${DATABASE_NAME} --build-arg DATASTORE_VERSION=${DATABASE_VERSION} .
$ docker push ${TROVE_DATABASE_BACKUP_IMAGE}

对于 postgres 用户,您可以按如下方式拉取和推送您自己的镜像到您自己的注册表

$ DATABASE_NAME=postgres
$ DATABASE_VERSION=12
$ TROVE_DATABASE_IMAGE=${YOUR_REGISTRY_HTTP_ADDR}/${YOUR_REGISTRY_REPO_NAME}/${DATABASE_NAME}:${DATABASE_VERSION}
$ docker pull ${DATABASE_NAME}:${DATABASE_VERSION}
$ docker tag ${DATABASE_NAME}:${DATABASE_VERSION} ${TROVE_DATABASE_IMAGE}
$ docker push ${TROVE_DATABASE_IMAGE}

您可以按如下方式构建和推送您自己的备份镜像到您自己的注册表

$ cd ${YOUR_TROVE_SRC_DIR}/backup
$ TROVE_DATABASE_BACKUP_IMAGE=${YOUR_REGISTRY_HTTP_ADDR}/${YOUR_REGISTRY_REPO_NAME}/db-backup-${DATABASE_NAME}:${DATABASE_VERSION}
$ docker build -t ${TROVE_DATABASE_BACKUP_IMAGE} --build-arg DATASTORE=${DATABASE_NAME} --build-arg DATASTORE_VERSION=${DATABASE_VERSION} .
$ docker push ${TROVE_DATABASE_BACKUP_IMAGE}

将您自己的 docker 镜像添加到您的 docker 注册表后,您应该修改配置文件并重新启动 Trove 进程。

/etc/trove/trove.conf:

[DEFAULT]
docker_insecure_registries = 10.x.y.z:4000

/etc/trove/trove-agent.conf:

[mysql]
docker_image = 10.x.y.z:4000/trove-datastores/mysql
backup_docker_image = 10.x.y.z:4000/trove-datastores/db-backup-mysql

[mariadb]
docker_image = 10.x.y.z:4000/trove-datastores/mariadb
backup_docker_image = 10.x.y.z:4000/trove-datastores/db-backup-mariadb

[postgres]
docker_image = 10.x.y.z:4000/trove-datastores/postgres
backup_docker_image = 10.x.y.z:4000/trove-datastores/db-backup-postgres

[guest_agent]
container_registry = 10.x.y.z:4000
container_registry_username =
container_registry_password =