调度框架:共享状态调度
什么是共享状态调度?
共享状态调度是为了解决单体调度和两层调度遇到的问题而创建出来的新的调度框架。它通过将单体调度器分解为多个调度器,每个调度器都有全局的资源状态信息,从而实现最优的任务调度,提供了更好的可扩展性。
共享装填调度将集群状态之外的功能抽象出来,形成独立的服务,包括:
- State Storage模块:负责存储和维护资源及任务状态,一遍Scheduler查询资源状态和调度任务。
- Resource Pool模块:多个节点集群,接收并执行Scheduler调度的任务。
- Scheduler模块:只包含任务调度操作。
共享状态调度框架如下图所示。
共享状态调度和两层调度相比的不同点:
- 存在多个调度器,每个调度器都可以拥有集群全局的资源状态信息,可以根据该信息进行任务调度。
- 乐观并发调度,执行了任务匹配算法后,调度器将其调度结果提交给State Storage,由其决定是否进行本次调度,从而解决竞争同一种资源而引起的冲突问题,实现全局最优调度。两层调度是悲观并发调度。
乐观并发调度和悲观并发调度的区别:
- 乐观并发调度:强调事后检测,在事务提交时检查是否避免了冲突,若避免,则提交,否则回滚并自动重新执行。
- 悲观并发调度:强调事前预防,在事务执行时检查是否会存在冲突,不存在,则继续执行,否则等待或者回滚。
有哪些系统采用了共享状态调度机制?
常用的有以下几种:
- Google Omega
- Apollo
- Nomad
Omega调度
Omega使用事务管理状态的设计思想,将集群中资源的使用和任务的调度类似基于数据库的一条条事务去管理。
Omega的调度流程如下图所示。
调度器对Job的调度是具有原子性的,一个Job中所有的Task都是一起调度的,即使部分Task调度失败了,调度器再次调度时必须调整整个Job。
Omega调度器将两层调度器中的集中式资源调度模块简化成一些持久化的共享数据和针对这些数据的验证代码。
三种调度机制有什么区别?
单体调度是由一个中央调度器去管理整个集群的资源信息和任务调度,它的优点是可以实现全局最优调度,缺点是调度没有并发性,且中央服务器有单点瓶颈问题。它适用于小规模集群。
两层调度是将资源管理和任务调度分为两层来调度,第一层调度器负责集群资源管理,并将可用资源发送给第二层调度,第二层调度收到第一层调度发送的资源,进行任务调度。它的优点是避免了单体调度的单点瓶颈问题,可以支持更大的服务规模和更多的服务类型。它适用于中等规模集群。
共享状态调度包含多个调度器,每个调度器都可以看到集群的全局资源信息。它的优点是每个调度器都可以获取集群中的全局资源信息,因此任务匹配算法也可以实现全局最优解。
下面是关于单体调度、两层调度和共享状态调度的详细比较。