百度网络监控实战:多维度分析应用场景

作者简介

李聪    百度高级研发工程师

负责百度智能运维产品(Noah)监控数据分析相关工作,重点关注故障定位、异常检测等相关领域技术。

干货概览

大家在收集数据的时候常常会往数据上附加一些标签,这些标签从不同的角度对数据加以描述,我们把这些角度称作 维度 ,这些附加了维度信息的数据称作 多维度数据

在收集到数据后,我们往往只关注那些和预期不一样的数据,从多个维度检查这些异常数据集中在什么地方,我们把这种分析方法称作 多维度分析

在网络监控里,我们可以用多维度分析的方法 定位网络故障 。接下来,本文将以百度内网质量监测的场景为例,介绍多维度分析的实战经验。

内网质量监测需求

百度拥有数十万台服务器,分布在全国各地的几十个数据中心(机房)中,这些服务器通过内网连接起来对外提供服务,这个网络是一个多层级的 分布式结构 ,主要层级有: 地域、机房、集群、ToR(Top of Rack,机架)。

图1  百度内部网络拓扑示意

大家看到的各个服务通常是 模块化 的设计,这些模块部署在不同机房的不同服务器上。一旦内网发生故障,模块间的通信受到影响,会导致 服务体验下降 或不可用。在工程师发现服务故障的时候,会从程序、数据、宿主机环境、网络环境等各个角度进行检查,评估故障的影响范围,从而选择合适的预案来降低损失。在这个过程中对网络环境的排查是必不可少的。

一个典型的场景是:服务X的工程师发现可用性下降,由于服务部署在机房A、B,需要检查这两个机房的网络环境有没有问题,有问题的话影响了整个机房还是某个ToR下的几台机器。

  • 如果仅机房A的网络异常,需要将原本引到机房A的流量调度到机房B;

  • 如果仅机房A内的ToR1网络异常,只需要在机房内进行流量调度,将原本引到ToR1下的流量调度到机房内其他ToR下;

可以看到,不同故障对应的预案是不同的。工程师需要了解网络是否存在故障、故障影响了哪些机房、集群、ToR,然后才能选择合适的预案去执行。

内网质量监测方案

1

内网质量数据

《NetRadar横空出世》 里我们已经介绍过,内网质量监测中使用了 端到端 的方式进行探测,通过在服务器之间发送探测请求来监测网络质量。

在探测机房A到机房B之间网络状态的时候,我们从机房A、机房B分别选出n个服务器 ,从机房A中的服务器 向机房B中的服务器 发送探测包,探测结果会有成功、失败两种。

图2  机房A中的服务器对机房B中的服务器进行探测的结果

通过这样的探测我们得到了一系列网络质量数据,这些原始数据中每条数据对应一次探测,数据内容包括探测样本的来源、目标和结果,比如从服务器a1探测服务器b1的结果为成功。

2

内网故障判定

得到原始数据之后,我们需要给出网络有没有问题的判断。

需要判断的网络问题有地域故障、机房故障、集群故障、ToR故障,一个直接的思路是逐个检查这些需要判断的区域,比如要判断一个机房有没有发生网络故障,可以统计机房下的探测样本的总数和成功数,检查成功探测样本是不是太少。

为了描述方便,这里不再展开 《还记得概率课本中的二项分布吗? 在我们的网络判障中发挥了大作用! 》中介绍过的 基于二项式分布的判障方法 ,简单记作成功率低于90%为异常。

在判断机房A的网络有没有故障的时候,可以把源或目标服务器在机房A下的探测样本挑出来,统计总样本数和成功样本数,得到机房A的探测成功率为70%,低于阈值,所以认为机房A的网络存在故障。

图3  机房A故障时的探测结果

这样,我们针对每个关注的区域都进行一次检查,就可以知道这些区域的网络有没有故障。

3

误报问题

我们逐个区域检查有没有网络故障的时候,会存在一些误报问题。

这里给一个机房A的例子,机房A里有8个ToR,其中ToR1的网络出现了中断。这个时候,发送到ToR1下服务器的探测包会失败,从ToR1下服务器发出的探测包也会失败,又因为ToR1下服务器占机房A下服务器的1/8,所以机房A的探测成功率会小于90%,故障判定算法将会判定机房A存在异常。这个判定结果的范围大于实际故障范围,对服务没有部署在ToR1下的工程师来说是一次误报。

图4:机房A中ToR1故障时的探测结果

可以看到,在判断一个区域有没有故障的时候,只检测源或目标服务器在这个区域的成功、失败样本数是不够的,这些失败可能是受到了其他区域故障的影响,我们需要更全面地进行分析。

多维度分析

1

误报问题分析

可以看到,在前面两个误报的例子中,如果更全面地进行分析,不同故障的表现是有很大区别的。

在ToR1故障的时候,机房A里的其他ToR的表现是正常的,源或目标机器在机房A下的失败探测样本大多集中在ToR1下,很少一部分在其他ToR下。而在机房A故障的时候,这些失败探测样本 均匀分散 在各个ToR下。

图5  ToR1故障(左)与机房A故障(右)的差异

可以看到,发生不同故障时,失败样本的聚集情况有 明显区别 ,我们需要报告的是失败探测样本聚集的一个或多个区域,这些区域具有失败探测样本多、失败探测样本在各子区域均匀分布的特点。

2

内网监测数据的维度

在分析误报问题的过程中,我们需要不断地筛选源或目标在某个区域、某个子区域的样本。为了让筛选更方便,我们给每个样本附加了 一组标签 ,标记这个探测样本反映了哪些区域的网络质量。

对于图2中服务器a1到服务器b1的探测样本,需要附加的标签是:

  • 源服务器=a1

  • 源ToR=1

  • 源集群=1

  • 源机房=A

  • 源地域=Y

  • 目标地域=Z

  • 目标机房=B

  • 目标集群=4

  • 目标ToR=10

  • 目标服务器=b1

这样,探测数据变成了一组多维度数据,那些需要报告的网络故障可以用这些维度来描述,每个故障对应一个维度组合。机房A、B间网络异常对应 “源机房=A,目标机房=B” “源机房=B,目标机房=A” 异常,机房A网络异常对应 “源机房=A” “目标机房=A” 异常。子区域的故障则对应了细分维度组合,机房A到B的网络是机房A出方向网络的子区域, “源机房=A,目标机房=B” “源机房=A” 的细分维度组合。

我们用 贡献度 描述一个维度组合中失败探测样本的多少,用一致性描述失败探测样本在各个细分维度组合分布的均匀程度。所以,那些贡献度和一致性都很高的维度组合中失败探测样本较多、失败样本在各个细分维度组合均匀分布,和故障区域的特点一致,这些维度组合应当对应了正确的网络故障区域。

在内网质量监测场景中,存在一个较小区域故障被误报为一个较大区域故障的问题。本文简单介绍了一种用于故障定位的多维度分析方法,使用这种方法预选疑似故障区域,可以有效减少误报。

在接下来的文章中,我们将详细介绍这种多维度分析方法的 实现细节 ,敬请关注。

RECOMMEND

推荐阅读

↓↓ 点击”阅读原文” 【了解更多精彩内容】