9分钟阅读

使用sorreTrators进行数学时间:将微野型应用程序缩放

Antoine已经为微服务建筑做了Devops,因为Docker in Beta并帮助设计了用于Cryptobox的生态系统。

微服务应用架构继续入侵软件设计并不令人惊讶。分发负载是更方便的,创建高度可用的部署,并在宽松开发和团队管理时管理升级。

但如果没有集装箱管理员,这个故事肯定不一样。

它很容易使用 他们所有的主要功能,特别是自动缩放。它是多么祝福,观看集装箱部署整天波动,轻轻尺寸以处理当前负载,释放我们的其他任务。我们为我们的集装箱监测工具显示出了自豪地满意;同时,我们刚刚配置了几个设置 - 是的,那就是(几乎)所花款的全部来创建魔法!

这并不是说没有理由为此感到骄傲:我们确信我们的用户具有良好的体验,而且我们不会浪费任何带有超大基础设施的钱。这已经很相当相当大!

当然,到达那里的旅程是什么!因为即使在最后没有那些需要配置的设置,因为即使需要配置多种设置,它比我们在我们开始之前通常会想到的那么艰难。最小/最大副本,高档/低级阈值,同步周期,冷却延迟 - 所有这些设置都非常捆绑在一起。修改一个人最有可能影响另一个,但您仍然必须安排一个适合您的应用程序/部署和基础架构的平衡组合。然而,您不会在互联网上找到任何食谱或任何魔法公式,因为它高度取决于 你的 needs.

我们中的大多数人首先将它们设置为“随机”或默认值,我们根据我们在监视时发现的内容进行调整。这让我想:如果我们能够建立更多的“数学”程序,那么有助于我们找到获胜的组合吗?

计算容器编排参数

当我们考虑应用程序的自动缩放微缩服务时,我们实际上正在研究两个主要观点:

  1. 确保部署可以 速度快 在快速加载的情况下(因此用户不面对超时或HTTP 500S)
  2. 降低成本 基础设施(即,保持载入的实例)

这基本上意味着优化容器软件阈值以缩放和缩放。 (Kubernetes.'算法对这两个的单个参数))。

我稍后会显示所有实例相关参数都与Upscale-thresholl相关联。这是计算的最难计算 - 因此,这篇文章。

注意:关于集群集的参数,我对它们没有任何好的程序,但在本文的末尾,我将介绍一台软件(静态网页),在计算时将它们考虑在帐户中一个实例的自动缩放参数。这样,您将能够改变他们的价值来考虑其影响。

计算缩放阈值

对于此方法的工作,您必须确保您的应用程序符合以下要求:

  1. 负载必须是 均匀分布在各个例子中 您的申请(以循环方式)
  2. 请求时间必须短于容器群集的 负载检查间隔.
  3. 您必须考虑运行该过程 大量用户 (defined later).

这些条件的主要原因来自算法不计算负载的事实 每个用户 但作为分布(后来解释)。

得到所有高斯

首先,我们必须为a制定一个定义 快速负荷增加 或者,换句话说,一个最坏的情况。对我来说,翻译的好方法是: 拥有大量用户在短时间内执行资源消耗操作 - 当另一组用户或服务正在执行其他任务时,始终存在它的可能性。所以让我们从这个定义开始并尝试提取一些数学。 (准备好你的阿司匹林。)

引入一些变量:

  • $ n_ {u} $,“大量用户”
  • $ l_ {u}(t)$,由单个用户生成的负载执行“资源消费操作”(用户开始操作时的$ t = 0 $点)
  • $ l_ {tot}(t)$,总负载(由所有用户生成)
  • $ t_ {tot} $,“短时间”

在数学世界中,谈论大量用户在同一时间执行同样的用户,用户随着时间的推移分发遵循a 高斯(或正常)分布,其公式是:

\ [g(t)= \ frac {1} {\ sigma \ sqrt {2 \ pi}} ^ {\ frac { - (t- \ mu)^ 2} {2 \ sigma ^ 2}} \]

这里:

  • µ 是预期的价值
  • σ 是标准偏差

它绘制如下(以$μ= 0 $):

高斯分布的图表,显示了99.7%的地区之间的落在加上三分之三

可能让人让人想起一些你没事的课程。但是,我们在此处面临着我们的第一个问题:在数学上准确,我们必须考虑从$ - \ idty $到$ + \ idty $的时间范围,这显然无法计算。

但是看了图表,我们注意到间隔$ [ - 3σ,3σ] $外的值非常接近零,并且不会变化很大,这意味着它们的效果实际上可以忽略不计,可以放在一边。这更真实,因为我们的目标是测试缩放我们的应用程序,因此我们正在寻找大量用户的变体。

此外,由于间隔$ [ - 3σ,3σ] $包含99.7%的用户,它足够接近,总共对它进行工作,我们只需要将$ n_ {u} $乘以1.003来弥补区别。选择此间隔给出US $μ=3σ$(因为我们将从$ t = 0 $工作)。

关于与$ t_ {tot} $的对应,选择它等于$6σ$($ [ - 3σ,3σ] $)不会是一个很好的近似,因为95.4%的用户处于间隔$ [ - 2σ,2σ] $,持续$4σ$。所以选择$ t_ {tot} $等于$6σ$将增加一半的时间,只有4.3%的用户,这不是真正代表的。因此,我们选择取$ $ {tot} =4σ$,我们可以推断:

\(Σ= \ frac {t_ {tot}} {4} \) and \(μ= \ frac {3} {4} * t_ {tot} \)

那些刚从一顶帽子拉出的价值吗?是的。但这就是他们的目的,这不会影响数学过程。这些常量适合我们,并定义与我们的假设相关的概念。这只意味着现在我们拥有它们,我们最糟糕的情况可以被翻译为:

负载产生的$ 99.7%$ n {u} $,执行消费操作$ l {u}(t)$,其中95.4%在持续时间$ t {tot} $。

(这是在使用Web应用程序时值得记住的东西。)

将以前的结果注入用户分发功能(高斯),我们可以简化等式如下:

\ [g(t)= \ frac {4 n_ {u}} {t_ {tot} \ sqrt {2 \ pi}} e ^ \ frac { - (4t-3t_ {tot})^ 2} {t_ {tot } ^ 2} \]

从现在开始,拥有$Σ$和$μ$界定,我们将在[0,\ frac {tot}] $(持续6美元$)中的时间间隔$ t \。

总用户加载是什么?

自动缩放微服务中的第二步是计算$ l_ {tot}(t)$。

自$ g(t)$以来 分配,要在某个时间点检索用户数,我们必须计算其积分(或使用其累积分发功能)。但由于并非所有用户同时启动他们的操作,因此尝试将$ L_ {U}(t)$介绍一个真正的混乱,并将方程缩短为可用公式。

所以要使这更容易,我们将使用 riemann Sum.,这是一种使用有限之和近似于小形状的积分(我们将在此处使用矩形)的数学方法。成形越多(细分),结果越准确。使用细分的另一个好处来自于我们可以在分区中考虑所有用户在同一时间开始运营的事实。

返回riemann sum,它具有以下属性与Integrals连接:

\ [\ \ int_ {a} ^ {b} f(x)dx = \ lim_ {n \ lightarrow \ idty} \ sum_ {k = 1} ^ {n}(x_ {k} - x_ {k-1}) f(x_ {k})\]

$ x_k $定义如下:

\ [x_ {k} = a + k \ frac {b - a} {n},0 \ leq k \ leq n \]

这是真的在哪里:

  • $ n $是细分的数量。
  • $ a $是下限,这里为0。
  • $ b $是界限,这里$ \ frac {3} {2} * t_ {tot} $。
  • $ f $是函数 - 这里$ g $ - 近似其区域。

函数G的riemann和曲线图。X轴从T-Sub-Tot的零到三半开始,并且突出显示单个矩形显示's在x-sub-k-minus-1和x-sub-k之间。

注意:在子区域中存在的用户数不是整数。这是两个先决条件的原因:具有大量用户(因此小数部分不会过于撞击),并且需要负载在每个实例上均匀分布。

另请注意,我们可以在Riemann和定义的右侧看到细分的矩形形状。

现在我们有riemann求和公式,我们可以说,时间$ t $的负载值是每个分区的每个子数量的总和乘以用户加载功能 他们的相应时间。这可以写作:

\ [l_ {tot}(t)= \ lim_ {n \ lightarrow \ infty} \ sum_ {k = 1} ^ {n}(x_ {k} - x_ {k-1})g(x_ {k}) l_ {u}(t - x_ {k})\]

替换变量并简化公式后,这将成为:

\ [l_ {tot}(t)= \ frac {6 n_ {u}} {\ sqrt {2 \ pi}} \ lim_ {n \ lightarrow \ infty} \ sum_ {k = 1} ^ {n}(\ Frac {1} {n})e ^ { - {(\ frac {6k} {n} - 3)^ {2}}} l_ {u}(t - k \ frac {3 t_ {tot}} {2n })\]

voilà.!!我们创建了负载功能!

找到扩展阈值

要完成,我们只需要运行一种二分法算法,这些算法改变了阈值,以找到每个实例的负载永远不会超过其在负载函数上的最大限制的最高值。 (这是应用程序所做的。)

推导其他编排参数

一旦您找到了大规模的阈值($ s_ {up} $),其他参数很容易计算。

从$ s_ {up} $您将知道您的最大实例数。 (您还可以查找负载功能上的最大负载,并按照每个实例的最大负载划分,舍入。)

必须根据您的基础架构定义实例的最小数字($ n_ {min} $)。 (我建议每az至少有一个副本。)但是还需要考虑到负载功能:随着高斯函数迅速增加,负载分布在开始时更加激烈(每副本),所以你可能希望增加靠垫的最小副本数量这一效果。 (这很可能会增加$ S_ {UP} $。)

最后,一旦确定了最小副本数量,就可以考虑以下内容($ s_ {down} $)考虑以下内容:由于缩放单个副本对其他实例没有更多的效果,而不是从下降时缩放$ n_ {min} + 1 $至$ n_ {min} $,我们必须确保在缩放后不会触发比例阈值。如果它允许,这将有一个yo-yo效果。换句话说:

\ [(n_ {min} + 1)s_ {down}< N_{ min }S_{ up }\]

或者:

\[S_{ down } <\ frac {n_ {min}} {n_ {min} +1} s_ {up} \]

此外,我们可以承认,群集配置越长,在缩放之前等待,它将将$ S_ {Down} $更接近更高限制。再次,您将不得不找到适合您的平衡点。

Note that when using the Mesosphere Marathon orchestration system with its autoscaler, the maximum number of instances that can be removed at once from scaling down is tied to AS_AUTOSCALE_MULTIPLIER ($A_{mult}$), which implies:

\[S_{ down } <\ frac {s_ {up}} {a_ {mult}} \]

用户加载功能怎么样?

是的,这是一个问题,而不是数学上最简单的问题 - 如果它甚至可能。

为了解决此问题,该想法是运行应用程序的单个实例,并增加重复执行相同任务的用户数量,直到服务器负载达到其被分配的最大值(但不超过)。然后除以用户数量并计算请求的平均时间。使用要集成到用户加载功能的每个操作重复此过程,添加一些时间,以及您是。

我知道此过程暗示,考虑到每个用户请求在其处理中具有恒定的负载(这显然是不正确的),但是用户的质量将创建此效果,因为它们中的每一个都不同时为同一处理步骤创建此效果。所以我猜这是一个可接受的近似,但它再次暗示你正在处理大量的用户。

您也可以尝试使用其他方法,如 CPU火焰图。但我认为创建一个准确的公式将非常困难将用户操作链接到资源消耗。

介绍这一点 app-autoscaling-calculator

现在,对于整个中提到的小型Web应用程序:它需要输入您的负载函数,容器Orchestrator配置以及其他一些常规参数,并返回比例阈值和其他与实例相关的数字。

该项目是 在Github上托管,但它也有 可用的现场版本 .

以下是Web应用程序给出的结果,违反测试数据(在Kubernetes上):

一个图表显示了随时间的实例数量和负载数

缩放微服务:在黑暗中不再颤抖

谈到微服务应用架构时,容器部署成为整个基础架构的中心点。并配置了Orchestrator和Containers的越好,运行时的更顺畅将是。

我们在领域的人 Devops Services 始终为我们的应用寻求调整Orchestration参数的更好方式。让我们采取更多的数学方法来自动缩放微源!

理解基础知识

如何提高Web应用程序的可扩展性?

使用微服务架构被认为是最大化可扩展性的最佳实践。

微服务架构真的是什么意思?

MicroServices是可独立部署的应用程序的集装箱组件。

为什么我们需要微服务架构?

除了使大应用更容易测试和维护外,使用微服务应用程序架构通常是允许可靠,动态缩放的唯一方法。此外,可以响应于用户负载自动完成缩放微服务。

什么是容器编排?

Container Orchestration是指在一组服务器集群上协调微ervices运行时。其中一个主要功能是应用程序的自动缩放。