亲和性和反亲和性调度器过滤器

https://blueprints.launchpad.net/cinder/+spec/affinity-antiaffinity-filter

为 Cinder 添加调度器过滤器,允许调度器根据现有卷和新卷(正在调度的卷)之间的亲和性关系做出放置决策。这里的亲和性关系指的是卷的位置(卷的‘host’)。

问题描述

Cinder 通过使用卷类型,很好地隐藏了存储后端细节,避免了对最终用户的暴露。然而,存在一些用例,构建在卷之上的应用程序的用户希望能够“选择”卷创建的位置。Cinder 如何在不损害我们一直保持的简洁性的前提下提供这种能力?亲和性/反亲和性是我们可以在不暴露后端细节的情况下提供的灵活性之一。

这里的亲和性/反亲和性是指在位置方面两组卷之间的关系。为了限制范围,我们描述一个卷只有在它们位于相同的卷后端时(如果 Cinder 支持卷池,这个概念可以扩展到卷池)才与另一个卷具有亲和性;相反,两组卷之间的“反亲和性”关系仅仅意味着它们位于不同的 Cinder 后端(池)。

此亲和性/反亲和性过滤器根据最终用户指定的提示过滤 Cinder 后端。该提示表达了新卷和现有卷之间的亲和性或反亲和性关系。这允许最终用户提供诸如“请将此卷放置在与 Volume-XYZ 位于不同位置的地方”之类的提示。以下是此新过滤器可用的两个用例。

  1. DB 团队在单个卷上构建 MySQL 主服务器,他们希望将用于从库 DB 的新卷放置在与主 DB 不同的后端,以提高可用性。

  2. 日志处理项目希望尽可能拥有快速的存储,因此它们跨多个卷创建软 RAID。他们希望将这些卷尽可能地靠近彼此,理想情况下位于相同的存储后端,以提高性能。

用例

提议的变更

为 Cinder 添加两个新的过滤器 - AffinityFilter 和 AntiAffinityFilter。这两个过滤器将查看最终用户提供的调度器提示(通过调度器提示扩展),并通过检查旧卷和新卷的‘host’来过滤后端,以查看后端是否满足要求(位于与现有卷相同的后端,或者不位于与现有卷相同的后端)。

备选方案

之前有一个提议允许管理员用户直接指定新卷的后端。它并没有真正提供与亲和性过滤器类似的功能,因为它仅限于管理员,并且本身也存在一些缺点(例如安全问题)。

数据模型影响

REST API 影响

安全影响

虽然此更改涉及使用或解析用户提供的 - 调度器提示,但这已经是 Cinder 的一部分。这不会给 Cinder 带来任何额外的风险。

通知影响

其他最终用户影响

性能影响

新过滤器将每次请求查询 DB 一次,它只会给系统增加轻微的延迟,并且延迟与系统的大小无关。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

zhiteng-huang (winston-d on IRC)

工作项

  1. 过滤器实现

  2. 内部 DB API 修改

依赖项

测试

针对 AffinityFilter 的测试
  • 创建卷 A;

  • 使用 A 的 uuid 和 ‘same_backend’ 作为提示创建另一个卷 B;

  • 检查 B 是否创建在与 A 相同的后端;

针对 AntiAffinityFilter 的测试
  • 创建卷 A;

  • 使用 A 的 uuid 和 ‘different_backend’ 作为提示创建另一个卷 C;

  • 检查 C 是否创建在与 A 不同的后端;

文档影响

需要记录新过滤器的用法。

参考资料

Nova 自 Diablo 以来一直提供名为 SameHostFilter 和 DifferentHostFilter 的类似功能。

https://github.com/openstack/nova/blob/master/nova/scheduler/filters/affinity_filter.py