分布式系统调度架构,底层原理分析与实战
ccwgpt 2024-10-12 02:51 21 浏览 0 评论
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题
昨天分享了分布式系统架构中的单体调度架构,并且详细的学习了相关调度算法(「分布式技术」分布式系统调度架构之单体调度,非掌握不可),虽然单体调度架构简单易用,但是它是落在中央处理器中的,所以也就有了单机瓶颈问题,这样对于一些多类型的服务就会受限。
正是因为单体调度的一些缺陷,所以聪明的程序员们就想出了一个两层调度来解决这种问题。
什么是两层调度?
两层调度就是将资源和任务分开调度,也就是说其中一层调度器做资源的管理和分配,另一层调度器则负责任务与资源的匹配。
资源的使用状态同时由中央调度器和第二层调度器管理,中央调度器从全局上进行资源的管理和分配,然后将资源分配到第二层调度器,接着第二层调度器就可以进行任务和资源的匹配。所以第二层是可以有多个调度器的,用来支持不同类型的任务,比如CPU密集型的以及io密集型的任务。
如上图所示,scheduler-1就是第一层中央调度器,主要负责收集和管理集群中资源信息;上面的scheduler-2就是第二层调度器
- scheduler-1将收集的集群资源信息发给scheduler-2。
- scheduler-2根据任务需要的资源情况和scheduler-1发送来的资源信息进行相关匹配和调度。
第一层调度器依然是一个经简化的中央调度器,一般是放在分布式集群管理系统中的,而第二层调度器是由我们各个应用程序框架完成。这两层调度器的职责分别是:
- 第一层调度器负责管理资源同时像框架去分配资源
- 第二层调度器接收第一层调度器分配来的资源,然后根据实际任务情况和收到的资源进行匹配
有哪些项目都采用了两层调度结构呢?这样的集群管理系统很多,其中较为典型就是 Apache Mesos 和 Hadoop YARN。下面我们就以Mesos为例,来一起学习下两层调度的架构设计以及它的分配算法。
两层调度的原理
Mesos 它是负责底层资源的管理和分配,但并不涉及存储以及任务调度的相关功能,所以,如果它要实现类似Brog 那样的资源和任务管理,还需要一个上层框架的配合。
Mesos 自己实现的调度器就是第一层调度,负责集群资源管理,接着将第二层任务调度工作交给我们的上层框架来完成,下面我们就来具体看看怎么实现的。
两层调度架构设计
通过上面我们已经知道了,其实以Mesos 为基础的分布式资源管理与调度框架应该包含两大部分,Mesos 资源管理集群和框架。
- 资源管理集群是由一个Master节点和多个Slave 节点而组成的一种集中式系统。其中每个集群有且仅有一个Master节点,负责管理slave节点,且对接框架。slave节点定期像 master 节点上报资源状态信息,并执行框架提交任务。
- 框架,运行在Mesos 上,是负责应用管理和调度的组件,比如 Hadoop,Spark,MPI等,不同的框架用来完成不同的任务。框架主要由调度器 Scheduler 和执行器 Executor 组件组成,scheduler可以从Master 节点获取资源信息,Executor 就在slave 节点上执行任务。
如上图所示,Mesos Master 有个调度器 Allocation Module 即为第一层调度。框架上负责任务的管理与调度的调度器,则为第二层调度。
通过上面我们应该很清楚了两层调度的工作模式了,那下面我们就来看看 Messos 两层调度的基本原理。
- 框架向 Mesos Master 中注册。
- Mesos Slave 节点向Master节点定期的上报自己的空闲资源信息。
- Mesos Master 中scheduler 进程收集所有节点的空闲资源信息,并以 Resource Offer的方式将空闲资源发送给注册来的框架。
- 框架的 Scheduler 接收到Mesos 发来的资源信息后,就进行任务调度和匹配,匹配成功后,就将匹配结果下发给 Mesos Master,然后mesos master 就会转发给对应节点的 executor 进行执行任务。
可见,Mesos 实现两层调度时,采用Resource Offer 机制来衔接第一层和第二层调度。Resouce Offer 是指 Mesos Master 主动将空闲资源以发放 Offer的方式发给框架,框架自身如果需要就使用,不需要就返回。
即通过 Resource Offer 机制,第一层调度将资源主动告知第二层调度,然后第二层调度进行具体的任务匹配,从而实现了任务调度与资源管理的分离,Mesos Master 通过资源分配算法决定给各个 Framework 提供多少资源,而 Framework 则决定接受哪些资源,以及哪些任务使用这些资源运行。这样一来,一个两层调度架构就实现了。
接下来我们就来看看第一层调度是怎么将空闲资源发给框架的,是通过什么算法实现的。
资源分配算法
Mesos 的资源分配算法解决的问题是,将当前空闲资源分配给哪些框架以及分配多少给框架,其最重要的资源分配有两种算法:
- 最大最小公平算法(Max- minFairness,MMF)
- 主导资源公平算法(Dominant Resource Fairness,DRF)。
1 最大最小公平算法
首先,我们看看最大最小公平算法,这是一种在兼顾公平的前提下,尽可能让更多人满意的资源分配算法。为什么这么说呢?因为这个算法有 3 个主要原则:
- 按照用户对资源需求量递增的顺序进行空闲资源分配;
- 不存在用户得到的资源超过自己需求的情况;
- 对于分配的资源不满足需求的用户,所获得的资源是相等的。
在执行资源分配时,最大最小公平算法按照上述 3 条原则进行多次迭代,每次迭代中资源均平均分配,如果还有剩余资源,就进入下一次迭代,一直到所有用户资源得到满足或集群资源分配完毕,迭代结束。
接下来,我们通过一个具体的例子来看看最大最小公平算法的资源分配流程吧。
假设,现在有总量为 100 的空闲资源,有 4 个用户 A、B、C、D 对该资源的需求量分别为(35,10,25,45),分配流程如下所示:
- 按照用户对资源的需求量升序排列,则 4 个用户的需求量为(B:10,C:25,A:35,D:45)。
- 平均分配空闲资源。资源空闲总量 100,除以用户数 4,则平均空闲资源量为 25;按照第一步中需求量分配后,用户资源需求量为(0,0,10,20),且用户 B 由于资源需求量小于 25,因此会剩余资源。此时空闲资源量为 15,资源需求人数为 2。
- 重复第二步,平均分配资源,15/2=7.5,即分别为用户 A 和 D 分配 7.5 份资源,此时用户资源需求量为(0,0,2.5,12.5),空闲资源量为 0,资源需求人数为 2。
- 所有资源已分配完,算法终止。
最大最小公平算法的执行流程,如下图所示。