Atom feed of this document
  

 为调度配置和使用驱动过滤器和权重

OpenStack 块设备存储允许您选择一个基于卷后端指定属性的卷后端,这些属性是通过 DriverFilter 和 GoodnessWeigher 来调度的。驱动过滤器和权重调度可以帮助保证调度器选择基于请求的卷属性和各种卷后端指定属性的最佳卷后端。

 什么是驱动过滤和权重,以及何时使用它

The driver filter and weigher gives you the ability to more finely control how the OpenStack Block Storage scheduler chooses the best back end to use when handling a volume request. One example scenario where using the driver filter and weigher can be if a back end that utilizes thin-provisioning is used. The default filters use the "free capacity" property to determine the best back end, but that is not always perfect. If a back end has the ability to provide a more accurate back-end specific value you can use that as part of the weighing. Another example of when the driver filter and weigher can prove useful is if a back end exists where there is a hard limit of 1000 volumes. The maximum volume size is 500 GB. Once 75% of the total space is occupied the performance of the back end degrades. The driver filter and weigher can provide a way for these limits to be checked for.

 启用驱动过滤和权重

要启用驱动过滤器,请将 cinder.conf 文件中的 scheduler_default_filters 选项设置为 DriverFilter 或将其添加到其他已有的过滤器列表中。

要启用 goodness 过滤器作为权重,请将 cinder.conf 文件中的 scheduler_default_weighers 设置为 GoodnessWeigher 或将其添加到其他已有权重的列表中。

您可以选择不包含 GoodnessWeigherDriverFilter,反之亦然。过滤器或权重协同工作,在帮助调度器选择最佳后端过程中创造了最佳利益。

[重要]重要

DriverFilterGoodnessWeigher 的支持对后端是可选的。如果您使用了一个不支持过滤器和权重功能的后端,那么您可能无法从中得到完全的利益。

配置文件cinder.conf实例:

scheduler_default_filters = DriverFilter
scheduler_default_weighers = GoodnessWeigher
[注意]注意

使用 OpenStack 中的其他过滤器和权重与这些自定义的过滤器和权重结合使用是非常有用的。例如,CapacityFilterCapacityWeigher 可以结合使用。

 定义你自己的过滤器和合适的函数

您可以通过使用各种 OpenStack 块设备存储可用的属性来定义自己的过滤器和 goodness 功能。属性的暴露包括关于卷请求的信息、volume_type 的设置和后端关于驱动的指定信息。所有这些允许了很多对卷请求的最佳后端的决定的控制。

filter_function 是一个字符串,定义了一个等式,它会决定一个后端在调度器中是否应该看成一个潜在的候选。

goodness_function 选项时一个字符串,定义了一个等式,它会评估潜在主机的质量 (0 到 100,0 最低,100 最高)。

[重要]重要

如果您没有定义的话,过滤器和 goodness 功能的默认值会用于所有后端。如果需要完全控制,那么过滤器和 goodness 功能应该在每个后端的 cinder.conf 文件中定义。

 在过滤器中所支持的操作和良好的功能

下面是一个可以使用在您所创建的自定义的过滤器和 goodness 功能中目前所有可用的操作的表格:

操作 类型

+, -, *, /, ^

标准数字运算符

not, and, or, &, |, !

逻辑

>, >=, <, <=, ==, <>, !=

等于

+, -

标志

x ? a : b

三元

abs(x), max(x, y), min(x, y)

数学函数

[小心]小心

您所定义的过滤器和 goodness 字符串时出现的语法错误会在卷请求时引起错误抛出。

 当创建自定义的功能时可用的属性

有各种个样的属性可以用在 filter_function goodness_function 字符串中。这些属性允许访问卷的信息、qos 配置、额外规格等等。

这里是属性的一个列表,以及当前可用的子属性:

  • stats—These are the host stats for a back end.

    主机

    主机名称。

    volume_backend_name

    后端卷名称

    vendor_name

    供应商名称

    driver_version

    驱动版本。

    storage_protocol

    存储协议。

    QoS_support

    布尔值,决定是否支持QoS。

    total_capacity_gb

    以GB计的总容量。

    allocated_capacity_gb

    以GB计的已分配容量。

    reserved_percentage

    保留存储的百分比。

  • capabilities—These are the capabilities specific to a back end.

    在此可用的属性是由指定的后端决定的,您为后端创建了过滤器和 goodness 功能。一些后端可能包含了这里的一些可用属性。

  • volume—The requested volume properties.

    状态

    所请求的卷的状态。

    volume_type_id

    卷类型的ID。

    display_name

    卷的显示名称。

    volume_metadata

    任何卷拥有的元数据。

    预订

    任何卷的预订。

    user_id

    卷的用户ID。

    attach_status

    卷的挂接状态。

    display_description

    卷的描述显示。

    id

    卷的ID。

    replication_status

    卷的复制状态。

    snapshot_id

    卷的快照ID。

    encryption_key_id

    卷的加密键ID。

    source_volid

    源卷ID。

    volume_admin_metadata

    此卷的任何管理的元数据。

    source_replicaid

    复制源ID。

    consistencygroup_id

    一致性组ID。

    大小

    以GB为单位的卷大小。

    元数据

    常规元数据。

    在此使用最多的属性应该是 size 子属性了。

  • extra—The extra specs for the requested volume type.

    查看卷类型的可用属性,运行:

    $ cinder extra-specs-list
  • qos—The current QoS specs for the requested volume type.

    查看卷类型的可用属性,运行:

    $ cinder qos-list

为了以自定义的字符访问这些属性,使用下面的格式:

<property>.<sub_property>

 驱动过滤和权重使用实例

下面是一些分开或共同使用过滤器和权重以及使用指定驱动属性的示例。

cinder.conf配置定制的过滤器功能实例:

[default]
scheduler_default_filters = DriverFilter
enabled_backends = lvm-1, lvm-2

[lvm-1]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
filter_function = "volume.size < 10"

[lvm-2]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
filter_function = "volume.size >= 10"

The above example will filter volumes to different back ends depending on the size of the requested volume. Default OpenStack Block Storage scheduler weighing is done. Volumes with a size less than 10 GB are sent to lvm-1 and volumes with a size greater than or equal to 10 GB are sent to lvm-2.

针对goodness功能所定制的cinder.conf 配置文件实例:

[default]
scheduler_default_weighers = GoodnessWeigher
enabled_backends = lvm-1, lvm-2

[lvm-1]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
goodness_function = "(volume.size < 5) ? 100 : 50"

[lvm-2]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
goodness_function = "(volume.size >= 5) ? 100 : 25"

The above example will determine the goodness rating of a back end based off of the requested volume's size. Default OpenStack Block Storage scheduler filtering is done. The example shows how the ternary if statement can be used in a filter or goodness function. If a requested volume is of size 10 GB then lvm-1 is rated as 50 and lvm-2 is rated as 100. In this case lvm-2 wins. If a requested volume is of size 3 GB then lvm-1 is rated 100 and lvm-2 is rated 25. In this case lvm-1 would win.

针对同时支持goodness和过滤器功能所定制的cinder.conf 配置文件实例:

[default]
scheduler_default_filters = DriverFilter
scheduler_default_weighers = GoodnessWeigher
enabled_backends = lvm-1, lvm-2

[lvm-1]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
filter_function = "stats.total_capacity_gb < 500"
goodness_function = "(volume.size < 25) ? 100 : 50"

[lvm-2]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = sample_LVM
filter_function = "stats.total_capacity_gb >= 500"
goodness_function = "(volume.size >= 25) ? 100 : 75"

上面的例子结合了前两个例子的方法。现在最佳后端将基于总的后端容量和所请求的卷大小来决定。

cinder.conf配置访问驱动指定属性功能实例:

[default]
scheduler_default_filters = DriverFilter
scheduler_default_weighers = GoodnessWeigher
enabled_backends = lvm-1,lvm-2,lvm-3

[lvm-1]
volume_group = stack-volumes-lvmdriver-1
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
volume_backend_name = lvmdriver-1
filter_function = "volume.size < 5"
goodness_function = "(capabilities.total_volumes < 3) ? 100 : 50"

[lvm-2]
volume_group = stack-volumes-lvmdriver-2
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
volume_backend_name = lvmdriver-2
filter_function = "volumes.size < 5"
goodness_function = "(capabilities.total_volumes < 8) ? 100 : 50"

[lvm-3]
volume_group = stack-volumes-lvmdriver-3
volume_driver = cinder.volume.drivers.lvm.LVMISCSIDriver
volume_backend_name = lvmdriver-3
goodness_function = "55"

The above is an example of how back-end specific properties can be used in the filter and goodness functions. In this example the LVM driver's 'total_volumes' capability is being used to determine which host gets used during a volume request. In the above example, lvm-1 and lvm-2 will handle volume requests for all volumes with a size less than 5 GB. The lvm-1 host will have priority until it contains three or more volumes. After than lvm-2 will have priority until it contains eight or more volumes. The lvm-3 will collect all volumes greater or equal to 5 GB as well as all volumes once lvm-1 and lvm-2 lose priority.

Questions? Discuss on ask.openstack.org
Found an error? Report a bug against this page


loading table of contents...