分布式资源管理与调度

内容来自

  1. 极客时间专栏:《分布式技术原理与算法解析》
  2. Google集群管理系统Omega解析

分布式体系结构

集中式结构

由一台或多台服务器组成中央服务器,系统内的所有数据都存储在中央服务器中,系统内所有的业务也均先由中央服务器处理,由中央服务器统一进行资源和任务调度

  • Google Borg
  • Kubernetes
  • Mesos

非集中式结构

服务的执行和数据的存储被分散到不同的服务器集群,服务器集群间通过消息传递进行通信和协调。相比于集中式结构,非集中式结构就降低了某一个或者某一簇计算机集群的压力,在解决了单点瓶颈和单点故障问题的同时,还提升了系统的并发度,比较适合大规模集群的管理

  • Akka 集群
  • Redis 集群
  • Cassandra 集群

调度架构之单体调度器

单体调度器的特点是,资源的调度和作业的管理功能全部放到一个进程中完成,开源界典型的代表是Hadoop JobTracker的实现

缺点
扩展性差:首先,集群规模受限,其次,新的调度策略难以融入现有代码中,比如之前仅支持MapReduce作业,现在要支持流式作业,而将流式作业的调度策略嵌入到单体调度器中是一项很难的工作

优化方案
将每种调度策略放到单独一个路径(模块)中,不同的作业由不同的调度策略进行调度。这种方案在作业量和集群规模比较小时,能大大缩短作业相应时间,但由于所有调度策略仍在一个集中式的组件中,整个系统扩展性没有变得更好

调度架构之双层调度器

双层调度器仍保留一个经简化的中央式调度器,但调度策略下放到各个应用程序调度器完成。这种调度器的典型代表是Mesos和YARN

双层层调度器的职责分别是:第一层调度器负责管理资源并向框架分配资源,第二层调度器接收分布式集群管理系统中第一层调度器分配的资源,然后根据任务和接收到的资源进行匹配

缺点

  • 各个框架无法知道整个集群的实时资源使用情况

  • 采用悲观锁,并发粒度小
    拿Mesos来看,Mesos的资源调度器只会将所有资源推送给任意一个框架,等到该框架返回资源使用情况后,才能够将资源推动给其他框架,因此,Mesos资源调度器中实际上有一个全局锁,这大大限制了系统并发性

调度架构之共享状态调度器

该调度器将双层调度器中的集中式资源调度模块简化成了一些持久化的共享数据(状态)和针对这些数据的验证代码,而这里的“共享数据”实际上就是整个集群的实时资源使用信息, 典型代表有 Google 的 Omega、微软的 Apollo,以及 Hashicorp 的 Nomad 容器调度器

引入共享数据后,共享数据的并发访问方式就成为该系统设计的核心,例如Omega则采用了传统数据库中基于多版本的并发访问控制方式(MVCC),这大大提升了Omega的并发性

资源分配方式

两种资源分配方式

  • incremental placement
  • all-or-nothing

举例说明:一个任务需要2GB内存,而一个节点剩余1GB,若将这1GB内存分配给该任务,则需等待将节点释放另外1GB内存才可运行该任务,这种方式称为“incremental placement”, Hadoop YARN采用了这种增量资源分配的方式。
而如果只为该任务选择剩余节点超过2GB内存的节点,其他不考虑,则称为“all-or-nothing”,Mesos和Omega均采用了这种方式。

两种方式各有优缺点,“all-or-nothing”可能会造成作业饿死(大资源需求的任务永远得到不需要的资源),而“incremental placement”会造成资源长时间闲置,同时可也能导致作业饿死,比如一个服务需要10GB内存,当前一个节点上剩余8GB,调度器将这些资源分配给它并等待其他任务释放2GB,然而,由于其他任务运行时间非常长,可能短时间内不会释放,这样,该服务将长时间得不到运行。

总结

image.png
单体调度
由一个中央调度器去管理整个集群的资源信息和任务调度,也就是说所有任务只能通过中央调度器进行调度。
这种调度架构的优点是,中央调度器拥有整个集群的节点资源信息,可以实现全局最优调度。但它的缺点是,无调度并发性,且中央服务器存在单点瓶颈问题,导致支持的调度规模和服务类型受限,同时会限制集群的调度效率,适用于小规模集群

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

共享状态调度
多个调度器,每个调度器都可以看到集群的全局资源信息,并根据这些信息进行任务调度。相较于其他两个调度架构来说,共享状态调度架构适用的集群规模最大。

这种调度架构的优点是,每个调度器都可以获取集群中的全局资源信息,因此任务匹配算法可以实现全局最优性。但,也因为每个调度器都可以在全局范围内进行任务匹配,所以多个调度器同时调度时,很可能会匹配到同一个节点,从而造成资源竞争和冲突

虽然 Omega 的论文宣称可以通过乐观锁机制,避免冲突。但在工程实践中,如果没有妥善处理资源竞争的问题,则很可能会产生资源冲突,从而导致任务调度失败。这时,用户就需要对调度失败的任务进行处理,比如重新调度、任务调度状态维护等,从而进一步增加了任务调度操作的复杂度

总结分析如下表格
image.png