分布式调度架构:单体调度

  • 前言
  • 什么是单体调度?
  • 单体调度设计
  • Borg 调度设计
  • Borg 调度算法
  • 知识扩展:多个集群 / 数据中心如何实现单体调度呢?
  • 总结

前言

通过云资源管理的集中式架构和非集中式架构,可以看出分布式系统架构的目的是,将多个服务器资源管理起来,寻找合适的服务器去执行用户任务。

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

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

当然不同的分布式架构的调度器原理也不一样,最常见或最直观的是单体调度,就是任务和分布式系统中的空闲资源直接进行匹配调度。调度器同时管理任务和资源。

什么是单体调度?

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

单体调度器拥有全局资源视图和全局任务,可以实现对任务的约束并实施全局性的调度策略。目前很多集群管理系统采用了单体调度设计,比如 Google Borg、Kubernetes 等。

如下图所示,图中展示了一个典型的单体调度框架。Master 节点上运行了调度进程(负责资源管理、Tasks 和资源匹配);Node 1,Node 2,…, Node N 对应着 Master/Slave 架构中的 Slave 节点。

Slave 节点会将 Node State 上报给 Master 节点的 Cluster State 模块,Cluster State 模块用于管理集群中节点的资源等状态,并将节点的资源状态传送给 Scheduling Logic 模块,以便 Scheduling Logic 模块进行 Tasks 与资源匹配,并根据匹配结果将 Task 发送给匹配到的节点。

单体调度设计

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

调度器本身在系统中以单实例形式存在,所有的资源请求和任务调度都通过这个实例进行。集中式调度器的常见模型,如下图所示,资源的使用状态和任务的执行状态都由调度器进行管理。

在 Borg 和 Kubernetes 这两个集群管理系统中,Scheduler 是它们的核心。而 Kubernetes 又是 Borg 的开源版本。以 Borg 为例展现它的调度器是如何设计的,才能保证在上万台机器规模的集群上,运行来自几千个不同应用的几十万个作业。

Borg 调度设计

调度是为作业或任务寻找合适的资源,作业或任务是调度的对象。

作业和任务的定义

  • 一个 Borg 作业的属性包括名称、拥有者和任务个数。作业可以有一些约束来强制其任务运行在有特定属性的机器上,比如处理器架构、操作系统版本、是否有外网 IP 地址等。这些约束可以是硬性的也可以是柔性的,其中柔性约束表示偏好,而非需求。一个作业只在一个集群中运行。

  • 一个任务对应的是一组 Linux 进程,运行在一台机器上的一个容器内或直接运行在节点上。任务也有一些属性,比如资源需求量、在作业中的序号等。

作业和任务的关系

  • 一个作业可以包含多个任务。作业类似于用户在一次事务处理或计算过程中要求计算机所做工作的总和,而任务就是一项项具体的工作,二者属于包含关系。

  • 一个作业中的任务大多有相同的属性,但也可以被覆盖 ,比如特定任务的命令行参数、各维度的资源(比如,CPU 核、内存、硬盘空间、硬盘访问速度、TCP 端口等)。

多个任务可以在多台机器上同时执行,从而加快作业的完成速度,提高系统的并行程度。而具体将哪个任务分配给哪个机器去完成,就是调度器要做的事儿了。

通过 Borg 的 Scheduler 组件理解 Borg 内部的任务调度流程。很多框架比如 Hadoop、Spark 等都是采用了单体调度设计,它们整体的思想类似。

Borg 的系统架构图:

Scheduler 负责任务的调度,当用户提交一个作业给 BorgMaster 后,BorgMaster 会把该作业保存到 Paxos 仓库中,并将这个作业的所有任务加入等待队列中。调度器异步地扫描等待队列,将任务分配到满足作业约束且有足够资源的计算节点上。

注意,调度是以任务为单位的,而不是以作业为单位。调度器在扫描队列时,按照任务的优先级从高到低进行选择,同优先级的任务则以轮询的方式处理,以保证用户间的公平,并避免队首的大型作业阻塞队列。

Borg 调度算法

Borg 调度算法的核心思想是“筛选可行,评分取优”,具体包括两个阶段:

  • 可行性检查,找到一组可以运行任务的机器(Borglet);
  • 评分,从可行的机器中选择一个合适的机器(Borglet)。

可行性检查:调度器会找到一组满足任务约束,且有足够可用资源的机器。比如,现在有一个任务 A 要求能部署的节点是节点 1、节点 3 和节点 5,并且任务资源需求为 0.5 个 CPU、2MB 内存。根据任务 A 的约束条件,可以先筛选出节点 1、节点 3 和节点 5,然后根据任务 A 的资源需求,再从这 3 个节点中寻找满足任务资源需求的节点。

注意,每个节点上的可用资源,包括已经分配给低优先级任务但可以抢占的资源。

评分:调度器确定每台可行机器的适宜性。Borg 根据某一评分机制,对可行性检查阶段中筛选出的机器进行打分,选出最适合调度的一台机器。

在评分过程中,可以制定多种评价指标,比如考虑如何最小化被抢占的任务数、尽量选择已经下载了相同 package 的机器、目标任务是否跨域部署、在目标机器上是否进行高低优先级任务的混合部署等。 根据不同的考虑因素,可以定制不同的评分算法。

常见的评分算法,包括 “最差匹配”和“最佳匹配” 两种:

“最差匹配”(worst fit) :Borg 早期使用修改过的 E-PVM 算法来评分,E-PVM 算法的核心是将任务尽量分散到不同的机器上。该算法的问题在于,它会导致每个机器都有少量的无法使用的剩余资源。

比如,现在有两个机器,机器 A 的空闲资源为 1 个 CPU 和 1G 内存、机器 B 的空闲资源为 0.8 个 CPU 和 1.2G 内存;同时有两个任务,Task1 的资源需求为 0.4 个 CPU 和 0.3G 内存、Task2 的资源需求为 0.3CPU 和 0.5G 内存。按照最差匹配算法思想,Task1 和 Task2 会分别分配到机器 A 和机器 B 上,导致机器 A 和机器 B 都存在一些资源碎片,可能无法再运行其他 Task。

“最佳匹配”(best fit):把机器上的任务塞得越满越好。可以“空”出一些没有用户作业的机器(它们仍运行存储服务),来直接放置大型任务。

比如,在上面的例子中,按照最佳匹配算法的思想,Task1 和 Task2 会被一起部署到机器 A 或机器 B 上,这样未被部署的机器就可以用于执行其他大型任务了。

但是,如果用户或 Borg 错误估计了资源需求,紧凑的装箱操作会对性能造成巨大的影响。比如,用户估计它的任务 A 需要 0.5 个 CPU 和 1G 内存,运行该任务的服务器上由于部署了其他任务,现在还剩 0.2 个 CPU 和 1.5G 内存,但用户的任务 A 突发峰值时(比如电商抢购),需要 1 个 CPU 和 3G 内存,初始资源估计错误,此时服务器资源不满足峰值需求,导致任务 A 不能正常运行。

所以说,最佳匹配策略不利于有突发负载的应用,而且对申请少量 CPU 的批处理作业也不友好,因为这些作业申请少量 CPU 本来就是为了更快速地被调度执行,并可以使用碎片资源。还有一个问题,这种策略有点类似“把所有鸡蛋放到一个篮子里面”,当这台服务器故障后,运行在这台服务器上的作业都会故障,对业务造成较大的影响。

在实践过程中,根据实际情况来选择更适宜的评分算法:

  • 对于资源比较紧缺,且业务流量比较规律,基本不会出现突发情况的场景,可以选择最佳匹配算法;
  • 资源比较丰富,且业务流量会经常出现突发情况的场景,可以选择最差匹配算法。

Borg 的设计是支持高优先级抢占低优先级任务的,如果评分后选中的机器上没有足够的资源来运行新任务,Borg 会抢占低优先级的任务,从最低优先级逐级向上抢占,直到可用资源足够运行该任务。被抢占的任务放回到调度器的等待队列里,而不会被迁移或使其休眠。

很多调度框架是支持用户根据自己的场景自定义调度策略的,比如优先级策略、亲和性策略、反亲和性策略等。

知识扩展:多个集群 / 数据中心如何实现单体调度呢?

单体调度是针对一个集群或一个数据中心的,当多个集群或多个数据中心,基于单体调度实现是集群联邦的概念了。

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

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

总结

单体调度是指一个集群中只有一个节点运行调度进程,该调度进程负责集群资源管理和任务调度,单体调度器拥有全局资源视图和全局任务。

单体调度的特征:

  • 单体调度器可以很容易实现对作业的约束并实施全局性的调度策略,因此适合批处理任务和吞吐量较大、运行时间较长的任务。
  • 单体调度系统的状态同步比较容易且稳定,这是因为资源使用和任务执行的状态被统一管理,降低了状态同步和并发控制的难度。
  • 调度算法只能全部内置在核心调度器当中,因此调度框架的灵活性和策略的可扩展性不高。
  • 单体调度存在单点故障的可能性。

单体调度器虽然具有单点瓶颈或单点故障问题,但因为其具有全局资源视图和全局任务,简单易维护,被很多公司广泛采用。Borg 集群管理系统,以及其开源版 Kubernetes 集群管理系统,使用的都是单体调度结构。

单体调度结构虽然结构单一,但是其调度算法可以扩展甚至自定义,可以根据业务特征,自定义调度策略,比如优先级策略、亲和性策略等。

分布式调度架构:单体调度相关推荐

  1. 分布式调度架构:共享状态调度

    分布式调度架构:共享状态调度 前言 什么是共享状态调度? 共享状态调度设计 Omega 调度架构 Omega 共享调度工作原理 知识扩展:单体调度.两层调度和共享调度的区别是什么? 总结 前言 在两层 ...

  2. 教你简单理解分布式与传统单体架构的区别

    教你简单理解分布式与传统单体架构的区别 原文:教你简单理解分布式与传统单体架构的区别 分布式是一种系统架构方式,而在分布式系统中一般基于中间件进行开发,消息中间件是分布式系统中比较核心的中间件之一.这 ...

  3. 云环境下大规模分布式计算数据感知的调度系统

    云环境下大规模分布式计算数据感知的调度系统 刘汪根1, 郑淮城1, 荣国平2 1 星环信息科技(上海)有限公司,上海 200233 2 南京大学软件学院,江苏 南京 210093 摘要:介绍了新的调度 ...

  4. [译]集群调度架构的变革 (四)

    原文地址:http://www.firmament.io/blog/... 混合架构 是最近出现的致力于通过组合单体或共享态的设计来解决全分布架构的缺点.一般这样做是ok的 - 比如,在Tarcil( ...

  5. 集群调度架构的变革 (二)

    二级调度架构 通过隔离资源获取与任务来解决这个问题.这样任务调度逻辑可以针对特定的应用,这也可以保持在集群间共享的能力.Mesos的集群管理在这方面是先驱, 同时YARN支持一部分功能.在Mesos, ...

  6. 获国际架构顶会ATC2021最佳论文!Fuxi2.0去中心化的调度架构详解

    简介: 近日,在国际体系架构顶会USENIX ATC2021上,阿里云飞天伏羲团队与香港中文大学合作的一篇论文<Scaling Large Production Clusters with Pa ...

  7. 华为云王楠楠:分布式云原生全域调度的技术和实践

    嘉宾 | 王楠楠   整理 | 小雨青年 出品 | CSDN云原生 2022年6月21日,在CSDN云原生系列在线峰会第10期"华为云HCDE专场暨分布式技术峰会"上,华为云分布式 ...

  8. agv调度matlab程序,一种分布式AGV调度方法及调度系统与流程

    技术领域 本发明涉及AGV调度技术领域,尤其是一种分布式AGV调度方法及调度系统. 背景技术: 目前,物流.仓库等需要大量货品搬运的情形,开始采用多个自动导引运输车(英文简称AGV)协同工作,无需人工 ...

  9. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  10. Linux系统进程调度——调度架构详细分析

    日期 内核版本 架构 作者 内容 2019-4-14 Linux-2.6.32 X86 Bystander Linux进程调度架构 1 调度器 1.1 概述 现代的操作系统是多任务的操作系统,硬件的处 ...

最新文章

  1. 脚本中echo显示内容带颜色显示
  2. 老谢oracle视频笔记_day02
  3. @value 静态变量_你理解 PHP 中的静态方法吗?
  4. 【20181026T2】**图【最小瓶颈路+非旋Treap+启发式合并】
  5. 标准错误处理机制——error
  6. linux安装软件时提示找不到镜像的问题:Couldn't resolve host 'mirrorlist.centos.org'
  7. Java POJO Bean 对象与 Web Form 表单的自动装配
  8. C++中对象初始化赋值是否需要调用operator=函数
  9. 微信小程序 首页弹出用户协议
  10. 架构真经深有体会、感触很深
  11. 每日一题: 第十四题
  12. UESTC878————温泉旅店(动态规划)
  13. swift class的虚函数表、扩展、@objc修饰、虚函数的派发方式研究
  14. FPGA自学11——以太网通信
  15. 使用SSH完成linux和windows之间的文件互传(linux端)
  16. 5G明确C波段频率使用规划的5层意义
  17. 在arm Cortex-A9开发板移植rtl8821au无线网卡并实现与外网通信
  18. 计算机加密恢复,系统小技巧:BitLocker密钥恢复二三事
  19. 如何用xp系统做服务器,xp系统如何做远程服务器呢
  20. 【机器学习】之机器学习方法的分类

热门文章

  1. 软件工程大学生职业规划书
  2. 恒生电子23届校招内推
  3. Word中批量插入图片,自动排版
  4. 机器学习-分类Classification
  5. Python str函数
  6. cad打开卡死_AutoCAD程序启动就卡死的修复工具(解决CAD启动卡死不动)V2.00 修正版...
  7. 计算机无法验证签名,计算机中win10/win7无法验证文件数字签名的解决方法
  8. JavaWeb企业在线文档管理系统
  9. XP安装SQL2000个人版
  10. Docker真实应用场景案例解析——ASSA ABLOY