高尺度服务部署:Taboola推荐的流程

发布者

这篇文章不是关于K8s - 也不是关于AWS。它不是关于容器 - 对于管理大型应用的一些新的“酷”技术也不是关于一些新的。相反,这篇文章是关于我们如何部署高度复杂的Java服务,这是一项繁重的服务,即每天都非常积极开发,全球7个数据中心的1000多台服务器。

那么问题是什么呢?获取服务器列表,让版本部署并使用像ansible这样的自动化工具运行还不够吗?

好吧,这并不像看起来那么简单。该服务提供Taboola的建议,每秒响应数十万个请求。服务必须快——快到它的p95应该低于每请求500毫秒。这意味着我们根本不能有任何停机时间,甚至不能承受更慢的响应。

此外,防止安装故障版本是至关重要的。错误的版本可能导致停机或降级性能,这可以直接导致收入损失。出于这个原因,我们在开发期间有多个测试网关 - 帮助防止糟糕的版本。但是,根据我们的经验,有时当软件符合生产时,会发生意外(不好)的事情 - 我们需要准备预防。另一个重要要求是在办公时间部署,当大多数工程师都可以帮助时出现问题。

那么我们该怎么做?

在接下来的文章中,我将解释我们如何在Taboola部署推荐服务。本文将一步一步详细介绍部署流程。

第1阶段:今天是部署日吗?

我们想要做的第一件事是检查今天是部署日。要求是在工作时间部署,因此如果它是一个周末或假期,我们跳过部署。

第2阶段:今天的版本有效吗?

今天是部署日,我们想知道代码是否有效,是否会导致任何生产问题。这就是为什么我们的第一步金丝雀试验.在这个阶段,我们将新版本部署到全球7个数据中心的一台机器上。服务准备好后,我们让它运行一个小时的真实流量。我们在那一小时集合各种指标-从新部署的服务器,以及一个旧版本的服务器。这些服务器必须具有相同的硬件规格;此外,我们还重新启动旧版本,以确保环境尽可能地平等。时间一到,我们就比较结果。每个指标都有一个定义良好的阈值。如果新收集的度量在这些阈值的边界内,我们可以继续到下一个阶段。如果新版本“行为不当”,我们会停下来,通知相关开发人员并分析问题。在分析之后,我们仍然可以选择两种方式:中止部署(将自动发生)或手动批准。

指标比较报告

来自金丝雀测试的度量比较示例

阶段3:数据中心验证-第1部分

新版本似乎是可以的 - 至少我们可以在1小时内验证 - 我们决定继续部署。但是,我们仍然希望“玩它安全”。输入第3阶段:数据中心验证。我们只开始缓慢部署我们的数据中心。第一数据中心由生产工程师仔细选择。它必须在该特定地理区域的高峰时段之外,但仍然有足够的流量让我们验证。

在单个数据中心的部署过程是这样的:

  1. 获取要部署的服务器列表
  2. 计算服务器批的大小(见下面)
  3. 对于批处理中的每个服务器
    1. 沉默所有的警报
    2. 停止旧版本并删除它
    3. 安装新版本
    4. 开始服务
    5. 验证服务是否已正确启动
    6. 避免所有警报
  4. 运行批处理验证以检查域的各种度量标准
  5. 等待下一个服务器批处理的一分钟
  6. 重复直到没有服务器

当数据中心的部署完成时,我们输入验证阶段 - 但首先,让我们回到计算服务器批处理的计算。

让我们做一些数学

如上所述,在部署新版本时,我们不希望影响在适当的响应时间(<= 500毫秒)内为请求提供服务的能力。因此,我们开发了一个公式,它将告诉我们可以从数据中心的池中取出多少台服务器,而不会造成“噪音”。公式是这样的:

批量大小公式

在哪里:

  • X是我们目前停止的服务器的数量。
  • S.是数据中心中的功能服务器的总量。
  • Rtotal是数据中心的总要求。
  • RTavg是每个请求的平均响应时间。
  • RTMAX.是响应时间的临界限制。
  • 线程是我们每台服务器使用的线程量。

当我们得到X时,我们将其正常化,这样我们就不会在非高峰时间停止太多的服务器——或者在高峰时间停止太少的服务器。

批量尺寸图形

批量大小计算从6月3日到6月10日

阶段3:数据中心验证-第2部分

好的 - 我们部署了第一个数据中心,现在我们想要验证它是否正确行为。我们暂停部署一小时并执行多个检查。重要的是:

  • 检查响应时间是否没有增加。
  • 检查服务器日志是否包含不寻常的错误。

无论部署流如何,定期监视这些度量。为了更快地捕获生产问题,我们将这些检查纳入流量。

此时出现的任何问题都将引发警报并暂停流,直到手动批准或手动或自动中止。

第4阶段:全部新版本

当我们从第一个数据中心部署和验证获得“绿灯”时,流程将自动继续并行部署其余数据中心。

用6个步骤交付价值和质量

想要建立自己的部署过程吗?我们建议实施以下步骤:

  1. 持续测试你的代码——尽管还没有提到,代码检查是强制性的,单元测试和集成测试是代码验证的关键部分。
  2. 收集指标 - 两者都是部署生产服务 - 一直都是。
  3. 构建一个可以使用实际数据/流量验证生产中的新代码的进程。与收集的指标进行比较。
  4. 定义部署的正确速度 - 您可能希望它是动态的。为您的特定需求弄清楚正确的步伐。
  5. 不断验证新代码不会破坏任何内容。
  6. 不断提高。

如果您有疑问,建议或评论,请随时联系我@tizkiko.

好运!

技术使用

关于我们用来构建流的工具的说明。该服务是用Java编写的,并打包为rpm。部署流的逻辑是用它编写的詹金斯管道,主要是Groovy对shell命令的一些调用(yum安装,例如)。我们用格拉纳普罗米修斯用于监控和指标。

我想借此机会感谢Taboola公司发布工程生产工程队伍帮助建立了这个伟大的过程。

立即启动您的Taboola职业生涯!