《分布式技术原理与算法解析》二-二:分布式资源管理与负载调度之分布式调度架构

从2-1中可以晓得分布式体系结构的目的是将多个服务器资源管理起来,寻找合适的服务器去执行用户任务。

那什么是合适的服务器呢?
衡量一个服务器是否合适会涉及很多条件或约束,比如在一些场景下,任务存在优先级,当需要执行多个任务的时候,通常需要满足优先级高的任务优先执行的条件,但在这些条件中,服务器资源能够满足用户任务对资源的诉求是必须的。

而为用户任务寻找合适的服务器这个过程,在分布式领域中叫作调度;
在分布式体系结构中,调度器就是一个非常重要的组件,它通常会提供多种调度策略,负责完成具体的调度工作。

1 单体调度

概念:

一个集群中只有一个节点运行调度进程,该节点对集群中的其他节点具有访问权限,可以搜集其他节点的资源信息、节点状态等进行统一管理,同时根据用户下发的任务对资源的需求,在调度器中进行任务与资源匹配,然后根据匹配结果将任务指派给其他节点

单体调度器拥有全局资源视图和全局任务,可以很容易地实现对任务的约束并实施全局性的调度策略

设计:

在集群管理中,单体调度模块称为“Scheduler”或“单体调度器”。单体调度器也叫作集中式调度器,指的是使用中心化的方式去管理资源和调度任务。

也就是说,调度器本身在系统中以单实例形式存在,所有的资源请求和任务调度都通过这个
实例进行。集中式调度器的常见模型

在这里插入图片描述

作业和任务:一个作业可以包含多个任务,一个作业中的任务大多有相同的属性,但也可以被覆盖 ,比如特定任务的命令行参数、各维度的资源(比如,CPU 核、内存、硬盘空间、硬盘访问速度、TCP 端口等);
多个任务可以在多台机器上同时执行,从而加快作业的完成速度,提高系统的并行程度。而具体将哪个任务分配给哪个机器去完成,就是调度器要做的事

场景:Hadoop、Spark、Borg

集群联邦:多个集群或多个数据中心,基于单体调度实现,如K8S

将多个集群联合起来工作,核心思想是增加一个控制中心,由它提供统一对外接口,多个集群的 Master 向这个控制中心进行注册;
控制中心会管理所有注册集群的状态和资源信息,控制中心接收到任务后会根据任务和集群信息进行调度匹配,选择到合适的集群后,将任务发送给相应的集群去执行

集群联邦的概念,其实就是单体调度的分层实现

优点:
单体调度器很容易就能实现对作业的约束并实施全局性的调度策略,因此适合批处理任务和吞吐量较大、运行时间较长的任务;
单体调度系统的状态同步比较容易且稳定,因为资源使用和任务执行的状态被统一管理,降低了状态同步和并发控制的难度

缺点:
调度算法只能全部内置在核心调度器当中,因此调度框架的灵活性和策略的可扩展性不高;
单体调度存在单点故障的可能性。

2 两层调度

单体调度的核心是所有节点的资源以及用户的任务均由中央服务器统一管理和调度。因此,中央服务器很容易成为单点瓶颈,会直接导致其支持的调度规模(资源不够)和任务类型受限(不同任务需要处理的数据不同,比如批处理任务是处理静态数据,流数据任务却是处理实时数据,单体调度框架会随着任务类型增加而变得越来越复杂,最终出现扩展瓶颈),于是出现了两层调度

概念:

把资源和任务分开调度,一层调度器只负责资源管理和分配,另外一层调度器负责任务与资源的匹配

资源的使用状态同时由中央调度器和第二层调度器管理,中央调度器从整体上进行资源的管理与分配,将资源分配到第二层调度器,再由第二层调度器负责将资源与具体的任务配对,因此第二层调度可以有多个调度器,以支持不同的任务类型

在这里插入图片描述

场景:Mesos、Hadoop

资源分配算法:决策需要将当前可用资源分配给哪些框架以及分配多少

  • 1 最大最小公平算法:在兼顾公平的前提下,尽可能分配让更多人满意的资源

流程:
1 按照用户对资源需求量递增的顺序进行空闲资源分配
2 不存在用户得到的资源超过自己需求的情况
3 对于分配的资源不满足需求的用户,所获得的资源是相等的

在执行资源分配时,最大最小公平算法按照上述 3 条原则进行多次迭代,每次迭代中资源均平均分配,如果还有剩余资源,就进入下一次迭代,一直到所有用户资源得到满足或集群资源分配完毕,迭代结束。

例子:假设有总量为 100 的空闲资源,有 4 个用户 A、B、C、D 对该资源的需求量分别为(35,10,25,45),分配流程如下所示:

  1. 按照用户对资源的需求量升序排列,则 4 个用户的需求量为(B:10,C:25,A:35,
    D:45)。
  2. 平均分配空闲资源。资源空闲总量 100,除以用户数 4,则平均空闲资源量为 25;按
    照第一步中需求量分配后,用户资源需求量为(0,0,10,20),且用户 B 由于资源
    需求量小于 25,因此会剩余资源。此时空闲资源量为 15,资源需求人数为 2。
  3. 重复第二步,平均分配资源,15/2=7.5,即分别为用户 A 和 D 分配 7.5 份资源,此时
    用户资源需求量为(0,0,2.5,12.5),空闲资源量为 0,资源需求人数为 2。
  4. 所有资源已分配完,算法终止。

在这里插入图片描述

缺点:采用了绝对公平的方式分配资源,会导致大量的资源浪费,比如用户需求量为 35 和 45 的用户 A 和用户 D,均分配了 32.5 的空闲资源,但由于资源不满足需求,这两个用户均无法使用

  • 2 主导资源公平算法

在考虑用户公平性的前提下,还考虑了用户对不同资源类型的需求,更合理地分配资源

首先计算已经分配给用户的每一种资源的占用率(Resource Share),比如已经分配的 CPU 占总资源量的多少,已经分配的内存占总资源量的多少;
所有资源占用率中的最大值称作该用户的主导资源占用率,而主导资源占用率对应的资源就是用户的主导资源

例子:

在这里插入图片描述

两种算法对比:
最大最小公平算法适用于单一类型的资源分配场景,主导资源公平算法适用于多种类型资源混合的场景;
最大最小公平算法从公平的角度出发,为每个用户分配不多于需求量的资源,主导资源公平算法从任务出发,目的在于尽量充分利用资源使得能够执行的任务越多越好。

  • 两层调度机制可以同时支持多个框架和多种类型的业务,但是如何保证这些业务运行时不会互相干扰?

当多个业务运行在同一台机器上,共同使用 CPU、内存,以及系统环境时会存在相互干扰,如果隔离不同的业务资源和环境,就不会存在相互干扰了;

在 Mesos 中,实现这种资源隔离的是容器:(Linux虚拟化机制)
容器的实质是进程,该进程运行于属于自己的独立的命名空间,可以拥有自己的 root 文件
系统、自己的网络配置、自己的进程空间,甚至是自己的用户 ID 空间;
所以说,Mesos 正是用容器隔离开了不同的业务,使得它们运行时不会互相干扰。

两层调度的缺点:
由于第二层调度只能获得部分资源视图,因此无法实现全局最优调度、也不能保证全局状态的一致性;
容易导致资源碎片问题

3 共享状态调度

第二层调度只知道集群中的部分资源,无法进行全局最优调度,可以通过共享状态调度解决

概念:

将单体调度器拆分为多个调度器,每个调度器都有全局的资源状态信息,实现了最优的任务调度,提供了更好的可扩展性

在这里插入图片描述

共享状态调度架构为了提供可用性和可扩展性,将集群状态之外的功能抽出来作为独立的服务:
State Storage 模块(状态维护模块)负责存储和维护资源及任务状态,以便 Scheduler查询资源状态和调度任务;
Resource Pool 即为多个节点集群,接收并执行 Scheduler 调度的任务;
Scheduler 只包含任务调度操作,而不是像单体调度器那样还需要管理集群资源等

共享状态调度也支持多种任务类型,但与两层调度架构相比,主要有两个不同之处:
1 存在多个调度器,每个调度器都可以拥有集群全局的资源状态信息,可以根据该信息进行任务调度;
2 共享状态调度是乐观并发调度:在执行了任务匹配算法后,调度器将其调度结果提交给State Storage,由其决定是否进行本次调度,从而解决竞争同一种资源而引起的冲突问题,实现全局最优调度;
而两层调度是悲观并发调度,在执行任务之前避免冲突,无法实现全局最优匹配。

乐观并发调度:
强调事后检测,在事务提交时检查是否避免了冲突:
若避免,则提交;
否则回滚并自动重新执行。也就是说,它是在执行任务匹配调度算法后,待计算出结果后再进行冲突检测。
悲观并发调度:强调事前预防,在事务执行时检查是否会存在冲突:
不存在,则继续执行;
否则等待或回滚。也就是说,在执行任务匹配调度算法前,通过给不同的 Framework 发送不同的资源,以避免冲突。

4 总结对比

  • 单体调度、两层调度和共享调度的区别是什么
    在这里插入图片描述
    单体调度:由一个中央调度器去管理整个集群的资源信息和任务调度,所有任务只能通过中央调度器进行调度;
    优点:中央调度器拥有整个集群的节点资源信息,可以实现全局最优调度
    缺点:无调度并发性,且中央服务器存在单点瓶颈问题,导致支持的调度规模和服务类型受限,同时会限制集群的调度效率;
    场景:小规模集群

两层调度:将资源管理和任务调度分为两层来调度,第一层调度器负责集群资源管理,并将可用资源发送给第二层调度;第二层调度接收到第一层调度发送的资源,进行任务调度。
优点:避免了单体调度的单点瓶颈问题,可以支持更大的服务规模和更多的服务类型;
缺点:第二层调度器只对全局资源信息有部分可观察性,因此任务匹配算法无法实现全局最优;
场景:中等规模集群

共享状态调度:多个调度器,每个调度器都可以看到集群的全局资源信息,并根据这些信息进行任务调度;
优点:每个调度器都可以获取集群中的全局资源信息,因此任务匹配算法可以实现全局最优性;
缺点:也因为每个调度器都可以在全局范围内进行任务匹配,所以多个调度器同时调度时,很可能会匹配到同一个节点,从而造成资源竞争和冲突;
在工程实践中,如果没有很好地处理资源竞争的问题,则很可能会产生资源冲突,从而导致任务调度失败;
这时,用户就需要对调度失败的任务进行处理,比如重新调度、任务调度状态维护等,从而进一步增加了任务调度操作的复杂度。(分布式锁、MVCC乐观锁)
场景:集群规模最大。
在这里插入图片描述

发布了236 篇原创文章 · 获赞 265 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41594698/article/details/105238841