上篇文章介绍了Nova Scheduler服务的启动流程,我们知道Nova Scheduler服务作为一个调度者,其核心便是调度算法。这篇文章我们就来分析一下Nova Scheduler服务的调度算法吧。
在配置文件中,调度算法默认的驱动类是FilterScheduler,该类位于nova/nova/scheduler/filter_scheduler.py中。其算法的原理是比较简单的,就是“过滤”和“称重”的过程。
class FilterScheduler(driver.Scheduler):
def scheduler_run_instance(self, context, request_spec,
admin_password, injected_files,
requested_networks, is_first_time,
filter_properties):
#获取调度所需参数
payload = dict(request_spec=request_spec)
#通知Nova API开始调度
notifier.notify(context, notifier.publisher_id("scheduler"),
'scheduler.run_instance.start', notifier.INFO, notifier.INFO,
payload)
...
#执行调度算法,获取加权主机列表
weighted_hosts = self._schedule(context, "compute", request_spec,
filter_properties, instance_uuids)
...
#为每个虚拟机分配计算节点
for num, instance_uuid in enumerate(instance_uuids):
...
try:
try:
#选择权值最高的计算节点
weighted_host = weighted_hosts.pop(0)
except IndexError:
raise exception.NoValidHost(reason="")
#在权值最高的计算节点上创建虚拟机
self._provision_resource(context, weighted_host,
request_spec,
filter_properties,
requested_networks,
injected_files, admin_password,
is_first_time,
instance_uuid=instance_uuid)
except Exception as ex:
...
#通知Nova API虚拟机调度完毕
notifier.notify(context, notifier.publisher_id("scheduler"),
'scheduler.run_instance.end', notifier.INFO, payload)
算法的核心实现在FilterScheduler类的_scheduler方法中。后面的_provision_resource方法实际上是远程调用了Nova Compute服务的run_instance方法。我们下面来重点看一下包含算法核心的_scheduler方法。
def _schedule(self, context, topic, request_spec, filter_properties,
instance_uuids=None):
#获取用户上下文信息
elevated = context.elevated()
#获取虚拟机的信息
instance_properties = request_spec['instance_proper