Consistency Groups¶
https://blueprints.launchpad.net/cinder/+spec/consistency-groups
Today in Cinder, every operation happens at the volume level. Consistency Groups (CGs) are needed for Data Protection (snapshots and backups) and Disaster Recovery (remote replication). This blueprint will be introducing Consistency Groups and discussing how it can be applied to snapshots.
Remote replication is covered in a different blueprint and will not be discussed here. https://blueprints.launchpad.net/cinder/+spec/volume-replication
Problem description¶
Consistency Group support will be added for snapshots in phase 1 (Juno).
Future:
After the Consistency Group is introduced and implemented for snapshots, it may be applied to backups. That will be after phase 1.
Modify Consistency Group (adding existing volumes to CG and removing volumes from CG after it is created) will be supported after phase 1.
Assumptions:
Cinder provides APIs that can be consumed by an orchestration layer.
The orchestration layer has knowledge of what volumes should be grouped together.
Volumes in a CG belong to the same backend.
Volumes in a CG can have different volume types.
3 levels of quiesce:
Application level: Not in Cinder’s control
Filesystem level: Cinder can call newly proposed Nova admin quiesce API which uses QEMU guest agent to freeze the guest filesystem before taking a snapshot of CG and thaw afterwards. However, this freeze feature in QEMU guest agent was just added to libvirt recently, so we can’t rely on it yet.
Storage level: Arrays can freeze IO before taking a snapshot of CG. We can only rely on the storage level quiesce in phase 1 because the freeze feature mentioned above is not ready yet.
Use Cases¶
Proposed change¶
Consistency Groups work flow
Create a CG, specifying volume types that can be supported by this CG.
Scheduler will figure out which backend can handle these volume types. The backend (host) will be saved in the CG table in the db.
Create a volume and specify the CG.
This step will be repeated until all volumes are created for the CG.
Create a snapshot of the CG.
Cinder API creates cgsnapshot and individual snapshot entries in the db and sends request to Cinder volume node.
Cinder manager calls novaclient which calls a new Nova admin API “quiesce” that uses QEMU guest agent to freeze the guest filesystem. Can leverage this work: https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent (Note: This step will be on hold for now because the freeze feature is not reliable yet.)
Cinder manager calls Cinder driver.
Cinder driver communicates with backend array to create a point-in-time consistency snapshot of the CG.
Cinder manager calls novaclient which calls a new Nova admin API “unquiesce” that uses QEMU guest agent to thaw the guest filesystem. (Note: This step will be on hold for now.)
Alternatives¶
One alternative is to not implement CG in Cinder, but rather implementing it at the orchestration layer. However, in that case, Cinder wouldn’t know which volumes are belonging to a CG. As a result, user can delete a volume belonging to the CG using Cinder CLI or Horizon without knowing the consequences.
Another alternative is not to implement CG at all. User will be able to operate at individual volume level, but can’t provide crash consistent data protection of multiple volumes in the same application.
Data model impact¶
DB Schema Changes
A new consistencygroups table will be created.
A new cgsnapshots table will be created.
Volume entries in volumes tables will have a foreign key of the consistencygroup uuid that they belong to.
cgsnapshot entries in cgsnapshots table will have a foreign key of the consistencygroup uuid.
snapshot entries in snapshots table will have a foreign key of the cgsnapshot uuid.
mysql> desc cgsnapshots;
+---------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
| deleted | tinyint(1) | YES | | NULL | |
| id | varchar(36) | NO | PRI | NULL | |
| consistencygroup_id | varchar(36) | YES | | NULL | |
| user_id | varchar(255) | YES | | NULL | |
| project_id | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| status | varchar(255) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+-------+
11 rows in set (0.00 sec)
mysql> desc consistencygroups;
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
| deleted | tinyint(1) | YES | | NULL | |
| id | varchar(36) | NO | PRI | NULL | |
| user_id | varchar(255) | YES | | NULL | |
| project_id | varchar(255) | YES | | NULL | |
| host | varchar(255) | YES | | NULL | |
| availability_zone | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| status | varchar(255) | YES | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
12 rows in set (0.00 sec)
Alternatives:
Instead of adding a cgsnapshots table, add a label to the snapshots. This label will be the cgsnapshot name. That means we need to make sure the name is provided when creating a snapshot of the CG and it must be unique.
REST API impact¶
Consistency Groups
Add V2 API extensions consistencygroups
Create consistency group API
Create a consistency group.
Method type: POST
Normal Response Code: 202
Expected error http response code(s): TBD * 404: type group not found
V2/<tenant id>/consistencygroups
JSON schema definition for V2:
{ "consistencygroup": { "name": "my_cg", "description": "My consistency group", "volume_types": [type1, type2, ...], "availability_zone": "zone1:host1" } }
Delete consistency group API
Delete a consistency group.
Method type: DELETE
Normal Response Code: 202
Expected error http response code(s): * 404: consistency group not found * 403: consistency group in use
V2/<tenant id>/consistencygroups/<cg uuid>
This API has no body.
List consistency group API
This API lists summary information for all consistency groups.
Method type: GET
Normal Response Code: 200
Expected error http response code(s): TBD
V2/<tenant id>/consistencygroups
This API has no body.
List consistency groups (detailed) API
This API lists detailed information for all consistency groups.
Method type: GET
Normal Response Code: 200
Expected error http response code(s): TBD
V2/<tenant id>/consistencygroups/detail
This API has no body.
Show consistency group API
This API shows information about a specified consistency group.
Method type: GET
Normal Response Code: 200
Expected error http response code(s) * 404: consistency group not found
V2/<tenant id>/consistencygroups/<cg uuid>
This API has no body.
Modify consistency group API (adding existing volumes to or removing volumes from the CG) will be addressed after phase 1.
Create volume API will have “consistencygroup_id” added:
{ "volume": { ........ ........ "consistencygroup_id": "consistency group uuid", ........ ........ } }
Snapshots
Add V2 API extensions for snapshots of consistency group
Create snapshot API
Create a consistency group.
Method type: POST
Normal Response Code: 202
Expected error http response code(s): TBD * 404: snapshot not found
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots
JSON schema definition for V2:
{ "snapshot": { "name": "my_cg_snapshot" "description": "Snapshot of my consistency group" } }
Delete snapshot API
Delete a snapshot of a consistency group.
Method type: DELETE
Normal Response Code: 202
Expected error http response code(s) * 404: snapshot not found
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/<snapshot id>
JSON schema definition for V2: None
Should not be able to delete individual volume snapshot if part of a consistency group.
List snapshots API
This API lists summary information for all snapshots of a consistency group.
Method type: GET
Normal Response Code: 200
Expected error http response code(s): TBD
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots
This API has no body.
List consistency groups (detailed) API
This API lists detailed information for all snapshots of a consistency group.
Method type: GET
Normal Response Code: 200
Expected error http response code(s): TBD
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/detail
This API has no body.
Show snapshot API
This API shows information about a specified snapshot of a consistency group.
Method type: GET
Normal Response Code: 200
Expected error http response code(s) * 404: snapshot of the consistency group not found
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/<snapshot id>
This API has no body.
Driver API additions
def create_consistencygroup(self, context, consistencygroup, volumes)
def delete_consistencygroup(self, context, consistencygroup)
def create_cgsnapshot(self, context, cgsnapshot)
def delete_cgsnapshot(self, context, cgsnapshot)
Security impact¶
None
Notifications impact¶
Add event notifications.
Other end user impact¶
Add a quota for maximum number of CGs per tenant.
python-cinderclient needs to be changed to support CG. The following CLI will be added.
- To list all consistency groups:
cinder consistencygroup-list
- To create a consistency group:
cinder consistencygroup-create –name <name> –description <description> –volume_type <type1,type2,…>
- Example:
cinder consistencygroup-create –name mycg –description “My CG” –volume_type lvm-1,lvm-2
- To create a new volume and add it to the consistency group:
cinder create –volume_type <type> –consistencygroup <cg uuid or name> <size>
- To delete one or more consistency groups:
cinder consistencygroup-delete <cg uuid or name> [<cg uuid or name> …]
cinder consistencygroup-show <cg uuid or name>
python-cinderclient needs to be changed to support snapshots.
- To list snapshots of a consistency group:
cinder consistencygroup-snapshot-list <cg uuid or name>
- To create a snapshot of a consistency group:
cinder consistencygroup-snapshot-create <cg uuid or name>
- To show a snapshot of a consistency group:
cinder consistencygroup-snapshot-show <cgsnapshot uuid or name>
- To delete one or more snapshots:
cinder consistencygroup-snapshot-delete <cgsnapshot uuid or name> [<cgsnapshot uuid or name> …]
Performance Impact¶
None
Other deployer impact¶
None
Developer impact¶
This will add CG support to Cinder. Other drivers can implement the proposed driver APIs to support this feature. This is not required.
Implementation¶
Assignee(s)¶
- Primary assignee:
xing-yang (xing.yang@emc.com)
- Other contributors:
None
Work Items¶
Add Cinder APIs.
Make db schema changes.
Driver API changes.
Implement driver changes for LVM.
Tempest tests.
Dependencies¶
None
Testing¶
In order to test this feature, tests need to be added to Tempest to support all new APIs.
Documentation Impact¶
Need to document the new APIs.
References¶
Juno design session:
https://etherpad.openstack.org/p/juno-cinder-cinder-consistency-groups