您的位置:首页 > 运维架构

OpenStack Nova-scheduler组件的源码解析(1)

2014-07-06 15:31 295 查看
说实话,关于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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: