RFE: enhancements in cinder-volume service configuration
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
OpenStack Cinder Charm |
In Progress
|
Wishlist
|
Andre Ruiz |
Bug Description
This is a proposal to enhance the cinder charm to include some new features that are needed in a customer installation. All changes are related to the cinder-volume functionality of the charm. The cinder-volume basically implements the CinderLVM driver and uses LVM + iSCSI (tgt) to present "external/
A little more context:
This is a "telco cloud" that has some specific characteristics. One of them is that workloads in this cloud are deployed using an orchestrator and tasks like creating VMs, deleting VMs and upgrading software inside those VMs are automatic and hardcoded, difficult to change (from different vendor).
Of special note is the fact that said orchestrator uses a particular method for upgrading software on the cloud, and that is: it keeps all important data (databases and other data) in secondary disks, keeping on the first disk only the operating system. When it needs to upgrade a machine, it tears down that machine, detaches all external volumes, deletes the VM, provision a new VM with more current image (newer software versions), configure the service inside that VM, re-attaches the external disks on that VM and start all services again.
It's clear that internal nova ephemeral storage is not adequate for this task. Said VMs have frequently 2 to 4 extra disks, which cannot be done with ephemeral storage, and worse, all those disks would not survive the upgrade method used by the orchestrator.
Unfortunately, this cloud was designed by the client to only have local disks on compute nodes (a lot of disks) and no external storage (actually it does include a small amount of ceph but its only used for backups since the performance is not good enough for the databases, so we are ignoring it here). The client had the expectation of having permanent storage on local disks and the software vendor did not steered the client away from the problem (and we came to know that too late).
The simplest solution to this was to make use of CinderLVM (cinder-volume service in cinder charm) to use part of the internal disks with the semantics of external storage. This solved the problem while keeping the performance good enough.
Unfortunately, there are some details of this implementation that are not addressed by the charm at the moment. Those are:
- Thin provisioning vs Thick provisioning
The CinderLVM driver can provision both thin and thick volumes, but the charm only knows how to configure thin volumes. We need to add an option to enable the use of thick volumes (client request).
This is simple enough to implement, it's just a value = true/false in the volume definition section in the config file, and can be added to the template and controlled by an option in the charm.
- Multiple named backends
The charm today only accepts one device for provisioning. The client needs more than one device per host. For example, he has one NVMe and one RAID5 array (bcached by a second NVMe) on each compute host and would like to be able to address them separately, respectively named "fast" and "slow", for example.
Having more than one backend is just a matter of having more than one section in the config file, but the charm currently only provision one. It needs to be changed to accept a list of devices (actually a dictionary with list-of-devices: name). List-of-devices are one or more PVs that are going to be added to a VG, and name is the name of that specific device when addressed in the cinderlvm driver.
Note that there are two enhancements here: one is allowing more than one device to be added to the same VG, and second is allowing more than one VG giving them specific names (like "lvm-fast" instead of the default "lvm").
- Individually addressable hosts
Because of performance reasons, the client wants to keep volumes in the same host the VM is. Benchmarks and tests have been made and it has been confirmed that when on the same host performance is much improved. To be able to control that, each cinderlvm backend on each compute node needs to have the compute node name added to it, so that cinder sees lots of different backends instead of a single one that spans many hosts. This has been tested and proved to work well.
This is also a very easy change, it's just a matter of including the compute node name in the backend name. This can be changed in the template and controlled by a charm option. When enabled, it would make the backend name change from "lvm-fast" to "lvm-compute3-fast" for example.
- Control erase of old volumes
Add option to control erasing of volumes. Default is to erase complete volume when deleting, which can take a lot of time. An option should be added to control that.
---
Note: this is a very application-
With the last two features working together (Multiple named backends and Individually addressable hosts) we can have a scenario like this (this is a true example from the client today):
15 compute nodes
- #1 NVMe
- #2 NVMe
- #3 RAID10 Array
- #4 RAID10 array
- #5 RAID10 array
Configured as follows:
- #1 is mounted for nova local ephemeral storage
- #2 is fast storage for CinderLVM
- #3 is slow storage for CinderLVM
- #4 is slow storage for CinderLVM
- #5 is slow storage for CinderLVM
Expected config in the charm (cinder-volume) is:
- #2 appears as "lvm-<computena
- #3 + #4 + #5 appears as "lvm-<computena
This is an example of a config from a cinder.conf in a compute node:
=======
enabled_backends = LVM-compute5-
[LVM-compute5-slow]
volumes_dir = /var/lib/
volume_
volume_group = cinder-volumes-slow
volume_driver = cinder.
volume_backend_name = LVM-compute5-slow
lvm_type = default
volume_
[LVM-compute5-fast]
volumes_dir = /var/lib/
volume_
volume_group = cinder-volumes-fast
volume_driver = cinder.
volume_backend_name = LVM-compute5-fast
lvm_type = default
volume_
=======
After configuring all hosts like that, openstack presents those as different backends in cinder:
ubuntu@infra1:~$ openstack volume service list | grep -i LVM-
| cinder-volume | compute12@
| cinder-volume | compute12@
| cinder-volume | compute7@
| cinder-volume | compute7@
| cinder-volume | compute14@
| cinder-volume | compute14@
| cinder-volume | compute10@
| cinder-volume | compute10@
| cinder-volume | compute3@
| cinder-volume | compute3@
| cinder-volume | compute15@
| cinder-volume | compute15@
| cinder-volume | compute13@
| cinder-volume | compute13@
| cinder-volume | compute6@
| cinder-volume | compute6@
| cinder-volume | compute11@
| cinder-volume | compute11@
| cinder-volume | compute4@
| cinder-volume | compute4@
| cinder-volume | compute9@
| cinder-volume | compute9@
| cinder-volume | compute2@
| cinder-volume | compute2@
| cinder-volume | compute8@
| cinder-volume | compute8@
| cinder-volume | compute5@
| cinder-volume | compute5@
| cinder-volume | compute1@
| cinder-volume | compute1@
You can create different "types" to use when creating the volumes:
ubuntu@infra1:~$ openstack volume type list
+------
| ID | Name | Is Public |
+------
| 7a897b36-
| f09660e8-
| 2d5ca8db-
| ccfad51d-
| b720fb1b-
| dd21e676-
| 33ca11ba-
| f2e2f294-
| 4df2a465-
| 12ed6955-
| db074d42-
| 840e169e-
| 2e277532-
| 466c073a-
| ded6d88f-
| 35fe4835-
| c71448d4-
| 983121f0-
| 34d89d60-
| d03f6b4b-
| d71e994c-
| 78aec217-
| 70145942-
| 1206915a-
| 194203a7-
| 10e07b2b-
| 9083017d-
| efec0c91-
| 14986062-
| 218c7e82-
| 18cdbdd6-
+------
Each of these types have a backend filter that allows you to ask for a specific backend on a specific host:
ubuntu@infra1:~$ openstack volume type show lvm-compute15-slow
+------
| Field | Value |
+------
| access_project_ids | None |
| description | None |
| id | 7a897b36-
| is_public | True |
| name | lvm-compute15-slow |
| properties | volume_
| qos_specs_id | None |
+------
All of this works well and have been in testing for the last 6 months without problems. The only thing missing now is to incorporate changes to the charm so that no manual change is necessary after deploying a new cloud.
This bug was open as a way to keep track of this enhancements.
Changed in charm-cinder: | |
importance: | Undecided → Wishlist |
Changed in charm-cinder: | |
assignee: | nobody → Andre Ruiz (andre-ruiz) |
summary: |
- Feature Request: enhancements in cinder-volume service configuration + RFE: enhancements in cinder-volume service configuration |
tags: | added: rfe |
description: | updated |
Marking as field-high to better reflect the importance of this bug since this functionality is needed by a customer. The code will however be provided by Andre Ruiz