感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:[email protected]
说实话,关于Nova-scheduler服务的资料已经很多,而且弄明白后其原理也是很简单的,实现选取最优目标主机实际上就是两个步骤,过滤和称重。
PS:上周针对Nova-scheduler的调度器算法和Nova-cell的调度器算法写了两个专利,后来才知道,加入某些协议的开源项目是不能申请专利的。希望时间不要白费啊,哈哈哈......
好啦,这篇博客先来说说Nova-scheduler组件的源码结构。
1.Nova-scheduler组件的源码结构图
2.Nova-scheduler组件的源码结构解析
/nova/scheduler/chance.py
这个文件中只有一个类ChanceScheduler,继承自类Scheduler,实现了基于随即选取主机节点的方式的调度器;
/nova/scheduler/filter_scheduler.py
这个文件中也只有一个类FilterScheduler,继承自类Scheduler,实现了基于主机过滤器选取主机节点方式的调度器;
/nova/scheduler/driver.py
这个文件中最重要的就是类Scheduler,是所有调度器实现都要继承的基类;
/nova/scheduler/host_manager.py
这个文件中有两个类的实现,都是描述了跟调度器操作相关的主机的实现,其中,类HostState描述了从主机获取相关数据和状态的一些实现,类HostManager描述了跟调度器操作相关的一些主机管理实现。
/nova/scheduler/manager.py
这个文件主要实现了一个类SchedulerManager,定义了若干需要通过调度器实现的主机管理操作。
/nova/scheduler/multi.py
这个文件主要实现了一个类MultiScheduler,实现了动态地选取调度器filter_scheduler.FilterScheduler或nova.scheduler.chance.ChanceScheduler。
/nova/scheduler/rpcapi.py
这个文件主要实现了一个类SchedulerAPI,实现了通过RPC通讯架构远程调用调度器相关的主机管理方法。
/nova/scheduler/schedeler_options.py
这个文件主要实现了一个类SchedulerOptions,实现了一些json格式文件的处理和时间戳的获取等方法。
/nova/scheduler/baremetal_host_manager.py
这个文件主要实现了当前域中主机的一些管理方法。
/nova/scheduler/filters/__init__.py
这个文件主要定义了一个类BaseHostFilter,描述了一个主机过滤器实现的基类;
/nova/scheduler/filters/affinity_filter.py
这个文件中定义了四个过滤器类:
DifferentHostFilter:选择与一个集合的虚拟机不同位置的主机;
SameHostFilter:选择与一组虚拟机相同位置的主机;
SimpleCIDRAffinityFilter:选择在同一IP段内的主机;
GroupAntiAffinityFilter:选择与一个集合的虚拟机不同位置的主机,集合中的每个元素都是一个虚拟机的组;
/nova/scheduler/filters/aggregate_instance_extra_specs.py
这个文件定义了一个过滤器类:AggregateInstanceExtraSpecsFilter
返回能够建立某一类型虚拟机的主机列表;
功能:将主机所属的aggregate的metadata属性,与创建虚拟机的instance_type中的extra_specs属性作比较;
同时,在extra_specs属性中,支持一些伪操作符(nova\scheduler\filters\extra_specs_ops.py),
比如extra_specs={'mem':'>= 512'},那么host所属的aggregate的metadata={'mem':'1024'}时,就允许创建虚拟机;
/nova/scheduler/filters/aggregate_multitenancy_isolation.py
这个文件定义了一个过滤器类:AggregateMultiTenancyIsolation
实现在特定的聚集中隔离租户;
如果host在具有"filter_tenant_id"的key值的元数据的聚合中,
则仅能够在这个租户的节点上建立虚拟机实例;
如果host不在具有"filter_tenant_id"的key值的元数据的聚合中,
则能够在所有的租户的节点上建立虚拟机实例;
/nova/scheduler/filters/all_hosts_filter.py
这个文件定义了一个过滤器类:AllHostsFilter
不经过过滤,返回所有主机host;
/nova/scheduler/filters/availability_zone_filter.py
这个文件定义了一个过滤器类:AvailabilityZoneFilter
通过可用的区域来过滤主机host;
功能:保证虚拟机所属的availability_zone与host所属的availability_zone一致;
如果创建时没有指定availability_zone,那么允许;
否则就看是否与host所属aggregate的metadata['availability_zone']匹配;
/nova/scheduler/filters/compute_capabilities_filter.py
这个文件定义了一个过滤器类:ComputeCapabilitiesFilter
功能:根据host的capabilities判断是否允许创建虚拟机;
将host->capabilities与虚拟机的instance_type->extra_specs作比较,
比较方法类似于AggregateInstanceExtraSpecsFilter;
/nova/scheduler/filters/compute_filter.py
这个文件定义了一个过滤器类:ComputeFilter
功能:根据主机capabilities的状态和服务的可用性过滤;
/nova/scheduler/filters/core_filter.py
这个文件定义了一个过滤器类:CoreFilter
基于主机的CPU内核数进行过滤;
如果剩余的内核数大于建立实例需要的内核数,则返回TRUE;
功能:看host上的vcpu个数能否满足创建虚拟机的instance_type中的vcpu个数;
根据CONF.cpu_allocation_ratio(默认是16)确定host上当前的vcpus_total;
/nova/scheduler/filters/disk_filter.py
这个文件定义了一个过滤器类:DiskFilter
基于磁盘使用率的主机host过滤;
功能:看host上的disk大小能否满足创建虚拟机的instance_type中的(root_gb + ephemeral_gb);
计算disk总量时,会根据CONF.disk_allocation_ratio计算;
/nova/scheduler/filters/image_props_filter.py
这个文件定义了一个过滤器类:ImagePropertiesFilter
通过符合实例镜像属性来进行计算节点主机的过滤;
功能:看虚拟机image->properties中某些属性是否在host的capabilities->supported_instances内;
属性包括:architecture、hypervisor_type、vm_mode;
如果image->properties中没有这些属性,则通过过滤;
如果有这些属性,而host->capabilities->supported_instances没有,返回False;
/nova/scheduler/filters/io_ops_filter.py
这个文件定义了一个过滤器类:IoOpsFilter
过滤掉有过多的I/O操作的主机host;
功能:根据主机的IO负载过滤;
IO负载由host->num_io_ops表示,与CONF.max_io_ops_per_host(默认是8)比较;
/nova/scheduler/filters/isolated_hosts_filter.py
这个文件定义了一个过滤器类:IsolatedHostsFilter
根据 “image_isolated”和 “host_isolated”标志选择主机;
这可以为一些特殊的hosts保留给指定的images;
这些hosts被称作isolated,所以运行在孤立hosts上的镜像也被称作isolated;
这个调度器检查是否image_isolated标志命名在实例规定和在host中的一致;
功能:如果没有配置CONF.isolated_images,当前host不在CONF.isolated_hosts中,返回True;
如果虚拟机image_ref在CONF.isolated_images中,且host在CONF.isolated_hosts中,返回True;
其他情况返回False;
/nova/scheduler/filters/json_filter.py
这个文件定义了一个过滤器类:JsonFilter
JsonFilter过滤器的实现;
根据简单的JSON字符串指定的规则选择主机;
这个过滤提供这个机会来写复杂的查询对于hosts能力过滤;
/nova/scheduler/filters/num_instances_filter.py
这个文件定义饿了一个过滤器类:NumInstancesFilter
过滤掉已经有太多实例的主机host;
选择那些host_state.num_instances < CONF.max_instances_per_host的主机;
/nova/scheduler/filters/ram_filter.py
这个文件定义了一个过滤器类:RamFilter
只返回有足够可使用的RAM主机host;
根据指定的RAM值选择资源足够的主机;
与CoreFilter类似,CONF.ram_allocation_ratio=1.5;
/nova/scheduler/filters/retry_filter.py
这个文件定义了一个过滤器类:RetryFilter
跳过已经尝试过的节点;
/nova/scheduler/filters/trusted_filter.py
这个文件定义了一个过滤器类:TrustedFilter
支持Trusted Computing Pools,根据instance_type-> extra_specs-> trust:trusted_host,校验主机是否可信;
/nova/scheduler/filters/type_filter.py
这个文件定义了一个过滤器类:TypeAffinityFilter
TypeAffinityFilter过滤器的实现,它不允许一个主机上运行多余一种类型的虚拟机;
如果该主机上存在规格不为instance_type的虚拟机,返回False,也就是保证一个主机上只允许创建相同规格的虚拟机;
/nova/scheduler/weights/__init__.py
这个文件主要定义了一个方法all_weighers,实现了选取主机称重方法的调用。
/nova/scheduler/weights/least_cost.py
这个文件实现了一个主机称重方法,即:get_least_cost_weighers;
/nova/scheduler/weights/ram.py
这个文件实现了一个主机称重类,即:RAMWeigher;