最后更新:2020-04-09 11:42:57 手机定位技术交流文章
部署需要在速度和可靠性之间保持谨慎的平衡。在Slack,我们专注于快速迭代、快速反馈循环和对客户反馈的响应。我们有数百名工程师,他们都在努力提高工作效率。在公司发展的同时保持这些价值意味着我们的部署系统需要不断改进。为了适应工作量,我们必须增加对可见性和可靠性的投资。本文将概述我们的部署过程和一些关键项目,这些项目将使我们能够实现我们的目标。
部署流程
每一个松弛的PR都需要代码审查和所有的测试通过。一旦满足这些条件,工程师就可以将他们的代码合并到master中。但是,合并后的代码将仅在北美工作时间部署,以确保我们有足够的人员来处理任何意外问题。
我们将每天进行大约12次计划部署。在每次部署期间,我们将任命一名工程师作为部署指挥官,将新的构建推进到生产环境中。这是一个多步骤的过程,以确保构建缓慢地在线推进,这样我们就可以在错误影响每个人之前找到它们。如果错误激增,这些构建可以回滚,如果我们在发布后发现问题,我们可以轻松地进行热修复。
创建发布分支
在每次发布的开始,都会有一个新的发布分支,这是我们Git历史中的一个点。我们可以在此时标记发布,我们也可以在这里修复发布过程中发现的问题。
部署到暂存版本
下一步是将构建部署到临时服务器,并运行自动烟雾测试。登台是不接受公共交通的生产环境。我们在临时环境中进行了额外的手动测试,因为它可以确保代码更改在更大程度上正常工作,而不是只在开发环境中进行测试。
部署到狗食环境和金丝雀环境
向生产领域的推广从狗粮环境开始,狗粮环境是一组服务于我们内部Slack工作空间的主机。由于我们也是非常活跃的Slack用户,狗粮环境部署可以帮助我们发现许多问题。一旦我们确信核心功能没有改变,我们将把构建部署到加那利环境,在那里大约2%的生产流量被路由。
基于百分比的生产促销
如果所有指标保持稳定且没有警报,我们将继续在百分比基础上将它们推广到生产环境中。我们以10%、25%、25%、50%、75%和100%的增量分解部署,以缓慢地将生产流量暴露给新构建,同时给我们时间来调查任何峰值或异常情况。
如果在部署过程中出现问题怎么办?
修改代码总是会带来风险,但我们已经培训了部署指挥官来观察各种指标,并与推动代码的工程师合作。
万一出现任何问题,我们的目标是尽快找到问题。我们将调查问题,找出导致问题的公共关系并恢复它。在恢复过程中,我们需要仔细选择,然后建立一个新的。然而,有时我们找不到问题。在这种情况下,恢复服务非常重要,然后我们将立即回滚到以前的版本,然后开始调查问题的原因。
基础
快速部署
事后看来,上面描述的工作流可能是显而易见的,但是我们的部署系统经历了多次迭代来实现这个目标。
当公司规模很小时,我们的整个应用程序可以在10个亚马逊EC2实例上运行,而部署对所有服务器来说只是快速响应。在推向生产环境之前,只有一个过程:分段环境。构建完成后,将在登台系统上对其进行验证,然后直接与所有生产服务器进行rsync。该系统易于理解,任何工程师都可以随时部署自己的代码。
但是,随着客户数量的增加,运行应用程序所需的基础架构数量也会增加。很快,基于推的部署模型将无法应对。每增加一台服务器都会增加部署时间。甚至像并行rsyncs这样的策略也有其局限性。
最后,我们通过切换到完全并行的拉模式系统解决了这个问题。当领事密钥改变时,每台服务器将同时获取当前版本,而不是使用同步脚本将新版本推送到服务器。这使我们能够保持高部署速度,同时继续扩展规模。
原子部署
为分层部署铺平道路的另一个项目是原子部署。
在原子部署之前,每个部署都会导致一系列错误,因为将新文件复制到生产服务器的过程不是原子的。这将产生一个小的时间窗口,新函数的调用点将出现在该窗口中。当调用这些调用站点时,它们将返回内部错误,表现为API请求失败和网页失败。
围绕这个问题的团队通过使用热目录和冷目录解决了这个问题。在准备冷目录时,热目录将服务于生产流量。在部署期间,新代码将被复制到未使用的冷目录中。然后,一旦服务器的活动进程耗尽,我们将立即切换目录。
强调可靠性
2018年,我们遇到了一个问题,那就是部署速度越快越不利于我们产品的稳定性。我们有一个非常强大的部署系统,但是部署过程必须不断发展。随着我们成为一家更大的公司,为全球越来越多的关键任务协作提供动力,可靠性已成为我们的核心。
对可靠性的需求促使我们对部署系统进行全面的改造,从而形成了前面描述的基于百分比的部署系统。在幕后,我们继续使用快速部署和原子部署,但是我们已经改变了部署方法。整个系统是按级别变化的,加上更好的监控和工具,这使我们能够在bug影响所有用户之前找到并减轻它们。
然而,这不是最终的形式。我们仍在通过更好的工具和自动化来改进系统。今后请注意更多关于这些方面的文章。
原文
https://slack.engineering/deploys-at-slack-cd0d28c61701
本文由高度可用的体系结构翻译。对于技术原创和建筑实践的文章,请通过公共数字菜单联系我们提交。
高可用性架构
改变互联网的构建方式
本文由 在线网速测试 整理编辑,转载请注明出处。