上篇文章介绍了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,
&nb