Add Share Affinity/Anti-Affinity Scheduler Filters

Change-Id: I66f4dbdc7b6f9d18b8bb4b6fffdea4f5b0849395
This commit is contained in:
Maurice Escher 2021-02-11 16:59:37 +01:00 committed by Dmitry Galkin
parent b7901e4ea5
commit 816a17b924
1 changed files with 248 additions and 0 deletions

View File

@ -0,0 +1,248 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
===========================================
Affinity and anti-affinity scheduler filter
===========================================
https://blueprints.launchpad.net/manila/+spec/affinity-antiaffinity-filter
Copy of cinder feature
https://blueprints.launchpad.net/cinder/+spec/affinity-antiaffinity-filter
To add scheduler filter to manila that allows scheduler to make placement
decision based on affinity relationship between existing shares and new
share (the one being scheduled). The affinity relationship here means
the location of shares ('host' of share).
Problem description
===================
Manila has done a good job hiding the details of storage back ends from end
users by using share types. However there are use cases where users who
build their application on top of shares would like to be able to 'choose'
where a share be created on. How can manila provide such capability without
hurting the simplicity we have been keeping? Affinity/anti-affinity is one
of the flexibility we can provide without exposing back end details.
The term affinity/anti-affinity here is to describe the relationship
between two sets of shares in terms of location. To limit the scope, we
describe one share has affinity with the other one only when they reside in
the same share back end; on the contrary, 'anti-affinity'
relation between two sets of shares simply implies they are on different
manila back ends (hosts).
This affinity/anti-affinity filter filters manila back end based on hint
specified by end user. The hint expresses the affinity or anti-affinity
relation between new shares and existing share(s). This allows end
users to provide hints like 'please put this share to a place that is
different from where share-XYZ resides in'.
Use Cases
=========
DB team builds MySQL master onto one share, they'd prefer to put new
shares for slave DBs to different back ends from where the master DB
resides in, for the sake of high availability.
Proposed change
===============
Add two new filters to Manila - AffinityFilter and AntiAffinityFilter. These
two filters will look at the scheduler hint provided by end users and filter
back ends by checking the 'host' of old and new shares see if a back end meets
the requirement (being on the same back end as existing share or not being on
the same back end(s) as existing share(s)). Shares in different pools located
on the same host are still considered as based on the same host.
The scheduler_hints (same_host, different_host) have to be saved as a share
metadata as soon as new Share record is created in the database. The shares
referenced in those hints will receive the metadata update too, for instance:
1) There are three shares exist with: UUID1, UUID2, UUID3.
2) User provisions a new share with UUID4 and requests it with a hint to have
different_host than UUID1, UUID2 and UUID3 shares.
3) Share UUID4 gets this hint stored with all other three shares UUIDs.
4) The metadata of each of three shares is also updated to reflect that they
have anti-affinity to a new share with UUID4.
The respective share metadata is also automatically updated on share deletion
in the similar fashion.
This extra metadata should be marked as only "admin_modifiable" to prevent
non-admin users from accidential deletion or modification of the values.
Hint infomation is needed to allow user to understand how were the shares
scheduled and also to be able to respect the hints in case share is migrated
during its lifetime.
Alternatives
------------
There had been one proposal to allow admin user to directly specify the
back end for new shares. It doesn't really provide similar functionality as
affinity filter because it was admin only and it itself has a few drawbacks
(security concern, for example).
Affinity is also possible with share groups. However, there are some
limitations of share groups to the use case proposed:
1) Affinity/Anti-affinity is only required at the time of provisioning the
resource, and not at any other point during its lifetime. Shares created
within share groups today are tied to the share group throughout their
lifetime.
2) Current feature limitations with share groups include the inability to
migrate or replicate shares within a share group.
3) While achieving affinity is possible with share groups,anti-affinity
is not.
There is an option to have a soft OR semantics for both filters instead of
hard AND. That means, the share creation should succeed if at least 1
condition has been met. The drawback is that there won't be a clear way
to present this information to the user since the share creation is async.
(When a user "fires and forgets" a creation request with hints where not
all conditions are met).
Alternative to storing scheduler_hints in share metadata can be extension
of Share DB model for saving the hints there. This approach causes more
modifications.
Data model impact
-----------------
None. The hints will be saved as additional share metadata.
REST API impact
---------------
Parameter 'scheduler_hints' added to share create, for example::
`{
"share": {
"scheduler_hints": {
"different_host": [
"share_uuid_1",
"share_uuid_2"
],
"same_host": ["share_uuid_3"]
}
}
}`
In this particular example, the share should be scheduled to the same host
where 'share_uuid_3' is located, yet only if both 'share_uuid_1' and
'share_uuid_2' are not located on that host.
All uuid-s given will be validated if exist and share creation
will fail if at least one share is not existing or uuid malformed.
The semantics for both filters is hard AND, meaning that the share won't
get created, unless all placement conditions are satisfied.
If the desired scheduling combination is not possible (e.g. affinity
with two shares located on two different hosts) - the share creation
should fail. The same applies for anti-affinity filter - if there are
only two hosts and each has a share with a uuid that was given in the
'different_host' hint for a new, third share - creation will fail.
The scheduler hints should also be respected if a share is migrated
between hosts, however there should be an option to override the hints
manually and force migration even if affinity/anti-affinity conditions
won't be met after the migration (e.g add 'force: true' option).
Microversion of the API is incremented.
Security impact
---------------
Although this change involves using or parsing user-provided - scheduler hints.
This doesn't put Manila in any more danger as it is now.
Notifications impact
--------------------
None
Other end user impact
---------------------
None
Performance Impact
------------------
New filters would query DB once per request, it only adds slightly latency
to the system and the latency has nothing to do with the size of the system.
The share metadata update might take extra time, especially when many shares
are specified in the hints. Yet share creation or deletion is an async process
and this impact should not be noticeable by the end user.
Other deployer impact
---------------------
None
Developer impact
----------------
None
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Dmitry Galkin (galkindmitrii in Gerrit)
Kiran Pawar (kpdev in Gerrit)
Work Items
----------
1. Filter implementation
2. Add scheduler hints parameter
3. Add hints argument for python-manilaclient
4. Add hints support in manila-ui
Dependencies
============
None
Testing
=======
Test against AffinityFilter (Same host):
* Create one share A;
* Create another share B with uuid of A and 'same_host' as hint;
* Checks if B is created on same back end as A;
Test against AntiAffinityFilter (Different host):
* Create one share A;
* Create another share C with uuid of A and 'different_host' as hint;
* Checks if C is created on different back end as A;
Documentation Impact
====================
Need to document the usage of new filters.
References
==========
Nova has been offering similar feature called SameHostFilter and
DifferentHostFilter since *Diablo*.
https://github.com/openstack/nova/blob/master/nova/scheduler/filters/affinity_filter.py
Cinder has been offering similar feature called AffinityFilter and
AntiAffinityFilter since *Juno*.
https://specs.openstack.org/openstack/cinder-specs/specs/juno/affinity-antiaffinity-filter.html