1.资源管理
之前的资源管理
资源以物理机(ComputeNode)为粒度统计和上报,所有的资源都从属于单个ComputeNode。这样对于一些共享的外部资源,例如 EBS、neutron的ip个数等,不能很好的管理和调度。每增加一种资源,就要相应的修改对应的ComputeNode代码进行统计和管理,不利于横向扩展。调度之间存在并发问题,每个调度服务之间的实时资源视图不一致,导致调度的目标节点有延后性,不够准确。
Pike版本的资源管理
Pike版本将资源抽象出来,增加一层资源管理层,并且区分资源提供者ResourceProvider、资源项ResourceClass、资源清单Inventory、资源分配Allocation,它们的对应关系如下:
ResourceProvider资源提供者
资源提供者表明资源的拥有者,单个物理机、EBS集群都是一个ResourceProvider。每个ResourceProvider可以提供数个ResourceClass的资源。例如ComputeNode是一个ResourceProvider,它提供多个ResourceClass,包括VCPU、MEMORY_MB、DISK_GB。EBS集群也是一个ResourceProvider,提供一个ResourceClass叫做Volume。
|
|
ResourceClass资源项
资源项表明当前资源的类型和名称,供用户区分不同的资源。它只表明资源的名称类别,不包含具体的资源数量等信息。每个资源类型包含数量不等的具体资源Inventory,可以由多个ResourceProvider提供。例如,MEMORY_MB这个资源项,每个ComputeNode都提供该项资源。每个MEMORY_MB都有一个对应的Inventory,表明具体的资源数量、超售比、保留值等资源的配置。
|
|
Inventory资源详情
资源详情表明ResourceClass中的具体资源和一些配置。例如对于某台ComputeNode作为一个ResourceProvider,提供一项资源MEMORY_MB并且该项资源有一个详细的描述Inventory。
|
|
Allocation资源分配
资源分配表明一个实例需要的一项资源项ResourceClass的具体数值,以及该项资源分配给谁。例如一个云主机需要2GB内存,那么就用一个Allocation表示并单独记录在数据库中,等同于之前版本中的Instance中记录的一项资源的使用(memory_mb_used)。
|
|
以上是资源管理的具体分工,它们的对应关系如下:
|
|
这样ComputeNode只是作为所有资源中的一个ResourceProvider,所有的资源提供者都是作为平等的ResourceProvider参与调度和资源管理,并且支持动态添加资源类型。
2.并发调度
之前的并发调度
之前的版本中多个调度节点之间没有同步机制,每个调度节点每次调度时直接从数据库获取资源视图,计算匹配的目标,这样导致各个节点之间资源视图不能及时更新,有延后性。只能通过CompudeNode中ResourceTracker的资源锁和rescheduler来保证资源的最终一致。
Pike并发调度
在新的资源管理下,调度成功后会将消耗的资源记为一个Allocation并写入数据库,在写入数据库时利用’compare and update’策略实现同步,保证只有在有资源的情况下Alloction才更新成功,选择的目标才有效。原理如下。
|
|
通过事物保证每次Allocation的数据库操作的原子性。获取资源视图和更新资源视图时,通过generation来保证资源一致。总的调度逻辑如下:
|
|
(完)