4.2 基于OpenStack Nova的计算资源池调度算法
在OpenStack Nova中关于计算资源的调度问题,是在Nova-Scheduler模块中实现的。在OpenStack中,Filter Scheduler模块的作用就是决策虚拟机创建在哪个主机上,调度仅支持计算节点。通过分析源代码,我们可以看到调度器有以下定制的方法(见图4-1)。
图4-1 Nova Scheduler的可扩展机制1
第一种扩展方法是不用默认的fi lter_scheduler. py的class FilterScheduler,自己完全可以从driver. py/class Scheduler继承并实现自己的类。
第二种扩展方法是不使用默认的物理主机状态管理类host_manager.py/ classHostManager,自己从HostManager继承或者重载实现xxxHostManager类进行物理主机状态的管理。
第三种方法是提供自己的调度过滤器或者权重过滤器插件,参考affi nity_fi lter.py或ram.py实现自己的插件,在部署的时候配置为自己的插件即可。除了上面的三种方法,调度器还在各种地方提供了扩展性。
例如第四种方法,其在物理主机中定义一个主机组Group,然后在Scheduler Hint中带上这个Group,也可以实现可定制的调度策略。
第五种方法是在Scheduler Hint中增加自定义的调度条件,在调度的时候通过自己的Filter插件增加调度能力。
第六种方法是在创建虚拟机请求的AZ参数中通过“AZ:host”的方式指定主机进行虚拟机的创建。
第七种方法是调度器始终监控一个调度配置json文件,如果这个文件发生变化,则动态加载这个调度配置文件,改变和调整调度策略,因此可以动态修改这个json文件修改调度策略(见图4-2)。
图4-2 Nova Scheduler的可扩展机制2
基于Scheduler的调度机制分为两部分,主机过滤(Filtering)和权值计算(Weights)。
4.2.1 主机过滤
如图4-3所示,在主机过滤过程中,过滤调度器首先生成一个字典包含没有过滤的主机集,经过若干过滤属性机制生成主机集,再经过权重机制,选择开销最小的若干主机,最终得到请求的实例数主机集。对于特定的过滤机制,会产生特定的主机集。
图4-3 Nova Scheduler机制
如果经过上述调度机制没有选择出主机,那么意味着没有合适的主机可供调度。过滤机制非常灵活的支持一系列过滤函数以及权重策略。若认为过滤机制,实现不够有效率,还可以实现自己的过滤算法。
在nova.scheduler.filters中,有一些标准的过滤函数,如表4-1所示。
表4-1 各插件的功能和使用方法
(续表)
很多过滤机制使用的数据都是通过scheduler_hints,其通常定义在用户初始建立实例的过程中,唯独不包括JsonFilter过滤器。
对于自定义的过滤器,必须继承于BaseHost Filter类,实现host_passes方法,如果通过这个方法的逻辑,则返回true。
举一个例子,若nova.conf文件中包含下面配置:
·scheduler_driver=nova.scheduler.Filter Scheduler
·scheduler_available_filters=nova.scheduler. filters.all_filters
·scheduler_available_filters=myfilter.MyFilter
·scheduler_default_filters=RamFilter, ComputeFilter, MyFilter
对于上面配置,nova会使用FilterScheduler作为调度器的驱动。标准的过滤函数以及自定义的MyFilter函数可作为可用的过滤器,RamFilter、ComputeFilter、MyFilter可作为默认的过滤器。
不同的过滤函数会有不同的实现方式,那么也决定了不同的开销。在scheduler_default_filters中的顺序,会影响调度器的性能。一般建议是尽快过滤掉无效主机,以避免不必要的开销。我们可以通过其开销倒序排序scheduler_default_filters中的顺序。
在大中型环境中,通常利用Availability ZoneFilter在其他资源计算型过滤函数前,会非常有用。
4.2.2 权值计算
权值计算,是一种能够在过滤集中找出最佳的主机的一种机制。为了能够控制不同的权值因素,使用权值系数。因此,最终的公式可以定义为:
weight = w1_multiplier * norm(w1)+ w2_multiplier * norm(w2)+ ...
权值计算是weights.BaseHostWeigher类的子类,可以实现weight_multiplier和 _weight_object方法,也可以只实现_weight_object方法。
对于权值计算部分,在配置文件nova. scheduler.weights.all_weighers中,默认的基于scheduler_weight_classes类,分别包括下列权值计算函数。
RAMWeight:通过可用的RAM大小决定计算节点。
DiskWeight:通过可用的磁盘大小进行权值分配,最大的优先级最高。
MetricsWeigher:通过主机的不同参数度量决定主机的权值。在配置文件中指定相关参数:
metrics_weight_setting = name1=1.0, name2=-1.0
IoOpsWeigher:通过主机的负载进行权重计算,默认选择负载最小的主机(见图4-4)。
图4-4 权值计算机制
Server Group Soft Affinity Weigher:通过同一个主机组中运行的实例数进行权重计算。
Filter Scheduler模块通过一系列的主机过滤以及权值计算,获得一个可以接受的主机集合。
最后被选择的主机集合,通过最终的权值计算进行排序,并提供主机集与准备运行的实例。