cinder-scheduler服务是Cinder的调度服务,主要功能是通过一定的调度算法选择合适的后端存储节点以放置新创建的卷。
在Folsom版本中,cinder-scheduler服务只是实现了简单调度(Simple Scheduler)算法和随机调度(Chancer Scheduler)算法。简单调度算法就是获取活动的卷服务节点,按剩余容量从小到大排列,选择剩余容量最多的Host节点;随机调度算法就是在满足条件的节点中随机挑选出一个Host节点。
在G版本后有了基于滤波和权重的新调度策略FilterScheduler,其工作原理如图3-3所示。首先使用一个指定的过滤器过滤后得到符合条件的cinder-volume节点,然后对列表中cinder-volume的节点计算权重并进行排序,获得最佳的一个Host节点。在图3-3中,排序后最优节点是Host3,次优节点是Host5,最差节点是Host6。
图3-3 FilterScheduler的工作原理
cinder-scheduler服务提供了调度重试机制,在通过排序挑选出最优的Host节点后,将创建卷的消息发送给该节点,并由该节点的cinder-volume服务来处理。如果该节点的cinder-volume服务在处理过程中由于某些条件不满足而导致返回错误结果,cinder-scheduler将选择次优Host节点重试。最大可重试次数默认是3次,并且可以设置。
cinder-scheduler实现了多种Filter和Weighter的算法。所有的Filter实现都在cinder/scheduler/filters目录中,所有的Weighter的实现在cinder/scheduler/weighters目录中。
具体的Filter有如下几种。
·Availability Zone Filter:在指定的Zone中选择Host。
·Retry Filter:在没有重试过的Host中重新进行调度。
·JsonFilter:允许应用以Json的形式写出比较复杂的查询Host的表达式。
·CapabilitiesFilter:在一个由各种类型存储组合(LVM、Ceph等)的存储系统中选择某种存储类型。
·CapacityFilter:容量过滤,只选择那些剩余容量大于要创建的卷的大小的Host。
当然也可以自己创建一个新的Filter。首先要实现一个类,继承自BaseHostFilter类;实现的类中调用一个host_passes()函数,该函数以filter_properties和host_state为参数;结果返回true或者false两种结果;然后在cinder.conf文件中额外增加--scheduler_available_filters=myfilter.MYFILTER配置项。