

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用异常值检测进行故障检测
<a name="failure-detection-using-outlier-detection"></a>

当多个可用区由于*不相关*的原因出现错误率上升的情况时，前一种方法的缺陷就显现出来了。想象一下这样的场景：您的EC2实例部署在三个可用区，可用性警报阈值为 99%。然后，出现单个可用区损坏，隔离了许多实例，导致该区域的可用性降至 55%。同时，但在不同的可用区中，单个EC2实例会耗尽其EBS卷上的所有存储空间，并且无法再写入日志文件。这导致它开始返回错误，但它仍可以通过负载均衡器运行状况检查，因为这些检查不会触发写入日志文件。这导致该可用区的可用性降至 98%。这种情况不会激活单个可用区影响警报，因为您面临的可用性影响出现在多个可用区。但是，您仍然可以通过撤离受损的可用区来缓解几乎所有的影响。

在某些类型的工作负载中，您的各种可用区可能会一直出现错误，面对这种情况，之前的可用性指标可能无济于事。举 AWS Lambda 个例子。 AWS 允许客户创建自己的代码以在 Lambda 函数中运行。要使用该服务，您必须将代码上传到ZIP文件中，包括依赖项，并定义函数的入口点。但是有时客户会弄错这部分，例如，他们可能会忘记ZIP文件中的关键依赖关系，或者在 Lambda 函数定义中输入了错误的方法名称。这会导致函数调用失败并导致错误。 AWS Lambda 经常会看到这类错误，但它们并不表示任何事情都一定是不健康的。不幸的是，可用区损坏之类的因素也可能导致这些错误。

要从中发现运行状况不佳造成的错误，您可以使用异常值检测来确定各个可用区的错误数量在统计学上是否存在显著偏差。尽管我们发现多个可用区中出现错误，但如果其中一个可用区确实出现故障，预计该可用区的错误率会比其他可用区高得多，也可能低得多。但是高多少或低多少？ 

进行此分析的一种方法是使用[卡方检测](https://en.wikipedia.org/wiki/Chi-squared_test) (*χ*2) 来检测可用区之间错误率的统计学显著差异（[执行异常值检测有许多不同的算法](https://dataprocessing.aixcape.org/DataPreprocessing/DataCleaning/OutlierDetection/index.html)）。我们来了解一下卡方检验的工作原理。

卡方检验会评估可能出现的结果分布的概率。在本例中，我们对某些已定义集合中的错误分布感兴趣AZs。在此示例中，为了简化数学运算，我们使用四个可用区。

首先，建立*原假设*，定义您认为默认结果会是什么样。在此测试中，原假设是您期望错误在每个可用区中均匀分布。然后，生成*备选假设*，即错误分布不均匀，则表明可用区受损。现在，您可以使用指标中的数据来检验这些假设。为此，您要对指标进行采样，用时五分钟。假设您在这段时间获得 1000 个已发布的数据点，其中总共有 100 个错误。您预计，如果分布均匀，每个可用区的错误数量占 25%。假设下表是您的预期与实际结果的对比。

*表 1：预期错误与实际错误对比*


|  可用区  |  预期  |  实际  | 
| --- | --- | --- | 
| use1-az1 |  25  |  20  | 
| use1-az2 |  25  |  20  | 
| use1-az3 |  25  |  25  | 
| use1-az4 |  25  |  35  | 

您会发现现实中的分布是不均匀的。当然，您可能认为这是由于您采样的数据点存在一定程度的随机性所致。某种程度上，样本集中可能会出现这种类型的分布，仍假设原假设为真。这就引出了以下问题：获得至少如此极端的结果的概率是多少呢？ 如果该概率低于定义的阈值，则拒绝原假设。为具备[https://en.wikipedia.org/wiki/Statistical_significance](https://en.wikipedia.org/wiki/Statistical_significance)，该概率应为 5% 或更低。1 

1 Craparo, Robert M. (2007)，“显著性级别”，Salkind, Neil J.《测量与统计百科全书》3 卷册，加利福尼亚州千橡市：SAGE出版物。第 889—891 页。ISBN1-412-91611-9。

 您如何计算这种结果的概率？ 您可以使用 *χ2* 统计方法，该统计方法非常适合研究分布，可用于确定使用此公式获得如此极端或更极端结果的概率。

![Ei、Oi 和 X2 公式](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/formulas1.png)


 在我们的示例中，结果是：

![代入我们示例中数据的 Ei、Oi 和 X2 公式，得出的结果为 6。](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/formulas2.png)


 在概率方面，`6` 意味着什么？ 您在查看卡方分布时，需要使用适当的自由度。下图显示了不同自由度下的几个卡方分布。

![该图显示了不同自由度下的卡方分布](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/chi-squared-distributions.png)


 自由度的计算方法是用检验中的选择数减一。在本示例中，由于有四个可用区，因此自由度为三。然后，您需要求出 *k = 3* 且 *x ≥ 6* 的曲线下方的面积（积分）。您也可以使用预先计算的表，其中包含接近该值的常用值。

*表 2：卡方检验临界值表*


<table>
<thead>
  <tr><th>自由度</th><th colspan="5"> 小于临界值的概率 </th></tr>
  <tr><th> </th><th> 0.75 </th><th> 0.90 </th><th> 0.95 </th><th> 0.99 </th><th> 0.999 </th></tr>
</thead>
<tbody>
  <tr><td> 1 </td><td> 1.323 </td><td> 2.706 </td><td> 3.841 </td><td> 6.635 </td><td> 10.828 </td></tr>
  <tr><td> 2 </td><td> 2.773 </td><td> 4.605 </td><td> 5.991 </td><td> 9.210 </td><td> 13.816 </td></tr>
  <tr><td> 3 </td><td> 4.108 </td><td> 6.251 </td><td> 7.815 </td><td> 11.345 </td><td> 16.266 </td></tr>
  <tr><td> 4 </td><td> 5.385 </td><td> 7.779 </td><td> 9.488 </td><td> 13.277 </td><td> 18.467 </td></tr>
</tbody>
</table>


自由度为 3 时，卡方值 6 位于 0.75 和 0.9 概率列之间。这意味着出现这种分布的可能性超过 10％，并不低于阈值 5％。因此，您接受*原假设*并确定可用区中的错误率*不*具备统计学显著差异。

 CloudWatch 指标数学本身不支持执行卡方统计测试，因此您需要从中收集适用的错误指标， CloudWatch 并在像 Lambda 这样的计算环境中运行测试。您可以决定在MVC控制器/操作或单个微服务级别或可用区级别执行此测试。您需要考虑可用区损坏是否会对每个控制器/操作或微服务产生同等影响，或者DNS故障之类的事情是否会对低吞吐量服务而不是高吞吐量服务造成影响，因为高吞吐量服务可能会在聚合时掩盖影响。无论哪种情况，都要选择相应的维度来创建查询。粒度级别也会影响您创建的 CloudWatch 警报结果。

收集指定时间内每个可用区和控制器/操作的错误计数指标。首先，将卡方检验的计算结果设置为 true（存在统计学显著偏差）或 false（不存在统计学显著偏差，也就是说，原假设成立）。如果结果为 false，则向指标流发布一个 0 数据点作为每个可用区的卡方检验结果。如果结果为 true，则为错误与预期值相差最远的可用区发布一个 1 数据点，为其他可用区发送一个 0 数据点（有关可用于 Lambda 函数的示例代码，请参阅 [附录 B – 卡方计算示例](appendix-b-example-chi-squared-calculation.md)）。您可以采用与之前的可用性警报相同的方法，即基于 Lambda 函数生成的数据点创建连续 CloudWatch 三进 CloudWatch 制指标警报和五分之三的指标警报。与之前的示例一样，您可以修改其中的数据，以缩短或延长时间，增加或减少数据点。

然后，将这些警报添加到控制器和操作组合现有的可用区可用性警报中，如下图所示。

![该图显示了将卡方统计检验与复合警报相集成](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/statistics-test-with-composite-alarms.png)


如前所述，当您在工作负载中加入新功能时，您只需要创建针对该新功能的相应 CloudWatch 指标警报，并更新复合警报层次结构中的下一层以包含这些警报即可。警报结构的其余部分保持静态。