目录

  1. 概述
  2. 基本服务
    1. trove-api
    2. trove-taskmanager
    3. trove-conductor
    4. trove guestagent
  3. Strategy
  4. Extension
  5. 基本操作
    1. 展示实例列表
    2. 启动实例
    3. 重启实例
    4. 删除实例
    5. 创建用户和数据库
      1. 启用数据库的root用户
      2. 数据库操作
      3. 用户操作
    6. 其他
      1. 查看实例详细信息
      2. 查看flavor
      3. 查看flavor详细
      4. 查看datastore
      5. 查看datastore详细
      6. 查看datastore版本
      7. 帮助
  6. 高级操作
    1. 自定义flavor
      1. 查看可用flavor
      2. 查看nova的flavor
      3. 创建flavor
    2. 备份
      1. 新建备份
      2. 新建增量备份
      3. 恢复备份
      4. 删除备份
      5. 查看备份
      6. 找到指定实例的所有备份
    3. 主从
      1. 创建从节点
      2. 故障切换
        1. 有序故障切换
        2. 主节点失败的故障切换

概述

Trove和其他OpenStack服务类似。它暴露了一个RESTful的公共API并在基础设施数据库中存储了一些持久性数据。

Trove的所有用户端,包括CLI(command-line interface)和Horizon仪表盘,都是通过这个公共API与Trove交互的。基础设施数据库可以与其他OpenStack服务共享,也可以是一个专用的数据库。
通常这个数据库是Mysql(或某些变体),但理论上可以是SQLAlchemy所支持的任何数据库。Mysql是最常用的后端基础设施数据库。

Trove是OpenStack的其他服务如Nova(计算)、Cinder(块存储)、Swift(对象存储)、Keystone(身份管理)等的用户端。Trove和这些服务交互时,会通过各自的公共API请求进行交互。

Trove 由三个服务组成:trove-api、trove-conductor 和 trove-taskmanager。此外,每个Trove实例都有一个安装了特定的数据库类型的guestagent。

上图左边是Trove,由暴露着公共API的trove-api、trove-taskmanager和trove-conductor组成。Trove服务在基础设施数据库上存储持久化型数据。
上图中右上部分是OpenStack基本服务的安装和这些服务的基础架构的数据库。右下部分是计算基础设施,包括服务器和存储器,向Nova、Cinder、Swift和Neutron请求计算、存储和网络资源。

当Nova创建了一个计算实例时,它在计算基础设施上完成这个操作。一个Trove实例是一个特殊的Nova实例,包含一个guest数据库和trove-guestagent服务。
Trove-guestagent在安装了Trove服务的guest实例上执行操作,并利用消息队列和Trove服务进行通信。

基本服务

trove-api

trove-api实现了一个WSGI(web服务器网关接口),并与同Trove交互的所有用户端交互。当trove-api接收到一个请求时,它使用配置的身份验证机制(默认为Keystone服务)验证请求者,验证其身份过后,验证凭据将被附加在该请求上。这些将成为请求者的上下文并在整个进程中被使用。一些简单的请求完全由trove-api进行处理,对于其他请求则可能需要其他的服务的参与。

trove-api在Trove控制节点运行。

trove-taskmanager

trove-taskmanager执行Trove的大部分复杂操作。
它作为一个RPC服务器监听特定topic的消息队列。请求者发送消息到trove-taskmanager,trove-taskmanager在请求者的上下文中调用相应的程序去执行这些请求。trove-taskmanager处理的一些操作:实例的创建、删除;与其他服务如Nova、Cinder、Swift等的交互;一些更复杂的Trove操作如复制和集群;对实例的整个生命周期的管理。

配置文件trove-taskmanager.conf的taskmanager_manager条目中定义了trove-taskmanager的入口。

1
2
root@controller-1: grep taskmanager_manager /etc/trove/trove-taskmanager.conf
taskmanager_manager=trove.taskmanager.manager.Manager

trove-taskmanager在Trove控制节点运行。

trove-conductor

trove-conductor主要用来接收和处理来自trove-guestagent的各种类型的状态更新,在某些情况下是更新Trove基础设施数据库或提供信息给其他服务。
trove-conductor作为一个RPC服务器监听特定topic的消息队列。trove-guestagent发送消息给conductor,conductor通过调用相应的程序执行这些请求。Conductor处理trove-guestagent心跳和备份状态等信息。

配置文件trove-conductor.conf中的conductor_manager条目定义了trove-conductor的入口。

Trove conductor在Trove控制节点上运行。

trove guestagent

Trove旨在提供一个一个与数据库无关的功能集合和一个可以实现和扩展的框架。
Trove建立的框架依赖于一个guestagent,并提供特定的数据库功能,这些都是通过代码在guest实例上实现的,当有请求时通过taskmanager调用。trove-guestagent的主要目的是作为一个RPC服务器使其他Trove服务可以在guest实例上执行操作。它监听特定topic的消息队列,并在本地执行代码来完成数据库的任务。trove-taskmanager将消息发送到guestagent,guestagent通过调用相应的程序执行这些请求。

guestagent在guest实例上处理所有的请求如prepare()(guest的初始设置过程中调用)、restart()等控制操作。它也处理创建和管理用户、数据库,以及启动备份等操作。

Trove Guest Agent的入口是由在Task Manager创建实例时的过程中设置的datastore_manager配置参数定义的。
每一种数据库都有与之对应的不同的Guest Agent。trove.guestagent.dbaas中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
defaults = {
'mysql':
'trove.guestagent.datastore.mysql.manager.Manager',
'percona':
'trove.guestagent.datastore.experimental.percona.manager.Manager',
'pxc':
'trove.guestagent.datastore.experimental.pxc.manager.Manager',
'redis':
'trove.guestagent.datastore.experimental.redis.manager.Manager',
'cassandra':
'trove.guestagent.datastore.experimental.cassandra.manager.Manager',
'couchbase':
'trove.guestagent.datastore.experimental.couchbase.manager.Manager',
'mongodb':
'trove.guestagent.datastore.experimental.mongodb.manager.Manager',
'postgresql':
'trove.guestagent.datastore.experimental.postgresql.manager.Manager',
'couchdb':
'trove.guestagent.datastore.experimental.couchdb.manager.Manager',
'vertica':
'trove.guestagent.datastore.experimental.vertica.manager.Manager',
'db2':
'trove.guestagent.datastore.experimental.db2.manager.Manager',
'mariadb':
'trove.guestagent.datastore.experimental.mariadb.manager.Manager'
}

Trove guest agent在Trove guest节点上运行。

Strategy

策略是Trove内部的设计结构,允许开发人员通过将Trove总体框架的部分抽离出来,进行新的实现来扩展Trove。

从广义上来说,所有的数据库都提供了某种机制来备份它们的存储数据。Mysql、Postgresql及其他关系数据库都支持备份,MongoDB、Cassandra、Couchbase及许多其他NoSQL数据库也支持备份。然而,它们实际上有各自的生成备份的方法,并且在某些情况下,一个数据库可以有多种生成备份的方法。

用户端通过trove-api发送一个请求给Trove,然后trove-api再将消息发送到trove-taskmanager,taskmanager接下来发送消息到guestagent。

在某些情况下仅存一个对于给定的动作的实现,但在其他情况下可能有多种选择的实现方式。策略机制允许开发者扩展Trove并添加新的实现。

目前有用于备份、复制、存储和集群的策略。策略被定义为配置选项。

例如,目前Mysql的备份策略有三种实现:MySQLDump、InnoBackupEx和InnoBackupExIncremental。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cfg.StrOpt('backup_strategy',
default='InnoBackupEx',
help='Default strategy to perform backups.',
deprecated_name='backup_strategy',
deprecated_group='DEFAULT')

cfg.StrOpt('backup_namespace',
default='trove.guestagent.strategies.backup.mysql_impl',
help='Namespace to load backup strategies from.',
deprecated_name='backup_namespace',
deprecated_group='DEFAULT')

cfg.DictOpt('backup_incremental_strategy',
default={'InnoBackupEx': 'InnoBackupExIncremental'},
help ='Incremental Backup Runner based on the default '
'strategy. For strategies that do not implement an '
'incremental backup, the runner will use the default '
'full backup.',
deprecated_name='backup_incremental_strategy',
deprecated_group='DEFAULT')

上面的配置选项(trove/common/cfg.py)定义备份策略并为Mysql数据库使用InnoBackupEx提供命名空间,InnoBackupEx位于trove.guestagent.strategies.backup.mysql_impl中。

1
2
3
class InnoBackupEx(base.BackupRunner):
"""Implementation of Backup Strategy for InnoBackupEx."""
__strategy_name__ = 'innobackupex'

配置选项backup_strategy定义了类的名称,backup_namespace定义了类实现的对象。如果没有实现备份策略,则它将被初始化为None。

1
2
3
4
5
cfg.StrOpt('backup_strategy', default=None,
help='Default strategy to perform backups.')

cfg.StrOpt('backup_namespace', default=None,
help='Namespace to load backup strategies from.')

Extension

Trove也支持一些特定数据库的操作(也叫作扩展),涉及root-show、root-enable、database-list、database-create、database-delete、user-create、user-delete、user-grant-access、user-revoke-access及user-show-access等命令。

Trove使用Paste Deploy,及配置文件api-paste.ini,定义了接收到消息及时通过API WSGI服务执行操作的pipeline。

1
2
3
4
5
6
7
8
9
[pipeline:troveapi]
pipeline = cors http_proxy_to_wsgi faultwrapper osprofiler authtoken authorization contextwrapper ratelimit extensions troveapp
#pipeline = debug extensions troveapp

[filter:extensions]
paste.filter_factory = trove.common.extensions:factory

[app:troveapp]
paste.app_factory = trove.common.api:app_factory

这里建立的pipline提供了Trove API服务将调用的处理请求的操作列表。

基本操作

展示实例列表

Trove中最常用的命令就是获取实例列表并打印它们的状态。列出实例的最简单的命令是trove list。

1
trove list

查看json格式时,可以使用–json命令行选项。

当实例数量过多时,可以使用–limit命令行选项。

1
trove list --limit <数字>

启动实例

启动实例的最基本方法是使用trove create命令并传入以下参数。

  • 实例名称(name)
  • 实例的类型id(flavor_id)
  • 持久化卷的大小(size)
  • 数据库类型(datastore)
  • 数据库版本(datastore_version)
1
trove create <name> <flavor_id> --size <数字(G)> --datastore <datastore_id或datastore_name> --datastore_version <datastore_version_id 或datastore_version_name>

重启实例

实例一旦被创建,就可以用trove restart命令重启实例。这个命令只会重启运行在由Trove管理的Nova实例中的数据库服务,不会重启Nova实例。

1
trove restart <实例id>

删除实例

可以使用trove delete命令永久删除一个实例。delete命令是不可逆的,一旦删除了实例,将永远无法访问其上的数据库服务,实例中的所有数据也将消失。

1
trove delete <实例id>

创建用户和数据库

启用数据库的root用户

像Mysql之类的数据库服务都有一个超级用户(root),在默认情况下,Trove的数据库实例是禁止这个用户的。可以利用root用户连接到Mysql数据库服务。

1
mysql -uroot -p<password> -h<ip> -s
  1. 在一个运行中的实例上启用root用户

    1
    trove root-enable <实例id>

    可以使用root-show 查看root用户的状态。

    1
    trove root-show <实例id>
  2. 启用默认root用户
    除了在已经存在的数据库实例上启用root用户,也可以在默认情况下启用root用户(在实例创建时)。需要将trove.conf配置文件的[mysql]配置中的root_on_create设为true。

    1
    2
    [mysql]
    root_on_create = True

    需要重启Trove服务生效。

数据库操作

  1. 列出数据库

    1
    trove database-list <实例id>
  2. 禁止某些数据库的显示
    经常会有一些内置的数据库不需要通过database-list命令显示出来。可以通过设置trove.conf中的ignore_dbs参数禁止这些数据库的显示。

    ignore_dbs的默认值是lost+found、mysql和information_schema。

  3. 在运行的实例上创建数据库

    1
    trove database-create <实例id> <name>
  4. 创建实例时创建数据库
    trove create命令允许在创建实例的同时创建多个数据库。可以指定任意数量的数据库并与用户关联。

    1
    trove create <name> <flavor_id> --size <size> --datastore <datastore> --databases <database1 database2 ...> --users <user1:password1 user2:password2 ...>

用户操作

  1. 在创建实例时创建用户

    1
    trove create <name> <flavor_id> --size <size> --datastore <datastore> --databases <database1 database2 ...> --users <user1:password1 user2:password2 ...>
  2. 列出用户

    1
    trove user-list <实例id>
  3. 在运行的实例上创建用户

    1
    trove user-create <实例id> <username> --databases <database _name>
  4. 删除用户
    删除实例的所有用户

    1
    trove user-delete <实例id>

    删除实例的指定用户

    1
    trove user-delete <实例id> <username>
  5. 管理用户的访问权限

    1. 列出用户的访问权限
      user-show-access 命令显示了允许用户访问的数据库。

      1
      trove user-show-access <实例id> <username>
    2. 在user-list中禁止某些用户
      一些数据库中有些内置用户不能向用户展示,可以在trove.conf配置文件中使用ignore_users参数禁止用户在user-list命令中显示

      1
      2
      3
      [DEFAULT]
      ignore_users = os_admin,root
      ...

      Mysql使用[DEFAULT]配置段

    3. 给予用户访问权限

      1
      trove user-grant-access <实例id> <username>
    4. 撤销用户访问权限

      1
      trove user-revoke-access <实例id> <username>

其他

查看实例详细信息

1
trove show <实例id或name>

查看flavor

1
trove flavor-list

查看flavor详细

1
trove flavor-show <实例id>

查看datastore

1
trove datastore-list

查看datastore详细

1
trove datastore-show <datastore_id>

查看datastore版本

1
trove datastore-version-list <datastore_id>

帮助

1
trove help <命令>

高级操作

自定义flavor

在启动一个Trove实例时,必须要指定一个flavor。flavor是虚拟机的模板,提供了基本的硬件配置信息,例如内存、磁盘空间、虚拟CPU的数量等等。

查看可用flavor

1
trove flavor-list

查看nova的flavor

1
nova flavor-list

nova-flavor-list

创建flavor

1
nova flavor-create <name> <id> <ram> <disk> <vcpus>

备份

新建备份

1
trove backup-create <实例id> <name>

新建增量备份

Trove还支持基于现有备份创建增量备份。

1
trove backup-create <实例id> <name> --parent <已有备份id> --description "<description>"

恢复备份

恢复备份的操作通过启动基于备份的新实例来完成。在Trove中,不能加载备份到现有实例中。

1
trove create <name> <flavor_id> --size <num> --backup <backup_id>

删除备份

1
trove backup-delete <备份的id/name>

查看备份

1
trove backup-list

找到指定实例的所有备份

1
trove backup-list-instance <实例id>

主从

创建从节点

查看主节点信息。

1
trove show <实例id>

创建副本。

1
trove create <name> <flavor_id> --size <num> --replica_of <实例id> --replica_count <count>

replica_count允许同时创建多个副本。默认值是1。

故障切换

在复制环境中,有一个主节点和一个或多个副本。可能用户会从目前可用的副本中选出新的主节点。这个过程称为故障切换。

有序故障切换

使用promote-to-replica-source命令替换当前的主节点。

1
trove promote-to-replica-source <副本实例id/name>

打破主节点和副本之间的复制的另一种方法是将副本从主节点上分离出来,这是一种不可逆的操作,通常用于在一个时间点生成一个数据集的备份,并可以随后用于生成该时间点的新实例。

1
trove detach-replica <副本实例id/name>

主节点失败的故障切换

使用eject-replica-source命令来处理主节点失败的情况。当对一个失败的主节点执行该命令时,会将该主节点抛弃并选举出新的主节点。
该命令有些保护措施。当针对一个不是主节点的实例执行时,该命令会出错。此外针对一个运行正常的主节点执行时,命令也会失败。

1
trove eject-replica-source <失败主节点实例id/name>