论文研读
系列是阅读、总结计算机领域优秀论文的系列文章。由于论文的学术性较高,无法面面俱到,只会就关键思想进行概括介绍。
简介
Google的Borg集群系统需要管理数十万个jobs,要能够提高资源使用率、隔离性,通过调度策略降低关联故障发生率,通过声明式job描述语言简化复杂性。
Borg提供三个主要优势:
1.隐藏资源管理与故障处理的细节,用户可以集中在应用开发上2.高可用、高稳定3.O(10000)机器规模内高效任务调度
相关术语
1.job and task,一个job包含多个task,每个task包含多个进程
2.nameing and monitoring,通过borg name service
提供服务发现。每个task都要提供健康检查HTTP接口,用于查询task的健康信息和各种指标数据3.cluster and cells,cell表示一组机器,cell中的机器构成一个集群,cell是一个逻辑区分概念
整体架构
Borg系统主要由以下构成:
1.一系列机器2.本地中心化控制器Borgmaster
3.每台机器上运行的客户端Borglet
Borgmaster
Borgmaster包含两个组件:master进程和scheduler。master用于处理客户端的RPC请求,改变集群中的资源状态或者响应数据只读访问请求。master还负责管理系统中的状态(machines,task,allocs...),和Borglet通信,提供web UI。
在容错上,Borgmaster实际上有5个副本,逻辑上只有一个,通过Paxos协议选举逻辑上的leader。从选举leader到恢复数据大约要10s。master还会把自身某时刻的状态作为checkpoint存储到paxos store中。
scheduling
当提交job时,borgmaster将它记录到paxos store中,并加入到task的pending queue
。scheduler会扫描获取任务,然后调度到满足其需求的机器上。扫描过程是相对复杂的,论文中是这样说的:
the scan proceeds from high to low priority, modulated by a round-robin scheme within a priority to ensure fairness across users and avoid head-of-line blocking behind a large job.
自己目前还不是太理解。
调度算法分为两部分:
1.feasibility checking
,可行性检查,判断机器是否满足task的要求2.scoring
,通过对满足条件1中的机器打分,选择最合适的那个
这样一来,调度器的任务就是一个不断重复下面的流程:
1.从master抓取状态变更2.更新本地状态拷贝3.执行任务调度4.通知master自己的调度情况
整个过程就像有钱人的生活,枯燥又无味...
Borglet
Borgleft是每个机器(master除外)上都要运行的客户端,它负责任务的启动、停止、重启等,还负责管理机器资源、滚动debug日志、上报机器状态到master和监控系统。
Borgmaster会主动从Borglet上polls信息,poll的频率可控制,这样Borgmaster可以控制系统中的通信频率,避免不必要的流程控制机制。
为了性能和扩展性,每个Borgmaster会运行无状态的副本,论文中称为link shard
,来处理一些与Borglet的通信。在弹性方面,Borglet总是上报本节点的完整信息,link shard会对上报信息进行对比,只把不同的部分发送给状态机,降低master的更新负载。
当集群中的机器非常多时,Borg会把borglet分割为多个进行,提高吞吐量。
隔离
隔离可以保证安全性,在同一个机器上,通过chroot
机制隔离不同的task,提供ssh链接机制用于debug。
现在,Borg的task运行在基于Linux CGroup的资源容器中。
总结
Borg论文出自Google工程师,内容上还是更偏工程化
,和伯克利的ray、mesos论文相比,缺少学术性
和条理性
,阅读起来也不是那么顺畅。因此阅读两边后决定只记录部分重要的内容,一些细节没有罗列。
阅读完Borg的论文,再回头看Kubernetes的架构和相关概念,和Borg论文中的思想基本上是一致的。所以对于Kubernetes从业人员来说,这篇论文还是值得阅读的。