Trove 升级

在升级 Trove 之前,建议先阅读 https://docs.openstack.org/operations-guide/ops-upgrades.html

通常,在升级 Trove 服务之前,需要重新构建一个新的 guest image,并在 Trove controller 和 guest agent 之间的接口发生变化时,用它来重新构建 guest 实例。否则,较新的 Trove controller 将无法与较旧版本的 guest agent 通信。

基本上,Trove 服务升级过程包括以下步骤:

  1. 基于新的 Trove 代码构建新的 guest image。

  2. Trove 数据库迁移。

  3. 准备服务配置文件并升级 Trove controller 服务。

  4. 使用新的 guest image 注册新的 datastore 版本。

  5. 升级 Trove 实例 (trove-guestagent)。

在 DevStack 中升级 Trove

这是一个 DevStack 中的示例,旨在提供 Trove 升级过程的基本概念。每个步骤中的命令在不同的 Trove 部署环境中可能会有所不同。

升级前

如果从 Ussuri 升级到 Victoria,最终用户首先需要备份他们的实例,并在升级后使用备份重新创建新的实例。从 Victoria 开始,实例 (trove-guestagent 服务) 的升级可以就地进行,并可以由云管理员触发。

如果您使用的是 Trove Victoria 或更新版本,请跳过本节。以下步骤仅适用于使用 Trove Ussuri 的云环境。

注意

与 Trove Ussuri 通信的 python-troveclient 的最新版本是 3.3.1。自 Victoria 版本发布以来,一些 CLI 参数已更改。

在本示例中,我们创建一个新的数据库实例,并使用此实例进行升级测试。

$ openstack database instance create test \
    $flavorid \
    --size 1 \
    --nic net-id=$netid \
    --datastore mysql --datastore-version 5.7 \
    --databases testdb --users user:password \
    --is-public
$ openstack database instance list
+--------------------------------------+------+-----------+-------------------+---------+---------------------------+--------------------------------------+------+-----------+
| ID                                   | Name | Datastore | Datastore Version | Status  | Addresses                 | Flavor ID                            | Size | Region    |
+--------------------------------------+------+-----------+-------------------+---------+---------------------------+--------------------------------------+------+-----------+
| adae9a37-2c14-4dcb-9abd-66b8c3d5808b | test | mysql     | 5.7               | HEALTHY | 10.111.0.27, 172.30.5.107 | 55d9c9ac-b136-4dcf-9a1d-ecb7077697f9 |    1 | RegionOne |
+--------------------------------------+------+-----------+-------------------+---------+---------------------------+--------------------------------------+------+-----------+

为了测试升级,我们将一些数据插入到数据库中

$ ip=172.30.5.107
$ mysql -u user -ppassword -h $ip testdb
CREATE TABLE Persons (PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255));
insert into Persons VALUES (1, 'Kong', 'Lingxian', '150 Willis Street', 'Wellington');

现在我们为该实例创建一个备份

$ dbid=adae9a37-2c14-4dcb-9abd-66b8c3d5808b
$ openstack database backup create $dbid backup-01
$ openstack database backup list
+--------------------------------------+--------------------------------------+-----------+-----------+-----------+---------------------+
| ID                                   | Instance ID                          | Name      | Status    | Parent ID | Updated             |
+--------------------------------------+--------------------------------------+-----------+-----------+-----------+---------------------+
| 5c21437f-02b3-43e0-8108-99a3497d68ad | adae9a37-2c14-4dcb-9abd-66b8c3d5808b | backup-01 | COMPLETED | None      | 2020-08-13T10:30:09 |
+--------------------------------------+--------------------------------------+-----------+-----------+-----------+---------------------+
$ openstack database backup show 5c21437f-02b3-43e0-8108-99a3497d68ad
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------+
| Field                | Value                                                                                                                             |
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------+
| created              | 2020-08-13T10:30:02                                                                                                               |
| datastore            | mysql                                                                                                                             |
| datastore_version    | 5.7                                                                                                                               |
| datastore_version_id | 8008a4ca-9124-40ea-a24b-13d53fc9b355                                                                                              |
| description          | None                                                                                                                              |
| id                   | 5c21437f-02b3-43e0-8108-99a3497d68ad                                                                                              |
| instance_id          | adae9a37-2c14-4dcb-9abd-66b8c3d5808b                                                                                              |
| locationRef          | http://10.0.19.85:8080/v1/AUTH_7e42f87f5d504da9a70cf781a98e0179/database_backups/5c21437f-02b3-43e0-8108-99a3497d68ad.xbstream.gz |
| name                 | backup-01                                                                                                                         |
| parent_id            | None                                                                                                                              |
| size                 | 0.12                                                                                                                              |
| status               | COMPLETED                                                                                                                         |
| updated              | 2020-08-13T10:30:09                                                                                                               |
+----------------------+-----------------------------------------------------------------------------------------------------------------------------------+
$ openstack object list database_backups
+--------------------------------------------------+
| Name                                             |
+--------------------------------------------------+
| 5c21437f-02b3-43e0-8108-99a3497d68ad.xbstream.gz |
+--------------------------------------------------+

升级 Trove 服务

  1. 转到 Trove 源代码目录,签出 stable/victoria 分支。

  2. 基于新的 Trove 代码构建新的 guest image。

    这里我们正在构建一个 dev-mode guest image。

    $ stackdir=/opt/stack
    $ $stackdir/trove/integration/scripts/trovestack build-image ubuntu jammy true ubuntu
    
  3. Trove 数据库迁移。

    在 trove controller 节点上

    $ trove-manage --config-file /etc/trove/trove.conf db_upgrade
    
  4. 准备服务配置文件并升级 Trove controller 服务。

    您需要阅读 Trove 发布说明,以检查新版本中是否有额外的必需配置选项。

    配置完成后,重新启动 Trove 服务

    $ sudo systemctl restart apache2.service; sudo systemctl restart devstack@tr-*
    
  5. 使用新的 guest image 更新现有的 datastore 版本。

    我们使用 MySQL datastore 作为示例。以下命令应使用 trove 服务租户凭据运行。

    $ imageid=$(openstack image create trove-guest-victoria-ubuntu-jammy-dev \
        --private \
        --disk-format qcow2 --container-format bare \
        --file ${imagefile-path} \
        --property hw_rng_model='virtio' \
        --tag trove \
        -c id -f value)
    

    如果 datastore 版本已经配置了 image tag,例如我们使用 trove,则无需执行任何操作,trove 可以自动为创建新实例选择新的 image。否则,您需要配置 datastore 的 image ID,或更新 datastore 版本以使用 image tag。

    更新 datastore 版本的 image ID

    $ openstack datastore version set <datastore-version-id> --image $imageid
    

    或者,使用 image tag 配置 datastore 版本

    $ openstack datastore version set <datastore-version-id> --image-tags trove
    

升级 Trove guest agent

  • 从 Ussuri 升级。

    注意

    建议先将 python-troveclient 升级到最新版本。您可能会注意到一些参数与上面的示例不同。

    在上面的示例中,我们在升级之前创建了一个实例和备份。现在是时候使用备份创建新的实例了。

    $ openstack database instance create test-upgrade \
      --flavor $flavorid \
      --size 1 \
      --nic net-id=$netid \
      --datastore mysql --datastore-version 5.7.29 \
      --is-public \
      --backup 5c21437f-02b3-43e0-8108-99a3497d68ad
    $ openstack database instance list
    +--------------------------------------+--------------+-----------+-------------------+---------+--------+------------------------------------------------------------------------------------------------+--------------------------------------+------+------+
    | ID                                   | Name         | Datastore | Datastore Version | Status  | Public | Addresses                                                                                      | Flavor ID                            | Size | Role |
    +--------------------------------------+--------------+-----------+-------------------+---------+--------+------------------------------------------------------------------------------------------------+--------------------------------------+------+------+
    | 93eb232a-4cd1-4273-87ab-2ee48afbaa0b | test-upgrade | mysql     | 5.7.29            | HEALTHY | True   | [{'address': '10.111.0.52', 'type': 'private'}, {'address': '172.30.5.204', 'type': 'public'}] | 55d9c9ac-b136-4dcf-9a1d-ecb7077697f9 |    1 |      |
    | adae9a37-2c14-4dcb-9abd-66b8c3d5808b | test         | mysql     | 5.7               | HEALTHY | True   | [{'address': '10.111.0.27', 'type': 'private'}, {'address': '172.30.5.107', 'type': 'public'}] | 55d9c9ac-b136-4dcf-9a1d-ecb7077697f9 |    1 |      |
    +--------------------------------------+--------------+-----------+-------------------+---------+--------+------------------------------------------------------------------------------------------------+--------------------------------------+------+------+
    

    查询数据库以确保没有数据丢失。

    $ ip=172.30.5.204
    $ mysql -u user -ppassword -h $ip testdb -e "select * from Persons;"
    +----------+----------+-----------+-------------------+------------+
    | PersonID | LastName | FirstName | Address           | City       |
    +----------+----------+-----------+-------------------+------------+
    |        1 | Kong     | Lingxian  | 150 Willis Street | Wellington |
    +----------+----------+-----------+-------------------+------------+
    

    在新数据库实例正常工作后,可以删除旧实例(及其备份)。除非将来支持数据库 DNS,否则您的数据库客户端需要使用连接字符串中的新地址。

  • 从 Victoria 或更新版本升级。

    从 Victoria 版本开始,trove 提供了使用新的 guest image 重新构建现有实例的 API,实例的 IP 地址和配置在实例重新构建后不会更改。 重新构建 API 默认情况下仅供云管理员使用。

    警告

    在重新构建期间,现有的数据库连接将被断开,必须通知云用户。

    $ openstack database instance rebuild $dbid $imageid
    

    实例恢复到 HEALTHY 后,您可以使用与之前相同的数据库连接字符串来验证数据。