nova-scheduler是Nova中实现任务分派的模块,决定如何派遣compute和volume的请求。Scheduler映射nova-api调用到合适的OpenStack Component,根据指定的算法从可用资源中获取Compute服务器。以下因素决定调度器的具体算法:负载、内存、可用zone的物理距离、CPU体系结构等。目前nova-schedule的可用调度算法如下。
·Chance:在可用zone中随机选择计算主机。
·AZ:与Chance相似,在执行的AZ中随机选择计算主机。
·Simple:选择负载最轻的主机来运行实例,可从负载均衡器中获取负载信息。
·滤波器调度器:滤波器调度器利用滤波和权重两个概念来决定应该在何处创建新的实例。该调度算法只支持对计算节点的调度,具体调度原理如图2-8所示。
Nova的滤波策略是非常灵活的,目前支持多种滤波调度策略。用户也可实现自己的滤波算法。当前版本内置的滤波器如下。
·AllHostsFilter:实质上没有任何操作,返回的是所有可用主机。
·AvailabilityZoneFilter:通过AZ过滤主机,返回与请求实例具有相同AZ的主机。
·ComputeFilter:返回由满足附加规格的Compute Service提供的能力、与实例类型相关的能力。返回一个列表指明主机上可创建的实例类型。
·CoreFilter:基于CPU核利用率的滤波器,提供具有足够的CPU核数量的主机。
·IsolatedHostsFilter:基于image_isolated和host_isolated flags的滤波器。
·Json Filter:选择主机时考虑是否是基于JSON语法。
·RamFilter:指标是主机的RAM,只返回具有够用的RAM的主机。
·SimpleCIDRAffinityFilter:放置一个新实例到与其具有相同IP block的主机上。
·DifferentHostFilter:放置一个实例到与某个指定的实例系列不同的主机上。
·SameHostFilter:放置一个实例到与某个指定的实例系列相同的主机上。
图2-8 滤波器调度器的调度原理
用户自己创建自己的滤波器,只需集成BaseHostFilter类,并实现该类的一个方法:Host_passes。满足用户设置的条件是,该方法返回为true。该方法有两个参数:host_state、filter_properities。
滤波器调度器在工作过程中会使用所谓的Weight和Cost。Cost是作为请求结果来表达所选择主机的一个度量。通过将请求中的特性与主机特性进行比较得出不同指标的Cost值,最后放置实例到一个低Cost的主机上。计算Cost的函数从高速缓存中获取(如果高速缓存中没有,则从nova.conf中获取),Weight值也是在nova.conf中获取的。使用weight计算函数对主机进行称重,并计算weighted_sum。默认使用的是compute_fill_first_cost_fn函数,返回的是空闲RAM的Weight值。而用户具体想要使用哪种参数的Weight和Cost决定调度结果是用户自己实现的。最后将该函数写入nova.conf文件中的least_cost_functions选项。默认的权重计算函数和权重值设置如下:
--least_cost_functions=nova.scheduler.least_cost.compute_fill_first_cost_fn--compute_fill_first_cost_fn_weight=-1.0