Over Subscription in Thin Provisioning

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/cinder/+spec/over-subscription-in-thin-provisioning

本提案旨在引入一种机制,允许在精简配置中使用超额订阅,并使用保留百分比来防止过度配置。

问题描述

在精简配置的容量报告中存在一些问题

  • 一些驱动程序仍然使用“无限”和“未知”来报告容量。这可能导致过度配置。

  • 精简配置中没有允许超额订阅的机制。超额订阅允许在存储分配和使用方面具有灵活性,并且是在提供精简配置支持方面的一个重要概念。

术语

本规范将使用以下术语

total_capacity:这是驱动程序已经报告的现有参数。它是总的物理容量。例如:假设后端 A 具有 100G 的总物理容量。

free_capacity:这是驱动程序已经报告的现有参数。它是可用于使用的实际物理容量。例如:假设后端 A 具有 100G 的总物理容量。有 10G 的厚 LUN 和 20G 的薄 LUN(20G 薄 LUN 中写入了 10G)。在这种情况下,free_capacity = 100 - 10 -10 = 80G。

free:这是调度器通过从 free_capacity 中减去保留空间计算得出的。

volume_size:这是现有参数。它是要配置的卷的大小。

provisioned_capacity:这是一个新的参数。它是表观分配的空间,指示已配置了多少容量。例如:用户 A 在后端 A 中创建了 2 个 10G 的卷,用户 B 直接在后端 A 中创建了 3 个 10G 的卷,未使用 Cinder。假设这些是后端 A 上配置的所有卷。总的 provisioned_capacity 将是 50G,驱动程序应该报告这个值。

allocated_capacity:这是一个现有参数。Cinder 使用它来跟踪通过 Cinder 已分配了多少容量。例如:使用上面 provisioned_capacity 的例子,allocated_capacity 将是 20G,因为这是通过 Cinder 配置的。记录 allocated_capacity 是为了与新的参数 provisioned_capacity 区分开来。如果驱动程序可以保证后端仅用于特定的 Cinder 安装,那么 provisioned_capacity 可以与 allocated_capacity 相同。只有驱动程序了解这一点,因此驱动程序可以决定如何报告 provisioned_capacity。

max_over_subscription_ratio:这是一个新的参数。它是涉及精简配置时的超额订阅比率的浮点数表示。它是配置容量与总容量的比率。默认比率为 1.0,这意味着配置容量不能超过总容量。请注意,此比率取决于驱动程序实现,可以是每个后端或每个池。

reserved_percentage:这是一个现有参数。它表示后端容量的保留百分比。范围从 0 到 100。默认值为 0。请注意,这指的是实际容量。这取决于驱动程序实现,可以是每个后端或每个池。

reserved:这是调度器计算的 reserved_percentage 除以 100 的比率。

virtual_free_capacity:这是一个基于其他参数计算的参数。它指的是用户可以表观地配置多少空间。请注意,这与 free_capacity 不同。free_capacity 是关于实际可用的物理容量。virtual_free_capacity 是关于表观可用的虚拟容量。例如:假设后端 A 的总容量为 100G。最大超额订阅比率为 2.0。如果尚未配置任何卷,则 virtual_free_capacity 为 100 x 2.0 = 200。如果已经配置了 50G 的卷,则 virtual_free_capacity 为 200 - 50 = 150。

用例

提议的变更

get_volume_stats 中的新参数

将在 cinder/volume/driver.py 中添加一个新的配置选项“max_over_subscription_ratio”。此配置选项将添加到 cinder.conf。当启用多后端时,可以为每个后端配置它。

注意:此配置选项作为参考实现提供,并将由 LVM 驱动程序使用。但是,驱动程序不需要从 cinder.conf 使用此选项。如果这样做更有意义,驱动程序可以选择自己的方式。

在 scheduler/host_manager.py 中,每个后端发送的以下附加信息将被保存,并将在以后由调度器用于做出决策。请注意,这些是为后端或池报告的,具体取决于驱动程序实现。在 LVM 驱动程序中,这些将为后端报告(被视为一个池)。

  • provisioned_capacity

  • max_over_subscription_ratio

reserved_percentage 的使用方式发生变化。过去它是相对于空闲容量测量的。现在它将相对于总容量测量。

注意:在 cinder.conf 中添加的配置选项 max_over_subscription_ratio 是用于配置后端的。对于支持每个后端多个池的驱动程序,它可以为 get_volume_stats 中的每个池报告这些比率。

  • 驱动程序可以在 cinder.conf 中获取此选项,并为属于同一后端的池报告相同的比率。

  • 或者,驱动程序可以选择在 get_volume_stats 中为每个池报告不同的比率,而无需在 cinder.conf 中使用此选项。

Capabilities(功能)

驱动程序可以为后端或池报告以下功能

thin_provisioning_support = True (或 False) thick_provisioning_support = True (或 False)

这里添加了两个功能,允许后端或池声明对精简配置或厚配置或两者的支持。

Volume type extra specs(卷类型附加规格)

如果卷类型作为卷创建请求的一部分提供,它可以具有以下定义的附加规格

‘capabilities:thin_provisioning_support’: ‘<is> True’ 或 ‘<is> False’ ‘capabilities:thick_provisioning_support’: ‘<is> True’ 或 ‘<is> False’

注意:在 ‘thin_provisioning_support’ 和 ‘thick_provisioning_support’ 之前不需要 ‘capabilities’ 范围键。因此,以下内容也有效

‘thin_provisioning_support’: ‘<is> True’ 或 ‘<is> False’ ‘thick_provisioning_support’: ‘<is> True’ 或 ‘<is> False’

上述附加规格由调度器用于查找支持精简配置、厚配置或两者的后端,以匹配特定卷类型的需求。

如果定义了附加规格范围键“provisioning:type”,则驱动程序可以使用它来确定要配置的 LUN 是精简还是厚。此附加规格的值是“thin”或“thick”。请注意,此附加规格不用于由调度器查找后端。

Capacity filter(容量过滤器)

在容量过滤器中,在选择符合标准的后端时,将评估以下内容

如果 (provisioned_capacity + volume_size) / total_capacity >= max_over_subscription_ratio,则不会选择后端来配置卷。注意:仅当“thin_provisioning_support”为 True 且 max_over_subscription_ratio >= 1 时,才会执行此公式。

如果 ((free_capacity - total_capacity * reserved) * max_over_subscription_ratio) < volume_size,则不会选择后端来配置卷。注意:仅当“thin_provisioning_support”为 True 且 max_over_subscription_ratio >= 1 时,才会执行此公式。

如果 (free_capacity - total_capacity * reserved) < volume_size,则不会选择后端来配置卷。请注意,此检查已经存在于容量过滤器中,但公式已更改为使用 total_capacity * reserved 代替 free_capacity * reserved。

Capacity weigher(容量称重器)

在容量称重器中,如果“thin_provisioning_support”为 True,则应使用 virtual_free_capacity 进行排名。否则,将像以前一样使用实际的 free_capacity。对测量的保留空间进行更改,相对于 total_capacity。virtual_free_capacity = total_capacity * max_over_subscription_ratio - provisioned_capacity - total_capacity * reserved

LVM driver(LVM 驱动程序)

在默认的 LVM 驱动程序中,将对 get_volume_stats 进行更改,定期报告功能和信息,这些信息将被调度器接收。

  • 将对 LVM 驱动程序进行更改,以报告 provisioned_capacity。它调用 brick 中的 LVM 类来检索卷信息,包括容量。

  • LVM 驱动程序还将报告 max_over_subscription_ratio。这将来自 cinder.conf 中设置的配置参数。

  • 虽然其他驱动程序需要报告 max_over_subscription_ratio,但它们不需要从 cinder.conf 读取这些比率。

将对以下 LVM 驱动程序函数进行更改,以确保即使请求未通过调度器,也不会发生过度配置

  • create_volume

  • extend_volume

将在上述 LVM 驱动程序函数中评估以下内容

  • 如果表观配置容量与实际总容量的比率超过了超额订阅比率,则操作将失败。

  • 如果空闲空间小于卷大小,则操作将失败。

Use cases(用例)

此功能的设计将支持以下用例。

用例 1:每个卷类型都有一个单独的后端或池。例如,Gold 卷类型使用 gold 池,Silver 卷类型使用 silver 池,Bronze 卷类型使用 bronze 池。每个池可以具有不同的最大超额订阅比率。

用例 2:一个卷类型与多个后端或池相关联。例如,Silver 卷类型使用池 1 和池 2。这两个池可以具有相同的最大超额订阅比率。请注意,每个池的容量可以在任何给定时间不同。

用例 3:一个后端或池由多个卷类型使用。例如,池 3 由卷类型 Gold、Silver 和 Bronze 使用。假设 Gold 卷类型仅使用厚 LUN,Silver 卷类型可以使用厚 LUN 或薄 LUN,Bronze 卷类型仅使用薄 LUN。由于超额订阅比率是通过配置容量与总容量的比率计算的,并且所有三个卷类型都在共享同一个池,因此所有卷类型的比率将相同。Gold 卷类型可以通过创建厚 LUN 来保证其空间预留。Gold 卷的表观大小和使用大小始终相同。对于作为 Silver 或 Bronze 卷类型创建的薄 LUN,表观大小可以大于实际大小。一些详细的示例在此 etherpad 中:https://etherpad.openstack.org/p/cinder-over-subscription-white-board

备选方案

如果没有此功能,我们就无法支持精简配置中的超额订阅,并且也没有上限可以防止发生过度配置。

数据模型影响

N/A

REST API 影响

N/A

安全影响

N/A

通知影响

如果容量使用量超过了使用比率,或者配置容量超过了超额订阅比率,则应发送通知。通知应报告后端或池的名称以及后端或池的容量信息。通知的目的是让存储管理员注意并采取措施解决问题。

每当调度器从后端接收到容量更新时,也会发送通知。这将由 Ceilometer 消耗。这在峰会上讨论了 Capacity Headroom 主题。Ceilometer 团队将负责 Ceilometer 端所需的更改。

其他最终用户影响

cinder.conf 中有一个新的参数,最终用户需要注意。

性能影响

N/A

其他部署者影响

将在 cinder.conf 中添加新的参数 over_subscription_ratio。

开发人员影响

驱动程序应报告配置功能(thin_provisioning_support 和 thick_provisioning_support)。

支持精简配置的驱动程序应在 get_volume_stats 中报告配置容量,除了空闲容量之外。

仅支持厚配置的驱动程序将像以前一样使用空闲容量。

同时支持精简和厚配置的驱动程序应报告配置容量和空闲容量。

如果容量有范围并且您不确定如何报告,请保守。例如,如果可用容量在 80 到 100 GB 之间,请保守并报告较低的界限 80 GB。

驱动程序开发人员可以查看 LVM 驱动程序中的 _update_volume_stats 作为参考实现。

注意:这项工作也需要 Cinder 在 Kilo 中将 ThinLVM 作为默认驱动程序使用。

实现

负责人

主要负责人

xing-yang

其他贡献者

工作项

  1. 在 driver.py 中添加 max_over_subscription_ratio。

  2. 修改 host_manager.py 以更新后端提供的配置容量和超额订阅比率。

  3. 修改容量过滤器以检查后端是否超过了超额订阅比率。

  4. 将在 cinder.conf 中添加新的参数 max_over_subscription_ratio。

  5. LVM 驱动程序将被更改为报告虚拟容量和超额订阅比率。

  6. brick 中的 LVM 类将被更新以计算配置容量。

  7. LVM 驱动程序函数将被更改为检查是否超过了超额订阅比率。

依赖项

N/A

测试

将添加新的单元测试来测试更改后的代码。将使用 LVM 驱动程序进行精简配置进行测试。将进行测试以涵盖上述 3 个用例。

文档影响

需要对以下内容进行文档更改:将在 cinder.conf 中添加新的参数 max_over_subscription_ratio。驱动程序需要添加配置功能(thick_provisioning_suppot、thin_provisioning_support)并报告 provisioned_capacity。

参考资料

示例:https://etherpad.openstack.org/p/cinder-over-subscription-white-board

Winston 的规范中讨论的虚拟容量“provisioned_capacity_gb”:https://review.openstack.org/#/c/105190/6/specs/juno/volume-statistics-reporting.rst

Kilo 设计峰会上关于此主题的会话:https://etherpad.openstack.org/p/kilo-cinder-over-subscription https://etherpad.openstack.org/p/kilo-cinder-capacity-headroom

过滤器调度器的文档:https://docs.openstack.org/developer/nova/devref/filter_scheduler.html 注意:这是 Nova 过滤器调度器的文档,但它与 Cinder 过滤器调度器非常相似。