trove introduction and practice
introduction
Trove is Database as a Service for OpenStack.
design
1 2 3 4 5 6 7 8 9 10
| +————-+ +———–+ rabbitmq +————-+ | troveclient |—–>| trove-api |———>| taskmanager | +————-+ +———–+ +————-+ | +———————————–+ | rabbitmq | | | | trove instance +————————-+ +—————–+ | | datastore/guest |—–>| trove-conductor | | +————————-+ +—————–+ +———————————–+
|
- trove-api
- trove-taskmanager: 管理数据库实例的生命周期和在数据库实例上的操作。
- trove-guestagent: 运行在数据库实例内,监听 RPC,执行请求操作。
- trove-conductor: guestagent 访问数据库的代理。
一个 trove instance 对应一个 vm,trove-guestagent 运行在 vm 内, vm内数据库的数据分区硬盘是 cinder 提供,vm 关联一个 SecurityGroup,允许数据库端口打开。
一段源码:
create_dns_client = import_class(CONF.remote_dns_client) create_guest_client = import_class(CONF.remote_guest_client) create_nova_client = import_class(CONF.remote_nova_client) create_swift_client = import_class(CONF.remote_swift_client) create_cinder_client = import_class(CONF.remote_cinder_client) create_heat_client = import_class(CONF.remote_heat_client) create_neutron_client = import_class(CONF.remote_neutron_client)
调用了其他的组件来完成,trove 专注与数据库的管理。
images
image 包含了操作系统、cloud-init 等,另外:
- sql engine (mysql)
- trove-guestagent
engine 和 trove-guestagent 也可以通过网络动态加载,在 API 中有一个参数是packages 可以指定软件,在 prepare instance 的时候会进行安装。
feature
datastore、database、instance、configuration、backup、replication、cluster 和 数据库中的database、user
datastore
理解为数据库系统,对支持的数据库类型及其版本的管理。mysql、postgresql、mongo、redis、cassandra等, 主要针对 mysql 的 5.5 和 5.6。
database instance
对数据库实例生命周期的管理,以及 instance 和 volume 的动态 resize。
configuration
动态配置更新,针对不同的 datastore有一组预定义的配置,提供给用户来自定义配置,并动态的 attach到数据库实例并生效。
backup
对数据库进行备份。
针对 mysql 提供全量备份和增量备份。
mysql 备份的实现:在 guest 使用 mysql 的备份工具 mysqldump 或innobackupex 进行备份,并通过 swift api 上传到对象存储。
我们 stack 没有使用 openstack swift,测试了 rgw 集成 keystone,使用 rgw的 swift api 来备份,有一个问题:在创建备份的时候,都会为 tenant创建一个名为 database_backups
的 bucket,目前 rgw 的 bucket命名是全局唯一的。
replication
主从结构。
支持 mysql 的主从数据库创建,实现主从同步复制。
cluster
数据库集群。
juno 版支持 mongo 集群。
database、user
API 提供对数据库系统的数据库进行管理,提供对数据库用户的管理。
example
查询 datastore 及其版本
1 2 3 4 5 6 7 8 9 10 11 12 13
| +————————————–|——-+ | ID | Name | +————————————–|——-+ | f30f5a8c-51b2-4c19-9d13-26bb644dca3e | mysql | +————————————–|——-+ # trove datastore-version-list f30f5a8c-51b2-4c19-9d13-26bb644dca3e +————————————–|——+ | ID | Name | +————————————–|——+ | 42bce448-ec76-4c80-bea0-128c4eee3471 | 5.5 | | c0581e9a-6597-4ee9-9f34-08362ab3bcc6 | 5.6 | +————————————–|——+
|
查询 flavor
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| +—-|———–|——-+ | ID | Name | RAM | +—-|———–|——-+ | 1 | m1.tiny | 512 | | 2 | m1.small | 2048 | | 3 | m1.medium | 4096 | | 4 | m1.large | 8192 | | 5 | m1.xlarge | 16384 | | 6 | DS-512M | 512 | | 7 | DS-640M | 640 | | 8 | DS-384M | 384 | | 9 | DS-1024M | 1024 | +—-|———–|——-+
|
创建 database instance
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| +——————-|————————————–+ | Property | Value | +——————-|————————————–+ | created | 2016-12-07T03:00:46 | | datastore | mysql | | datastore_version | 5.5 | | flavor | 6 | | id | 9788b066-a071-4aa8-bfb3-dd592596b3c6 | | name | master_1 | | status | BUILD | | updated | 2016-12-07T03:00:46 | | volume | 1 | +——————-|————————————–+
|
查看已存在的 configuration group, 并 attach 到 instance
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| +————————————–|———-|————-|—————-|————————+ | ID | Name | Description | Datastore Name | Datastore Version Name | +————————————–|———-|————-|—————-|————————+ | bd81ea8e-e94d-4d49-a83b-ec78ffc6f15d | charset | charset | mysql | 5.5 | +————————————–|———-|————-|—————-|————————+ # trove configuration-show bd81ea8e-e94d-4d49-a83b-ec78ffc6f15d +————————|——————————————————————————————————————————————————————–$———————————————————————————————————————————-+ | Property | Value | +————————|——————————————————————————————————————————————————————–$———————————————————————————————————————————-+ | created | 2016-11-25T03:11:28 | | datastore_name | mysql | | datastore_version_name | 5.5 | | description | charset | | id | bd81ea8e-e94d-4d49-a83b-ec78ffc6f15d | | instance_count | 0 | | name | charset | | updated | 2016-11-25T03:11:28 | | values | {”collation_database”: “utf8”, “character_set_connection”: “utf8”, “character_set_client”: “utf8”, “collation_server”: “utf8”, “character_set_database”: “utf8”, “c$llation_connection”: “utf8”, “character_set_results”: “utf8”, “character_set_server”: “utf8”, “character_set_filesystem”: “utf8”} | +————————|——————————————————————————————————————————————————————–$ ———————————————————————————————————————————-+ # trove configuration-attach 9788b066-a071-4aa8-bfb3-dd592596b3c6 bd81ea8e-e94d-4d49-a83b-ec78ffc6f15d
|
创建一个 database 和 database user
1 2
| # trove database-create 9788b066-a071-4aa8-bfb3-dd592596b3c6 mydb # trove user-create 9788b066-a071-4aa8-bfb3-dd592596b3c6 admin admin –host % –databases mydb
|
创建一个 backup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| +————-|————————————————————————————————-+ | Property | Value | +————-|————————————————————————————————-+ | created | 2016-12-07T03:17:22 | | datastore | {u’version’: u’5.5’, u’type’: u’mysql’, u’version_id’: u’42bce448-ec76-4c80-bea0-128c4eee3471’} | | description | None | | id | 538afc35-1112-4d44-bd32-eb1ac39a5f97 | | instance_id | 9788b066-a071-4aa8-bfb3-dd592596b3c6 | | locationRef | None | | name | backup.001 | | parent_id | None | | size | None | | status | NEW | | updated | 2016-12-07T03:17:22 | +————-|————————————————————————————————-+
|
创建一个 replica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| +——————-|————————————–+ | Property | Value | +——————-|————————————–+ | created | 2016-12-07T03:18:50 | | datastore | mysql | | datastore_version | 5.5 | | flavor | 6 | | id | 819b1d3c-638a-4db2-a193-6066c54b1676 | | name | slave_1 | | replica_of | 9788b066-a071-4aa8-bfb3-dd592596b3c6 | | status | BUILD | | updated | 2016-12-07T03:18:50 | | volume | 1 | +——————-|————————————–+
|