《分布式技术原理与算法解析》学习笔记Day10
调度框架:单体调度
什么是调度?
分布式系统架构的目的是将多个服务器资源管理起来,对外提供服务。调度是指为用户任务寻找合适的服务器的过程,它是分布式系统中一个非常重要的组件,提供了多种调度策略,负责完成具体的调度工作。
什么是单体调度?
分布式系统中的单体调度是指一个集群中只有一个节点在运行调度进程,该节点对集群中的其他节点具有访问权限,可以对其他节点的资源信息、节点状态进行统一管理,同时根据用户下发的任务对资源的需求,在调度器中进行任务和资源匹配,然后根据匹配结果将任务指派给合适的节点。
单体调度器具有全局资源视图和全局任务,可以实现对任务的约束并实施全局性的调度策略。
在单体调度框架中,多个Node节点会将本节点的State上报给Master节点。Master节点将Node State信息记录在Cluster State模块中,Cluster State模块用于管理集群中节点的资源等状态。Master节点中的Scheduling Logic模块用于进行Tasks与节点资源的匹配。当Master需要下发任务时,Cluster State模块会将节点的资源状态传送给Scheduling Logic模块,以便Scheduling Logic模块进行Tasks与资源匹配,并根据匹配结果将Task发送给匹配到的节点。
具体结构和流程如下图。
单体调度的特征:
- 单体调度器可以很容易实现对作业的约束并实现全局性的调度策略,因此适合作为批处理任务和吞吐量较大、运行时间较长的任务。
- 单体调度系统的状态同步比较容易且稳定。
- 调度算法只能全部内置到核心调度器当中,因此调度框架的灵活性和可扩展性不高。
- 单体调度存在单点故障发生的可能性。
Borg调度设计
Borg是典型的集中式集群管理系统,Scheduler是它的核心组件。
Borg系统中包括作业(Job)和任务(Task):
- 作业:它通常包括作业名称、作业生产者和作业包含的任务数量,它可以有一些约束来限制作业中的任务运行在指定的机器上,这些约束可以是刚性的,也可以是柔性的。一个作业只能在一个集群中运行。
- 任务:一组Linux进程,运行在一台机器上的一个容器内或者直接运行在节点上。
一个作业可以包含多个任务,作业类似于用户在一次事务处理或计算过程中要求计算机所做工作的总和,而任务就是一项具体的工作。
多个任务可以在多台机器上同时运行,从而提高系统的并行程度,调度器会来负责将任务分配给合适的机器。
Borg中的调度是以任务为单位的,不是以作业为单位。
Borg调度算法的核心思想是“筛选可行,评分取优”。它分为两个阶段:
- 可行性检查:找到一组可以运行任务的机器。
- 评分:从可行的机器中选择一个合适的机器。
两种不同的匹配算法:
- 最差匹配算法:将任务尽量分散到不同的机器上,以并行的方式提高任务执行的速度,它的问题在于每个机器都会有少量无法使用的剩余资源,称为”碎片资源“。
- 最佳匹配算法:把同一个机器上的任务塞得越满越好,这样可以空出一些空闲的机器,用于部署计算资源需求大的任务。它类似于”把所有鸡蛋放到一个篮子里“,当对应的服务器发生故障后,运行在这台服务器上的任务会受影响。它不利于有突发负载的应用。
一般来说,对于资源紧缺,且业务流量比较规律,基本不会出现突发情况的场景,可以选择最佳匹配算法, 如果资源比较丰富,且业务流量会经常出现突发情况的场景,可以选择最差匹配算法。
Borg的任务部署机制支持优先级高的任务抢占优先级低的任务资源,如果评分算法选中的机器上没有足够的资源来运行新任务,Borg会抢占该机器上已部署的低优先级任务的资源,从最低优先级的任务开始,逐级向上抢占任务资源,直到可用资源足够运行新任务。其中,被强占的任务会放回到调度器的等待队列中。