实现一个虚拟机调度器

最近离职在家休息一段时间,正好可以总结下在私有云构建过程中,虚拟机调度器的实现。

1. 背景

   需要基于第三方构建一个私有云系统,要求该系统提供虚拟机的自动化调度能力:即在IaaS层实现应用的打散部署(考虑宿主机、机架等)、超卖限制资源最优分配等功能。

2. 设计

  1) 架构图

  如图,调度系统由宿主机资源池、调度器、CMDB三个部分组成:

  宿主机资源池,可以理解为一个IDC,提供了一个很大的物理机集群,这些物理机配置一般都很高,作为宿主机提供虚拟化能力;

  调度器,调度系统的最核心模块,它负责找出调度最优解,同时维护宿主机的元信息、宿主机和虚拟机的映射关系;

  CMDB,数据存储层,存储应用、机器等信息,确保数据的正确性和一致性。

  2) 调度器

  调度器由两个基本算法组成:过滤算法和加权称重算法。过滤算法是指对宿主机进行硬性的条件过滤,最典型的例子就是在严格限制超卖的场景下,可以过滤掉那些硬件资源不满足要求的宿主机。过滤算法执行完后,我们就得到了能满足要求的所有宿主机列表,然后加权称重算法就派上用场了,系统会根据用户定义的指标对宿主机依次进行称重然后排序,找出最优的那台创建虚拟机。

3. 实现

  1) 数据存储

  数据可以存在MySQL或者Redis里面,我们这里采用关系型数据库存储。主要涉及到两个表:宿主机信息表->host_state、虚拟机信息表->vm_info。前者存储宿主机的硬件信息(cpu_available、rack_id等)、是否被禁用(is_disable)等;后者存储虚拟机的信息,包括归属应用、宿主机id;虚拟机和宿主机之间通过宿主机id做关联,为多对一的关系。

  2) 代码设计(基于Python)

  主要类:HostManager、Scheduler、FilterHandler、WeigherHandler以及各种定制的过滤器和称重器。

  其中HostManager负责管理宿主机状态,提供过滤、称重宿主机列表的方法,它实例化后以组合的方式传入Scheduler类,最终由Scheduler类向外提供统一的API供外部程序使用。

  FilterHandler和WeigherHandler分别处理过滤和称重过程,若干过滤器和称重器则通过Python反射的方式按需加载。

  一个过滤器实现的例子(筛选出所有CPU核数满足要求的宿主机列表):

# 其中BaseHostFilter是虚拟基类,所有过滤器必须实现虚拟方法bool host_passes(),否则无法在FilterHandler进行过滤操作
class BaseCoreFilter(BaseHostFilter):

    def _get_core_allocation_ratio(self):
        return 1.0  # CPU超卖比,实际生产环境下应该通过配置文件加载便于随时调整,这里直接返回1默认不允许超卖

    def host_passes(self, host_state, spec_obj):
        """Return True if host has sufficient CPU cores.
     host_state: 宿主机信息对象
     spec_obj: 要创建的虚拟机信息对象
""" return (host_state.cpu_available * self._get_core_allocation_ratio() >= spec_obj.cpu

  一个称重器实现的例子:

# 同上,BaseHostWeigher也是虚拟基类,所有的称重器必须实现 int _weigh_object() 方法

class
HostShuffleWeigher(BaseHostWeigher): def _weigh_object(self, host_state, spec_obj): host_app_vm_cnt = db.session.query(func.count(VmInfo.id)).filter( VmInfo.app_name == spec_obj.app_name, VmInfo.host_id == host_state.id).first()[0] return -1 * host_app_vm_cnt # 注意这里为了尽量把同一个应用打散部署在不同的宿主机上(容灾),我们乘以了系数-1

 4. 参考文献

OpenStack Nova计算资源调度

美团点评容器平台HULK的调度系统

猜你喜欢

转载自www.cnblogs.com/mecforlove/p/10288144.html
今日推荐