Trove 升级¶
在升级 Trove 之前,建议先阅读 https://docs.openstack.org/operations-guide/ops-upgrades.html。
通常,在升级 Trove 服务之前,需要重新构建一个新的 guest image,并在 Trove controller 和 guest agent 之间的接口发生变化时,用它来重新构建 guest 实例。否则,较新的 Trove controller 将无法与较旧版本的 guest agent 通信。
基本上,Trove 服务升级过程包括以下步骤:
基于新的 Trove 代码构建新的 guest image。
Trove 数据库迁移。
准备服务配置文件并升级 Trove controller 服务。
使用新的 guest image 注册新的 datastore 版本。
升级 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 服务¶
转到 Trove 源代码目录,签出
stable/victoria分支。基于新的 Trove 代码构建新的 guest image。
这里我们正在构建一个 dev-mode guest image。
$ stackdir=/opt/stack $ $stackdir/trove/integration/scripts/trovestack build-image ubuntu jammy true ubuntu
Trove 数据库迁移。
在 trove controller 节点上
$ trove-manage --config-file /etc/trove/trove.conf db_upgrade
准备服务配置文件并升级 Trove controller 服务。
您需要阅读 Trove 发布说明,以检查新版本中是否有额外的必需配置选项。
配置完成后,重新启动 Trove 服务
$ sudo systemctl restart apache2.service; sudo systemctl restart devstack@tr-*
使用新的 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 后,您可以使用与之前相同的数据库连接字符串来验证数据。