2014年,优步开始迅速扩张。我们的平台从大约60个城市发展到春季的100个城市,然后在秋季发展到200个城市。与此同时,我们发展最快的城市都是最古老的城市。
随着平台工程师数量的增加,部署新代码的混乱程度也在增加。每个团队都使用自己的自定义shell脚本来指导其新版本microservices进入生产环境,使用特定于服务的工具手动监控它们。当升级主机出错时,工程师们会乏味地一次回滚一台机器。随着越来越多的工程师在优步服务上工作,这种体力劳动无法扩大规模,有时还会延长停机时间。
我们是如何学会每天持续部署的?我们开发了Micro Deploy(称为μ部署(Deploy,简称Deploy)是我们的内部部署系统,用于构建、升级和回滚Uber的服务。
每日部署流程
Uber工程师在他们的代码进入生产阶段后就开始使用Micro Deploy,也就是说,在代码经过审查、接受、通过所有单元测试并合并到存储库之后。首先,工程师在μDeploy界面中选择要升级的服务。为了启动升级工作流,他们选择一个部署,并引用源代码的版本Git存储库。
在幕后,μDeploy根据需要构建服务,分发构建,与正确数据中心的相关主服务器通信,并让每个代理在标记为部署的主机上更新服务。在整个过程中,μDeploy用户界面提供关于部署状态的可视化反馈,直到工作流完成,以便工程师可以转移到另一个任务。
通过这种方式,μDeploy可以在几分钟内构建并推出大多数服务。这也是一个工程师能够多快地产生影响。
从工程师编写代码到Uber生产系统投入使用的过渡时间非常短。自从我们推出μDeploy的初始版本以来,Uber的增长并没有放缓。在2016年的每个星期,成千上万的工程师都在推动数以千计的服务构建,其中10%的服务在μDeploy监视后被拒绝,并将它们回滚到以前的版本。这意味着在工作时间内,Uber系统的某些部分每分钟都会开始升级。由于更新通常需要一分钟以上的时间,所以系统总是在更新到新版本的路上。
我们的使命:自信部署
Micro Deploy本身由许多微服务组成,其中大多数都使用μDeploy进行部署:
- web应用UI + CLI让工程师选择如何与μDeploy交互。
- μ部署代理在我们数据中心的每台机器上运行。代理根据其μDeploy主服务器的指示安装和重新配置服务。代理还将机器状态报告给管理员,并提供每个服务的完整概述。
- μ部署大师控制μDeploy代理如何在数据中心的所有机器上运行。每个数据中心至少有一个主服务器。
- μDeploy聚合器与每个数据中心中的主机进行接口,以管理整个部署。
- 我们称之为系统uBuild在单个uBuild机器集群中部署之前构建服务,然后将它们分发到所有数据中心。
- μ部署复制器在数据中心内部和数据中心之间复制最终版本。
- μ部署协调器以分布式和容错的方式管理推出工作流。
- μ部署位置定位用于部署服务的主机集。
- 我们称之为系统uConfig允许以与服务升级相同的方式推出服务配置更改。
部署系统中哪些特性是重要的?
这些特性的组合使Micro Deploy成为一个完整的构建和部署管理系统。以下是我们认为为Uber这样的基础设施系统开发部署系统的重要方面:
不同服务的一致构建.Micro Deploy是一个针对Uber各种服务的集成构建系统。巨蟒和龙卷风?JavaScript与Node.js?Go, Java,有Docker,没有容器?是的!μDeploy构建系统可以处理多种编程语言和不同软件栈的机器。我们的集成构建系统标准化了我们的生产服务部署。
升级零停机时间.Micro Deploy的全球逐步部署系统将相同版本的软件部署到不同角色和配置的多个数据中心。完全自动化的部署使任何工程师都可以在全球范围内对自己的服务进行更改。我们可以靠自己,在一起。
早期的自动错误检测.Micro Deploy集成了监控系统,可以及早发现异常。人们不必关注I/O性能的显著下降、未捕获的异常、HTTP错误代码或请求吞吐量和服务器负载问题。μDeploy通过这些监控数据确保系统在新版本发布过程中保持稳定。
停机预防.Micro Deploy使用监控数据在异常情况下停止构建并回滚到稳定版本。我们偶尔会看到误报,但小心总比后悔好。回滚是自动的,通常在所有主机拥有新版本之前很久就会发生。理想情况下,回滚发生在一个金丝雀区域,其中有足够小的一批机器,可以保护任何故障不受外部影响。在他们把我们关于最新开发测试的五分钟短片变成一部关于损害控制和机器挫败我们所努力的一切的故事片之前,我们必须控制住这些不守规矩的新增内容。
可靠的电.Micro Deploy高度可配置的工作流引擎编排了升级的各个阶段。作为一个分布式系统,μDeploy可以在升级过程中任何主机或机架(包括运行工作流的主机)意外关机的情况下存活。
易用性.Micro Deploy基于web的应用程序在一个富用户界面中公开了所有这些特性。任何工程师都可以通过浏览器访问μDeploy,并立即将其服务部署到生产环境中。
用于更深层次集成的REST API.微部署的休息API允许第三方工具集成其功能。
从使团到委员会
我们设计Micro Deploy是为了避免不必要的部署过程,并为正确地进行部署创造信心。如果没有,系统会快速地捕捉偶尔出现的bug升级,对生产的影响最小。这样,如果我们犯了一个偶然的错误,我们只是在运行系统。与Uber的许多其他主要工程项目一样,μDeploy在最初的几个月里被构思、实现,并投入生产。
经过两个月的开发,我们使用了Uber的第一个Micro Deploy服务,在前五个月的生产中,50%的服务都使用了μDeploy。这就是生产力!
截至2016年年中,Uber的后端是一个不断变化的、分布在多个数据中心的大规模分布式系统。我们的工程师现在分布在几个国家和大陆的十几个办事处。99%的Uber软件都带有μDeploy;那是A+!Micro Deploy为我们的工程师提供了速度、自主权和端到端所有权。工程师编写代码,审查,测试,并在同一天将其投入生产。
通过小型化,Micro Deploy极大地影响了我们的工程,我们很高兴在了解其他分布式技术公司如何管理其构建的过程中继续添加改进。建设者,继续建设!
Mathias Schwarz是Uber奥胡斯工程办公室的软件工程师,他与技术写作团队的Mrina Natarajan共同撰写了本文。








