这篇文章不是关于K8s - 也不是关于AWS。它不是关于容器 - 对于管理大型应用的一些新的“酷”技术也不是关于一些新的。相反,这篇文章是关于我们如何部署高度复杂的Java服务,这是一项繁重的服务,即每天都非常积极开发,全球7个数据中心的1000多台服务器。
那么问题是什么呢?获取服务器列表,让版本部署并使用像ansible这样的自动化工具运行还不够吗?
好吧,这并不像看起来那么简单。该服务提供Taboola的建议,每秒响应数十万个请求。服务必须快——快到它的p95应该低于每请求500毫秒。这意味着我们根本不能有任何停机时间,甚至不能承受更慢的响应。
此外,防止安装故障版本是至关重要的。错误的版本可能导致停机或降级性能,这可以直接导致收入损失。出于这个原因,我们在开发期间有多个测试网关 - 帮助防止糟糕的版本。但是,根据我们的经验,有时当软件符合生产时,会发生意外(不好)的事情 - 我们需要准备预防。另一个重要要求是在办公时间部署,当大多数工程师都可以帮助时出现问题。
那么我们该怎么做?
在接下来的文章中,我将解释我们如何在Taboola部署推荐服务。本文将一步一步详细介绍部署流程。
第1阶段:今天是部署日吗?
我们想要做的第一件事是检查今天是部署日。要求是在工作时间部署,因此如果它是一个周末或假期,我们跳过部署。
第2阶段:今天的版本有效吗?
今天是部署日,我们想知道代码是否有效,是否会导致任何生产问题。这就是为什么我们的第一步金丝雀试验.在这个阶段,我们将新版本部署到全球7个数据中心的一台机器上。服务准备好后,我们让它运行一个小时的真实流量。我们在那一小时集合各种指标-从新部署的服务器,以及一个旧版本的服务器。这些服务器必须具有相同的硬件规格;此外,我们还重新启动旧版本,以确保环境尽可能地平等。时间一到,我们就比较结果。每个指标都有一个定义良好的阈值。如果新收集的度量在这些阈值的边界内,我们可以继续到下一个阶段。如果新版本“行为不当”,我们会停下来,通知相关开发人员并分析问题。在分析之后,我们仍然可以选择两种方式:中止部署(将自动发生)或手动批准。
来自金丝雀测试的度量比较示例
阶段3:数据中心验证-第1部分
新版本似乎是可以的 - 至少我们可以在1小时内验证 - 我们决定继续部署。但是,我们仍然希望“玩它安全”。输入第3阶段:数据中心验证。我们只开始缓慢部署一我们的数据中心。第一数据中心由生产工程师仔细选择。它必须在该特定地理区域的高峰时段之外,但仍然有足够的流量让我们验证。
在单个数据中心的部署过程是这样的:
- 获取要部署的服务器列表
- 计算服务器批的大小(见下面)
- 对于批处理中的每个服务器
- 沉默所有的警报
- 停止旧版本并删除它
- 安装新版本
- 开始服务
- 验证服务是否已正确启动
- 避免所有警报
- 运行批处理验证以检查域的各种度量标准
- 等待下一个服务器批处理的一分钟
- 重复直到没有服务器
当数据中心的部署完成时,我们输入验证阶段 - 但首先,让我们回到计算服务器批处理的计算。
让我们做一些数学
如上所述,在部署新版本时,我们不希望影响在适当的响应时间(<= 500毫秒)内为请求提供服务的能力。因此,我们开发了一个公式,它将告诉我们可以从数据中心的池中取出多少台服务器,而不会造成“噪音”。公式是这样的:
在哪里:
- X是我们目前停止的服务器的数量。
- S.是数据中心中的功能服务器的总量。
- Rtotal是数据中心的总要求。
- RTavg是每个请求的平均响应时间。
- RTMAX.是响应时间的临界限制。
- 线程是我们每台服务器使用的线程量。
当我们得到X时,我们将其正常化,这样我们就不会在非高峰时间停止太多的服务器——或者在高峰时间停止太少的服务器。
批量大小计算从6月3日到6月10日
阶段3:数据中心验证-第2部分
好的 - 我们部署了第一个数据中心,现在我们想要验证它是否正确行为。我们暂停部署一小时并执行多个检查。重要的是:
- 检查响应时间是否没有增加。
- 检查服务器日志是否包含不寻常的错误。
无论部署流如何,定期监视这些度量。为了更快地捕获生产问题,我们将这些检查纳入流量。
此时出现的任何问题都将引发警报并暂停流,直到手动批准或手动或自动中止。
第4阶段:全部新版本
当我们从第一个数据中心部署和验证获得“绿灯”时,流程将自动继续并行部署其余数据中心。
用6个步骤交付价值和质量
想要建立自己的部署过程吗?我们建议实施以下步骤:
- 持续测试你的代码——尽管还没有提到,代码检查是强制性的,单元测试和集成测试是代码验证的关键部分。
- 收集指标 - 两者都是部署和生产服务 - 一直都是。
- 构建一个可以使用实际数据/流量验证生产中的新代码的进程。与收集的指标进行比较。
- 定义部署的正确速度 - 您可能希望它是动态的。为您的特定需求弄清楚正确的步伐。
- 不断验证新代码不会破坏任何内容。
- 不断提高。
如果您有疑问,建议或评论,请随时联系我@tizkiko.
好运!
技术使用
关于我们用来构建流的工具的说明。该服务是用Java编写的,并打包为rpm。部署流的逻辑是用它编写的詹金斯管道,主要是Groovy对shell命令的一些调用(yum安装,例如)。我们用格拉纳和普罗米修斯用于监控和指标。
我想借此机会感谢Taboola公司发布工程和生产工程队伍帮助建立了这个伟大的过程。