微信号:infoqchina

介绍:有内容的技术社区媒体

追踪缺陷服务器:Netflix的异常检测技术

2015-07-22 11:27 张天雷

云计算环境下,及时发现服务器集群中的性能问题至关重要。开发者经常会遇到这样一种情况,整个系统工作性能急剧下降,但简单的查找很难发现明显的漏洞,最终需要耗费大量的人力对所有服务器进行逐台排查。因此,开发者会寄希望于自动检测技术发现出现异常的服务器。针对这个问题,Netflix的工程师们通过构建了一个自动异常检测系统,做了很好的工作。


作为世界上最大的在线影片租赁服务商,Netflix拥有大量的服务器集群以支撑在线影片的存储以及个性化影片推荐等服务。Netflix的工程师们也希望他们的自动异常检测系统能够发现隐藏在表面现象下的微小异常,能自动发现“不健康”的服务器,从而帮助维护人员从无数个通宵达旦中解救出来。本文通过对Netflix的异常检测技术进行简单介绍。文章由黄立威、张天雷整理。


玻璃上的斑点

Netflix服务目前运行在数以万计的服务器上,可是通常会有百分之一处于不健康的状态。例如,一个服务器的网络性能可能下降,并导致请求处理延迟,这样一个不健康的服务器虽然在一个次优的状态下运行,可是在响应健康检查的时候依然会显示正常的系统级指标。事实上,一个运行缓慢或不健康的服务器比一个彻底损坏的服务器更糟,因为它的影响可以足够小,保持在我们的监控系统的容忍范围内,并且会在维护人员的检查中被忽视。虽然有时候在数千个健康的服务器中可能仅仅潜伏着几个不健康的服务器,但这仍然可能影响对客户的服务质量,并招来大量的投诉电话。


上图表示不同的服务器(不同的颜色的线表示)在不同时间上的错误率,虽然几乎所有的服务器在某些时段上都会出现高的错误率,但它们很快也会回落到零,只有紫色的线始终高于正常水平。那么,是否可以将它作为一个异常点呢?有没有一种方法能够使用时间序列数据自动找到这些异常点呢?


一个非常不健康的服务器可以很容易地通过一个阈值警报被检测出来。但是,阈值警报要求服务器的错误率在很长一段时间维持在高的状态,而且还需要对阈值进行定期调整,这实际上是非常困难的,需要考虑数据的访问模式和容量的变化等复杂因素。提高可靠性的一个关键步骤是自动发现运行在下行状态的服务器,但而它们却还不足以糟糕到通过阈值警报检测到。


暴风雪中找兔子

针对上一节中提到的问题,Netflix采用了聚类分析的方法来解决,它属于是一种无监督机器学习的方法。聚类分析的目标是将对象分类到不同的类或者簇中,使得同一个簇中的对象比不同簇间的对象具有更高的相似性。无监督技术的优点是无需有标签的数据。虽然当前有许多不同的聚类算法,每种方法也有自身的优势,Netflix使用了一种具有代表性的基于密度的空间聚类方法DBSCAN来自动检测异常服务器。


DBSCAN最初是由Martin Ester, Hans-Peter Kriegel, Jörg Sander 和 Xiaowei Xu在1996年提出。这种技术将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,而将低密度区域中的点标记为异常点。从概念上讲,如果特定点属于一个簇,其附近应该有大量的其他点(距离通常有特定的函数度量)。Naftali Harris的博客文章给出了一些通过DBSCAN进行聚类例子,例子中包含了聚类的可视化表示。


要检测异常的服务器,服务拥有者应该指定一个度量指标来对异常点进行监测。Netflix使用这个指标分析从Netflix主要的时间序列遥测平台Atlas上收集到一个数据集,在数据集中使用DBSCAN算法,实现异常服务器的自动检测(下图中的红色区域为DBSCAN算法发现的结果)。


DBSCAN需要配置两个输入参数,一个是距离度量,一个是最小群集大小。然而,服务器拥有者不需要考虑如何找到正确的参数组合让算法有效地识别异常点。Netflix让服务器拥有者仅仅需要定义异常点的当前数量(在配置的时候可以是任意值)。基于这一认识,Netflix使用模拟退火算法对距离和最小群集大小进行参数优化。这种方法可以有效地降低异常点检测的复杂度,并且可以很方便地采用并行处理技术,事实上服务器拥有者不需要过问太多算法的细节。


数据分析结果

为了对技术的有效性进行评估,Netflix在一个产品服务中运行了这种自动异常检测技术。采用手动的方式确定服务器是否应该被列为异常点,从而作为测试数据。通过分析一周的数据,结合测试数据与异常检测系统发现的结果,计算一系列的评价指标,包括准确率,召回,和F-评分,结果如下:


Server Count

precision

Recall

F-score

1960

93%

87%

90%


结果表明,虽然不能完全发现集群环境中的异常点,但已经很接近了。事实上,在云计算环境下,一个不那么完美的解决方案是完全可以接受的,因为单个节点的错误所造成的损失是相对较低的。错误地终止一台服务器几乎没有特别大的影响,因为可以立即使用一台新的服务器替代它。虽然该系统并不完全准确,但我们清楚地知道一个不完善的解决方案比没有解决方法要好得多。


进一步的改进

在实验中Netflix的工程师使用了一段时间的数据来做决策。相比于一个实时的方法,它也存在一个明显的缺点,即异常检测的时间与分析数据的时间窗口长短是紧耦合的。可以利用实时流处理框架对此进行改进,如Mantis(Netflix的事件流处理系统)和Apache Spark Streaming。此外,随着 数据流挖掘和在线机器学习等领域的不断发展,通过考虑这些在线技术或许可以有效缩短检测的时间。


事实上,还可以使用部分标记数据提高参数优化的性能。目前,Netflix正在让服务器拥有者通过使用标记数据(他们非常熟悉的领域)来做一些尝试,并使用贝叶斯参数选择技术来针对训练数据集对参数进行优化。


由于Netflix的云计算基础设施大规模增加,自动化的决策能够进一步提高系统的可用性,并减少人为干预。服务器异常检测只是Netflix自动化进程中的一个例子,其他的例子还包括Scryer和Hystrix。有效地利用机器学习和自动响应技术能够提高网站的可靠性。


版权归属InfoQ,禁止私自抄袭转载。

回复关键词React | 架构师 | 运维 | 云 | 开源 | 物联网 | Kubernetes | 架构 | 人工智能 | Kafka | Docker | Netty | CoreOS | QCon | Github | Swift | 敏捷 | 语言 | 程序员



有话想说?!戳“写评论”👇

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 一分钟了解两阶段提交协议/算法(分布式理论基础) 屌炸天的程序员:吸过毒、卖过杀毒软件,现在还要竞选美国总统! 程序员应该避免的10种编程坏毛病 Android样式的开发:shape篇 【干货】PHP中的防御性编程