Trove 快照用于支持DbaaS 备份,复制等功能。在Trove API (guest_agent)上将支持本功能。本功能将可以支持快照,从而用来进行副本设置,主数据库克隆和备份,以及数据恢复。
目前有许多备份的设计,诸如带有master-data选项的mysqldump,Perconas' XtraBackup,Openstack的卷快照等。 每一种设计都有各自的优势和缺点。本设计提供了一种插件式的接口。随着功能的开发,他们可以互相协做而无需改动代码。
设计的目标插件式的接口该接口可以下降快照实现层复杂度,从而可以支持多快照机制,诸如 Xtrabackup, mysqldump, Openstack的卷支持等。该接口容许多种快照的实现,从而可以定义不一样层次的服务。例如: Xtrabackup 的高可用性 mysqldump 的更底层的服务 对备份信息的数据库支持例如名字,时间的备份,当前快照的状态信息,租户信息等。 使用ACL机制使用ACL机制来支持备份的安全性和备份路径。
快照的存储产生的备份将被上传到Swift 中去。Trove将向 Swift 提供一个鉴权令牌。 快照将以用户的swift帐号的身份保存在一个容器(container)中。当建立一份快照时,必须具备必定的Swift角色。
ACL 设计ACL使用Openstack存储的ACL。 ACL容许咱们对单个对象和容器(container)有更高的控制而不须要对容器(container)有所有的读写权限。在容器的底层权限被授予,在角色层被获取。 当用户使用他们所在的角色建立一个容器时,经过增长其余角色到这个容器上,其余用户可以被授予该权限。在咱们的设计中,使用了如下的继承模型。下图中,每一个租户将有一个 BackupManager 的角色 ,许多用户从属于该BackupManager角色。为了从虚拟机的数据库中恢复数据,每一个用户有在swift中创建快照以及访问他们的的能力。在使用前,这些用户必须被具备管理员权限的用户预先授予BackupManager角色. 经过这种方式咱们可以保证安全和租户之间的隔离。请注意: 用户在尝试备份和恢复数据前,必须授予BackupManager role一旦被授予BackupManager角色,一个用户可以使用他们本身的凭证建立本身的备份和恢复先前备份的数据。并且,这些凭证可以操做的备份列表只可以被这个用户从属的一个租户获取。
插件式接口为了支持各类不一样的快照机制,一个插件式接口貌似是最合理的方法.在 ~/reddwarf/reddwarf/guestagent/plugins 目录下一个目录被建立,该目录将包含各式各样的快照实现(例如:xtrabackup, mysqldump, 卷快照等)
数据库 设计为了支持快照功能,在Trove 数据库中将建立一张数据库表,该表包含了如下信息:
TENANT_ID决定谁可以从Swift访问哪一个快照,TENANT_ID, ROLE_ID, USER, 和 PASSWORD 将是一个基本的决定你是否可以从Swift访问一个容器的因数。
Name快照的名字,具备惟一性。
Size of the snapshot快照的整个大小,包含目录以及下面的文件。
Timestamp of the snapshot快照的时间戳,反映了快照与哪一个时间点上的数据库吻合。
State of the snapshot快照的状态,在整个快照的流程中,该值被代理所更新以便反映快照的实时状态,可能的状态包括: Started API 和 代理接受到请求消息,开始流程 Running 代理在执行快照的流程中 Completed 快照流程已经结束, 容器已经在Swift中 Failed 一个错误已经发生,失败。
下图的数据库记录的例子DROP TABLE IF EXISTS snapshot;CREATE TABLE backups ( id int(10)unsigned NOT NULL auto_increment, name varchar(128) NOT NULL DEFAULT '', location varchar(1024) NOT NULL DEFAULT '', tenant_id varchar(36) NOT NULL DEFAULT '00000000-0000-0000-000000000000', bkup_type varchar(32) NOT NULL DEFAULT '', size float unsigned not null DEFAULT 0.0, deleted tinyint(1) NOT NULL DEFAULT 0, created_ts timestamp NOT NULL DEFAULT "0000-00-00 00:00:00", deleted_ts timestamp NOT NULL DEFAULT "0000-00-00 00:00:00", state varchar(32) NOT NULL DEFAULT 'started', last_updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY (name, tenant_id), KEY idx_location(location), KEY idx_bkup_type(bkup_type)) ENGINE=ENGINE_INNODB DEFAULT CHARSET=utf8;
Xtrabackup 的状态图使用Xtrabackup的备份请求图:mysql
使用Xtrabackup的恢复请求图:sql
备份列表图:数据库
API 规范Create Backup做为一个Trove用户,须要有能力建立存储于Swift帐号的数据库实例的备份。有了该能力,就可以获取数据库实例的全部SQL数据备份POST /backups 建立一个新的实例备份。 参数name –可选 -instanceid – 实例IDdescription – 可选 –备份的描述 请求消息体结构:swift
{ "backup" : { "name":"My Backup" "instanceid":"4c6ad8e3-d857-46e2-aca4-dcbbfdab8526" "description" : "Backups for my production database." }} api
应答消息结构:安全
{ "backup": { "id" : "56b80958-cf34-4e9e-b5b0-b84fbe5e4ecc" "name" : "My Snapshot", "locationRef" : "https:/<service>/<api version>/<account>/<container>/<snapshot>", "status" : "STARTED" }} ui
List All Backups做为一个Trove用户,须要有能力查询全部针对全部实例的可用的备份列表,以便咱们可以很轻易的定位我之前存储的全部实例的数据。 插件
GET /backups List all backups for a given tenant id. 应答消息结构:设计
{ "backups": [ { "id" : "56b80958-cf34-4e9e-b5b0-b84fbe5e4ecc" "name" : "My Backup", "description" : "Backups for my production database." "locationRef" : "https:/<service>/<api version>/<account>/<container>/<backup>", "instanceRef" : "https://service/v1.0/1234/instances/28d1b8f3-172a-4f6d-983d-36021508444a" "created" : "2012-03-28T21:31:02Z"", "updated" : "2012-03-28T21:34:25Z", "status" : "COMPLETED", }, { "id" : "56b80958-cf34-4e9e-b5b0-b84fbe5e4eea" "name" : "My other backup", "description" : "Backups for my production database." "locationRef" : "https:/<service>/<api version>/<account>/<container>/<backup>", "instanceRef" : "https://service/v1.0/1234/instances/28d1b8f3-172a-4f6d-983d-36021508444a" "created" : "2012-03-28T21:31:02Z"", "updated" : "2012-03-28T21:34:25Z", "deleted" : "2012-03-28T21:34:25Z", "status" : "DELETED", }, { "id" : "45x453467-df99-4j5k-a4a5-v873455e4wwt" "name" : "My other backup", "description" : "Backups for my production database." "locationRef" : "https:/<service>/<api version>/<account>/<container>/<backup>", "instanceRef" : "https://service/v1.0/1234/instances/28d1b8f3-172a-4f6d-983d-36021508444a" "created" : "2012-03-28T21:31:02Z"", "updated" : "2012-03-28T21:34:25Z", "status" : "FAILED", } ]}3d
List Backups for a Specified Instance做为一个Trove用户,须要有能力查询一个针对单个实例的可用的备份列表,以便咱们可以很轻易的定位我之前存储的特定实例的数据。 GET /instance/instanceId/backups Return the list of backups for the instance 应答消息结构同获取全部的列表的应答消息结构 Delete Backup做为一个Trove用户,须要有能力删除一个或者多个备份列表,以便咱们可以很轻易的从Swift帐号删除咱们再也不须要的数据以节省时间很资金。DELETE /backups/{uid} Delete specified backup Create Instance from Backup做为一个Trove用户,须要有能力从一个快照中建立一个新的Trove实例,以便咱们可以很快的从已经存在的数据库实例中建立一个新的拷贝。POST /instances Creates a new database instance. New AttributessnapshotRef -Response Codes: same as current callError Codes: same as current callDescription:
请求消息结构:
{ "instance": { "flavorRef": "https://service//v1.0/1234/flavors/1", "name": "my_db_inst", "volume": { "size": 2 } "restorePoint" : { "backupRef": "https://service/v1.0/1234/snapshots/56b80958-cf34-4e9e-b5b0-b84fbe5e4ecc" | '56b80958-cf34-4e9e-b5b0-b84fbe5e4ecc' }} 应答消息结构:{ "instance": { "created": "2012-01-25T21:53:09Z", "flavor": { "id": "1", "links": [ ... ] }, "hostname": "192.168.1.1", "id": "dea5a2f7-3ec7-4496-adab-0abb5a42d635", "links": [ ... ], "name": "my_db_inst", "status": "BUILD", "updated": "2012-01-25T21:53:10Z", "volume": { "size": 2 }}