导读:最近,在谷歌工作近十年的高级软件工程师Onufry,以Brog为例,讲解了Google 这样的大公司里如何设计与建造超大规模的软件系统。Borg 是谷歌设计的一个集群管理器,它负责对来自于几千个应用程序所提交的 job 进行接收、调试、启动、停止、重启和监控,这些 job 将用于不同的服务,运行在不同数量的集群中,每个集群各自都可包含最多几万台服务器。Borg 的目的是让开发者能够不必操心资源管理的问题,让他们专注于自己的工作,并且做到跨多个数据中心的资源利用率最大化。

根据我的经验,大多数的超大规模系统都拥有以下特点:

  • 都是从一个相对较大的、较复杂的、但还不算是超大规模的系统内核开始做起。
  • 随着需求的快速迭代,该系统的复杂度显著增大,并且局部的逻辑也变得复杂起来。
  • 随后在一些高级工程师的带领下,对系统进行多次的大规模重构,这些高级工程师通常对该系统有更多的了解。

我对一些超大规模的系统有过较深入的了解,在这些超大规模的系统中,最著名的莫过于谷歌的 Borg 系统了。从部署方面来看,Borg 系统几乎涵盖了谷歌所有的数据中心;从复杂度方面来看,Borg 系统估计是从 2000 年开始开发一直持续发展到现在这样子的。因此无论从“部署“还是“复杂度”方面 Borg 系统都算得上是超大规模系统。

大而复杂的系统内核

与大多数复杂的系统一样,Borg 最初的设计理念也是十分复杂的,但其实远没有今天这么复杂。起初它的核心思想可以简单用一页文字来描述。简要总结如下:

  • 我们希望能够自动地、动态地将所有的任务调度到由数千台独立机器组成的机器单元中。
  • 调度工作将由一个中央的“主服务器”完成,它负责维护整个机器单元的运行状态(作为主副本复制状态)。
  • 待工作的任务将指定它们对 CPU、磁盘和内存的要求,以及它们的优先级。“主服务器”将利用该优先级对所有的任务进行合理的排序,暂时腾出低优先级任务的资源给高优先级的任务使用。
  • 我们将采取超额预定资源的机制,将低优先级的任务放入那些虽然被高优先级任务预定但是还未使用的资源中。
  • 对任务资源占有量的评估,以及对超额配置所导致的资源短缺问题的响应,将由一台机器上的代理(Borglet)来完成,该代理需要拥有超级用户的权限。

其他更多关于 Borg 系统的细节信息此处省略不讲。至此我已经可以在长达一个小时的讲座中向计算机科学专业的同学讲述完 Borg 系统的所有基本思想。

该项目最初的想法可能是十年前由那些拥有 WorkQueue 工作经验的工程师提出来的,他们起初就已经清楚地知道自己想要实现的系统是什么样的。

添加更多的需求

随后就出现了系统需求的大规模增长。同时也添加了 SSD 作为一种额外的资源。即便后来证明最初的假设是错误的,即如果一个机械硬盘发生故障,那么所有使用该机械硬盘的任务都应该被认为是处于死亡状态。因此该系统中便添加了允许幸存磁盘丢失的代码路径,以用来重新调度资源,更好的组织机器单元。

此外,也围绕“主服务器”和 borglet 的核心思想构建了新的生态系统,它是一个内部检查的工具,也是一款配置语言。它可以自动化预测任务对资源的需求,而不再需要人们在配置中手动输入,同时还可以用来配额管理系统、跨机器单元调度,以及更多其他的功能,在这其中的每个功能都是为了满足特定需求而构建的。

最终,系统也在我们的开发过程中得到了改进。最初每隔一秒计算一次的资源核算机制逐渐被基于系统内核的机制(cgroups)所取代。另外,我们的用户也抱怨道,当系统有错误出现时,他们并不能完全理解他们所看到的内容,因此我们便彻底的检查了之前所有的错误提示,并对错误提示进行了大幅改进。在 Borg 系统的“主服务器”和 borglet 级别添加了只读的用户界面展示,然后随着系统的改进,最终构建出了可以跨机器单元的用户界面展示。

所有的这些都是在拓展 Borg 的主要系统或功能,也都将使其规模变得更大,系统变得更加复杂,尽管它们并不一定能使 Borg 系统变得更加深入。也就是说,你仍然可以仅仅通过对所有这些功能和想法的简单了解来推断其核心系统和API。

主要的重构

大多数从事 Borg 系统工作的初级工程师都不是很了解整个 Borg 系统。他们可能在 borglet(我工作的地方)工作,也可能拥有更加具体的工作,比如:Borg系统的内存管理系统,在该内存管理系统中添加新的功能。虽然他们对 Borg 系统的核心思想有过简单的了解,但他们可能从未接触过 Borg 系统真正的核心代码,更不用说任何独立的系统了。

然而,我认为这样一个超大规模系统的持续进步还是主要取决于几个高级工程师,他们相比之下更了解整个系统,也更加清楚系统的大部分功能是如何工作的,并且能够意识到,在新的要求和需求下,系统中的哪些部分会发生怎样的变化。如果由于某些原因导致系统的某些内容无法拓展,不论是由系统使用规模的极速扩大导致,还是由过多需求的增加导致系统的可维护性降低,最终可能都需要对该系统整体的体系结构进行大规模的重构来解决。

请注意,我们这里提到的 “高级工程师的全局重构” 和 “本地的代码重构” 之间的界限并不难分辨。这两种重构都会导致 Borg 系统发生许多变化,当然我们也可以分别为他们命名,它们其中也都可能包含有主要的架构的变化,比如:“主服务器”,将它的状态变为 Paxos,或者 Borglet 的变化。因此,我认为一个系统的全局体系架构的重构能力,对于这个庞大而复杂的系统是否能够持续保持增长至关重要,不过当然还是要保证系统在全局重构中不至于整体崩溃。

相关文章

Google 发布论文披露大规模集群管理工具 Borg 的细节

原文链接:https://www.quora.com/How-do-software-engineers-design-and-adapt-huge-systems-like-the-Google-search-engine-Facebook-or-Windows

Google 如何设计与构建超大规模的软件系统相关推荐

  1. 回归架构本真:从规划、思维到设计,构建坚不可摧的架构根基

    关于什么是架构,业界从来没有一个统一的定义.Martin Fowler在<企业应用架构模式>中也没有对其给出定义,只是提到能够统一的内容有两点: 最高层次的系统分解: 系统中不易改变的决定 ...

  2. python进阶项目设计_推荐系统进阶:设计和构建推荐系统流程综述(1)

    内容目录推荐系统应用场景概述 为什么需要推荐? 推荐系统的目标? 推荐系统的工作? 推荐系统的基本模型 构建推荐系统的方法 相关参考? 1.推荐系统概述以及它们如何提供有效形式的定向营销 推荐系统 推 ...

  3. Google AppSheet: 无需编程构建零代码应用

    Google AppSheet: 无需编程构建应用 原文地址:CSDN 博客 本文参考: AppSheet 产品设计 AppSheet 应用设计 101 文章目录 Google AppSheet: 无 ...

  4. 一文看懂RPA的技术原理、产品形态、设计与构建

    一文看懂RPA的技术原理.产品形态.设计与构建 过去的一年,RPA机器人流程自动化行业迎来了一个快速发展的机遇.RPA创业者得到了国内投资人的认可,一些RPA公司也接连拿到千万美金级别的融资,这在当下 ...

  5. Android的Google官方设计指南(上)

    Android 设计规范 本文章是我公司一个大牛之前的公司同事翻译的Android的Google官方设计指导,经过我整理而成,分享给大家,欢迎转载,但是请保留出处和翻译作者.本指导内容详实.规范,无论 ...

  6. 【凯子哥带你夯实应用层】Android的Google官方设计指南(上)

    Android 设计规范 时间 2015.3.2 版本 V1.0 翻译 杨鹏 整理 赵凯强 本文章是我公司一个大牛之前的公司同事翻译的Android的Google官方设计指导,经过我整理而成,分享给大 ...

  7. 《需求设计:构建用户想要和需要的产品》——3.7 品质

    本节书摘来自华章计算机<需求设计:构建用户想要和需要的产品>一书中的第3章,第3.7节,作者: [英] 克里斯·布里顿(Chris Britton) 更多章节内容可以访问云栖社区" ...

  8. [译文]Domain Driven Design Reference(三)—— 模型驱动设计的构建模块

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 其它本系列其它文章 ...

  9. 《需求设计:构建用户想要和需要的产品》——第1章 情境驱动设计入门1.1 对需求进行设计...

    本节书摘来自华章计算机<需求设计:构建用户想要和需要的产品>一书中的第1章,第1.1节,作者:[英] 克里斯·布里顿(Chris Britton) 更多章节内容可以访问云栖社区" ...

最新文章

  1. 返回顶部的js实现(jQuery/MooTools)
  2. [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
  3. Perl 正则表达式 html,使用正则表达式验证表单中的HTML字段使用perl
  4. GDCM:gdcm::Image的测试程序
  5. 数据结构:严蔚敏、殷人昆快速排序规则不同的疑问
  6. 【简洁易懂】Filter的四种拦截方式
  7. WebClient UI create a hidden form and submit
  8. 荣耀8获吉尼斯世界纪录!18425米高空直播体验
  9. Java将对象保存到文件中/从文件中读取对象
  10. 【排序算法】冒泡排序
  11. jspx框架使用总结-页面开发
  12. metasploit中用shodan模块进行网络摄像头查找
  13. “快充”还是感觉慢,到底是什么原因?
  14. 谷歌浏览器插件被禁用 浏览器组策略配置
  15. python入门基础笔记
  16. 用matlab求 矩阵每一列的平方和 最小值及其下标
  17. 软件开发中的《清单革命》
  18. 采访 | 苹果菲尔·席勒:Face ID非常独特 其他家的人脸识别都很糟糕
  19. 攀登者张梁将出席深圳户外展宣传登山文化,讲述18年登山探险史
  20. 单片机显示原理(LCD1602)

热门文章

  1. [转载] HTML所有标签及其属性汇总
  2. Vue.js 学习笔记 十二 Vue发起Ajax请求
  3. Java匹马行天下之学编程的起点——走进编程的殿堂
  4. Spring注解浅入浅出——不吹牛逼不装逼
  5. 数据库查询·聚合分支格式化日期·思维导图要点误点(含示例)
  6. PHP语言、浏览器、操作系统、IP、地理位置、ISP
  7. (转)C++ 库汇总(网址+简介)
  8. ASP.NET MVC Url中参数过长引发的问题
  9. WindowsAPI概览
  10. catkin_make:Project ‘cv_bridge‘ specifies ‘/usr/include/opencv‘ as an include dir, which is not fo