老肖有话说 | 基于 Google Borg 设计实现开源调度器

马上就要跨年啦,小数的心情和大家一样激动。一篇数人云CTO老肖的干货奉上,先干为敬!祝大家新年快乐!
站在巨人的肩膀上,可以看得多高,走得多远?本文告诉你答案——

数人云是一家容器开源技术驱动的创业公司。云计算发展至今,核心技术栈多与集群、分布式、容器等关键性技术息息相关,其中一个重要技术是调度器。如何解决资源调度问题就是今天我与大家分享的主要内容。

创业初衷

当前云计算技术栈首选OpenStack,它发展的非常成熟,国内企业已经默认Openstack为云计算基础设施套件。Openstack解决的是IaaS的问题,但是应用PaaS层存在很大真空。此时,数人云CEO王璞来自谷歌,正是想为中国企业提供类似谷歌PaaS的技术能力。

谷歌内部数据中心操作系统Google Borg,在2015年的技术轮文中被披露,但是此技术早在2000年左右谷歌就开始大量应用Google Borg系统。谷歌数据中心的应用和基础设施都是托管于Borg这个分布式系统。因为谷歌的开源策略只有论文,并不开放源代码,一直到现在我们也无法直接获取Borg的核心技术。当然谷歌对开源策略也不是一成不变的,从2015年开始,大家关注到谷歌也在走向开源,当前业界核心技术不开源出来,手上的东西不能被大众受用,仍然是一个很难维护的软件工程,这并不是谷歌期望的。

Swan的诞生

数人云在实践容器技术的过程中发现,容器编排调度优化是一件非常有意义的事情,调度器是关键技术问题。我们深入研究了Google的Borg,其实现技术本身并不难,难的是获取实战设计经验。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

对于一个分布式系统架构来说,必然有master/slave架构的组件。开源会通过Zookeeper来做一致性协调。所有调度器的逻辑是不应该放在分布式系统里。业务逻辑都是分出来的,可以应付企业复杂的逻辑需求。数人云要做的就是实现轻量级的容器编排调度引擎。

有了这个想法以后,数人云在GitHub上开放了Swan的项目。一个创新的企业,从第一行代码开始就要开放,越开放,越会受到更多人的探讨和关注,这也是长久以来我们得到的经验反馈,实际上我们得到了很多人对此项目的技术探讨。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

一个传统的容器调度是怎么操作的?谷歌的Borg系统不可能照搬,需要参考类似于Borg的集群系统——Apache的Mesos/Marathon,它与Borg是源于同一家的分布式系统。Apache的Marathon社区有一个默认的调度器,数人云想做一个功能更强大的调度组件。Marathon发展的过于缓慢,已经无法满足国内企业的需求,应该加快解决这些问题。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

Swan设计目标与Marathon是一样的,首先可以跑长服务的任务,可以跑数据库。对于应用的管理,容器管理的规模比较大,要重新考虑容器编排、滚动更新、升级等问题。复制的任务和固定性的任务,一个web的请求量增多,可以自动通知增加实例数量;量少的时候,可以自动缩小容量。如何实现?固定性的业务像数据库,这个调度系统是高可用的,可以跨数据中心,放到哪里都可以,这样才能管理超大规模的集群,这也是Borg系统设计的重要原则。

Swan的设计开发从一开始就是敏捷式开发。GitHub的开源项目,大量使用开源的集成测试工具,而且非常完善。作为创业公司,我们的目标非常清晰,因此做起来非常方便。

数人云规模不能与谷歌相比,如何做出一个类似的东西?国内工程师与国外工程师的能力是一样的,缺的是十几年的实践经验。通过谷歌的Borg论文,我们终于知道它的做法。不用很长时间,用一个月的时间我们就建构了一个原型。当然不是从头开始做,而是基于业界领先的开源软件的基础,站在巨人的肩膀上,实现起来并没有那么困难,主要缺少的就是实战经验和他们的设计思想,这是中国的工程师非常匮乏的,但是数人云可以通过GitHub这样的开源社区跟业界进行互动。

数人云的Swan项目是完全开放的,可以随时拿给全球的朋友看,他们会提出自己的想法,是非常好的参考。

四个核心概念

老肖有话说 | 基于 Google Borg 设计实现开源调度器

云计算发展到现在,OpenStack已经非常成熟了,在落地的过程中对应用的理解是什么?再也不可能是VM。因为VM已经把云计算的能力发挥到极限了,现在就需要对应用包装分发。2016年的发展表明,容器在注入OpenStack和虚拟化技术里,帮助云计算进入到下一个时代。所以,应用是一个非常重要的概念。

对于版本的概念怎么理解?它应该是一个东西,个人理解就是镜像,由版本仓库来管理。

什么是Slot?在实现复杂的动态的收缩时,首先给它固定好这些槽。比如有十台机器,每台机器跑30个容器。先把槽定好,后面就不用再动态分配,立刻知道容量规划有多少,非常方便。这是Swan设计中一点创新的概念。

Task其实是活的容器,或者说正在给用户提供服务的容器,它是可以被杀掉的。

这四个核心概念是我们从Google Borg抽取出来,再加上自身的理解。虽然Google Borg的paper是2015年才发布的,但它在十年前就已经有了,有了一些变化,数人云通过与谷歌的工程师交流,看了他们最新的Borg系统到底是什么样子,然后做出了设计。

Swan功能一览

Swan的功能,首先是应用管理,发布、删除、查看、应用。机器来了以后,自动通过调度器把所有资源划分,在发之前就知道能发多少,彻底改变了随机到机器上去试。因为一般的调度器都会写非常复杂的算法去试,这样的效率非常低。Swan先把资源平铺,再插入,这样的速度很快。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

第二个功能是健康检查。定期通过HTTP的接口获得应用的运行情况。应用有的时候会有抖动,原来的状态是失败的,可能会误报,最后调度器把它杀掉再换一个。在设计Swan的时候希望能够多试几次,并且参数可调。比如有时程序写的不好,健康检查如何处理等等,增加更多的灵活性。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

第三个功能是滚动更新。一般情况下,容器的滚动更新有一个问题,一个集群里的所有容器,不知道其部署位置,而大家都希望可以随便部署。下发完以后,滚动更新要知道它们的位置,不能更新错了。原来老的调度器随机更新,任意的杀。如果用户请求正在服务上,正好把它杀掉了,它需要再次尝试去处理。这是原来的调度器解决不了的难题。现在Swan给每个Task定义了一个编号,从0开始,每个调度器处理的Task都是固定的。

企业在更新应用的时候,从一个更新到十个,每次更新起一个服务的时候并不能保证每一个服务能真的成功。这时当前的调度器就是直接缩回去了,这是不合理的,没有试错的功能。另一个情况是第一次成功了,到第四个的时候失败了,再试一下,第四个又成功了,第五个失败了,第六个成功。因为集群系统是带冗余的,它会试错,这个时候是算它更新成功,还是更新失败呢?一般情况下是不会关心的。在谷歌的设计里,如果计数器达到3次,就会自动的缩回来。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

Swan在命名规范上做了一个设计,从0开头,然后是appname、username,这就是谷歌以Task为中心的理念。同时把命名规则和名字也植入到DNS里面,可以随便查。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

一容器一IP技术非常成熟,都是原生技术。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

高可用目前的方案非常多,现在均采用轻量级的方案,缺点是只有思想,没有实现,要自己实现Raft。因为要保存状态。业界有很多参考,也可以参考Swan的实现,如何把状态存到数据库里并且可update。

老肖有话说 | 基于 Google Borg 设计实现开源调度器

此外,Swan还具有多集群的管理、多集群的混合型搜索。

大家可以持续关注数人云的Swan项目(https://github.com/Dataman-Cl...),欢迎提出意见和建议。

相关推荐