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 }}