O048、掌握 cinder-scheduler 调度逻辑
参考https://www.cnblogs.com/CloudMan6/p/5589707.html
上一节我们详细讨论了cinder-api 和 cinder-volume ,今天讨论另一个重要的 Cinder组件 cinder-scheduler
创建Volume 时,cinder-scheduler 会基于容量、Volume type 等条件选择出最合适的存储节点,然后让其创建Volume,下面介绍cinder-scheduler 是如何实现这个调度工作的。
在 /etc/cinder/cinder.conf 中,cinder通过 scheduler_driver, scheduler_default_filters 和 scheduler_default_weighers 这三个参数来配置 cinder-scheduler。(这几项在 devstack安装的rocky版本中并未找到)
Filter scheduler
Filter Scheduler 是 cinder-scheduler 默认的调度器。
scheduler_driver=cinder.scheduler.filter_scheduler.FilterScheduler
与nova一样,Cinder 也允许使用第三方scheduler,配置scheduler_driver 即可。
scheduler 调度过程如下:
1、通过过滤器(filter)选择满足条件的存储节点(运行 cinder-volume)
2、通过权重计算(weighting)选择最优(权重值最大)的存储节点
可见,cinder-scheduler 的运行机制和 nova-scheduler 完全一致。
Filter
当 Filter scheduler 需要执行调度操作时,会让Filter 对存储节点进行判断,filter 返回 True 或者 False。cinder.conf 中 scheduler_default_filters 选项指定 filter scheduler 使用的filter,默认值为:
scheduler_default_filters = AvailabilityZoneFilter, CapacityFilter, CapabilitiesFilter
Filter scheduler 将按照上面的顺序依次过滤
AvailabilityZoneFilter
为提高容灾性和提供隔离服务,可以将存储节点和计算节点划分到不同的 Availability Zone 中。例如把一个机架上的机器划分在一个Availability Zone 中。OpenStack默认有一个命名为 Nova 的 Availability Zone ,所有的节点初始都是在 Nova 中。用户可以根据需要创建自己的 Availability Zone。
![]()
CapacityFilter
创建volume 时,用户会指定volume的大小,CapacityFilter 的作用是将存储空间不能满足 volume创建需求的存储节点过滤掉。
CapabilitiesFilter
不同的volume provider 有自己的特性(Capabilities),比如是否支持 thin provision 等。Cinder 允许用户创建 volume 时通过volume type 指定需要的 Capabilities
volume type 可以根据需要定义若干个 Capabilities ,详细描述 volume的属性。volume type 的作用与 nova 的flavor类似。
![]()
通过 volume type 的extra specs 定义 Capabilities
![]()
Extra Specs 是用 Key-Value 的形式定义,不同的 volume provider 支持的 Extra Specs 不同,需要参考 volume provider 的文档。
![]()
上面的volume type 只有一个 Extra Specs “volume_backend_name”,这是最重要的也是必须的 Extra Specs 。
cinder-volume 会在自己的配置文件 /etc/cinder/cinder.conf 中定义设置 “volume_backend_name = lvmdriver-1”,其作用是为存储节点的volume provider 命名。这样 CapabilitiesFilter 就可以通过 volume type 的volume_backend_name 筛选出指定的 volume provider。
如果在第一步filtering 环节选出了多个存储节点,那么接下来的weighting 环节会挑选出最合适的一个节点。
Weighting
Filter Scheduler 通过 scheduler_default_weighers 指定计算权重的weigher,默认为 CapacityWeigher。
scheduler_default_weighers = CapacityWeigher
如命名所示,CapacityWeigher 基于存储节点的空闲容量计算权重值,空闲最多的胜出。