Borg 是一个集群管理系统,类似闭源的k8s。

  • 通过准入控制、高效的任务装箱、超售、机器共享、以及进程级别的性能隔离,实现了高利用率。
  • 为高可用应用提供了可以减少故障恢复时间的运行时特性,以及降低关联故障概率的调度策略。
  • 提供声明式的作业描述语言、域名服务集成、实时作业监控、分析和模拟系统行为的工具。简化用户的使用。

文章本意在介绍系统设计的同时,讲述Google在背后的经验总结。但本文主要关心系统的设计,关注Borg对外提供的服务SLA,关注Borg对负载,资源,调度等方面的抽象。

系统抽象

工作负载上,主要有两种:一是长期运行的服务,二是批处理任务。分别对应两种类型的Job (prod / non-prod)。Job由若干Task组成,不同的Job拥有不同的优先级。

部署架构上,一个Borg Cluster由若干Cell组成,一个Cell由若干机器组成。

任务调度上,一切机器上有限的物理或者逻辑单元都需要被视为资源,如cpu,mem,io等资源。

系统架构

https://raw.githubusercontent.com/noneback/images/picgo/202401291404127.png

Master-Slave架构,由一个BorgMaster和若干Borglet节点组成,调度器是一个独立的服务。

BorgMaster是一个逻辑节点,负责与外部以及Borglet的交互,以及集群内状态的维护。利用Paxos实现多副本以及ha容错。

Borglet是Cell内没台机器的Borg Proxy。负责启停Task,管理Node的物理资源,上报状态。

Scheduler是负责进行Task调度的服务。使用Master中记录的状态,并基于此异步的去处理Task的调度,并告知Master二次判断。

资源调度

Scheduler是其中的很重要的核心服务。调度算法的好坏决定了资源的利用率,直接与使用成本关联。

基本流程

调度算法有两个部分:

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

在可行性检查阶段,调度器会找到一组满足任务约束且有足够可用资源的机器,其中可用资源包括已经 分配给低优先级任务但可以抢占的资源。

在评分阶段,调度器确定每台可行机器的适宜性。评分考虑了用户特定的偏好,但主要取决于内建的标准:例如最小化被抢占任务的个数和优先级,选择已经有该任务安 装包的机器,尽可能使任务分散在不同的供电和故障域,以及装箱(Packing)质量(在单台机器上混合 高、低优先级的任务,以允许高优先级任务在负载尖峰扩容)等。

调度器使用一份缓存的 Cell 状态拷贝,重复执行下面的操作:

  1. 从选举出来的 Master 获取状态变更(包括已分配的和等待中的工作);更新自己的本地拷贝。
  2. 执行一轮调度来分配任务;将分配信息发送给 Master。
  3. Master 会接受并应用这些分配,但如果分配不适合(例如,是基于过时的状态做出的),就会等待调度器的下一轮调度。

其他

文中还提到了如何提供售卖率以及性能争抢的问题,不过不是本文重点,可以参考一下原文。

Reference

https://www.cnblogs.com/hellojamest/p/16526159.html