Evolvable Network Telemetry at Facebook

Introduction

在这篇文章中,我们提出了PCAT,一个production change-aware的遥测系统,处理快速发展的网络中的变化。我们建议使用一个change cube abstraction来系统地跟踪变化,并使用intent-based layering的设计来限制和跟踪变化。

本文考虑的变化不仅包括来自监测数据的网络工作事件,还包括那些对遥测系统本身的更新:监测意图的修改、设备API的进步、频率概念的调整、处理的突变和存储格式的重组。

PCAT包括三个关键设计。

  • 首先,受数据库社区[8]的启发,我们为遥测引入了change cube abstraction,以明确跟踪每个变化的时间、实体、属性和组件,并引入了一套primitives以系统地探索变化。
  • 第二,我们重新构建了我们的遥测系统,使其具有变化意识和可进化性。为了限制变化的影响,即受影响组件的数量,PCAT包括一个基于意图的分层设计(第4节),它将监测意图与数据收集分开,并支持跨层的变化方块。
  • 第三,我们建立了几个变化感知的应用程序,探索change cube之间的依赖关系,以提高应用效率和准确性。

Changes in Facebook Network Telemetry

Change Cube Definition

Change Cubes

We define a change cube to be a tuple <Time, Entity, Property, Layer, Dependency>

  • Time维度捕捉到变化发生的时间。它取决于我们检测变化的颗粒度,例如,秒、分钟或天。
  • Entity代表一个测量对象,例如一个开关,一个线卡,以及描述测量内容和方式的模型。
  • Property包含实体的字段或属性,会被改变。例如,一个交换机的回环IP地址,一个接口的入口丢包。
  • Layer决定了遥测系统中发生变化的层或组件(如图1)。我们将在第4节中讨论我们如何在这些选择中落地。
  • Dependency维度包含一个与该变化相关的其他变化的列表。列表中的每一项都是一个<ChangeCube, DependencyType>对。

Primitives on change cubes

定义了几个原语

Changes in PCAT

我们从设备、收集配置和应用意图的角度分析了七年来(2012-2019)的变化。我们下面的结果发现了令人惊讶的频繁变化,并量化了变化的各种原因。

Change Overview

  • 变化频率:types of changes vary greatly as the telemetry system scales
  • 变化幅度:collection infrastructure has larger changes and the application has changes with larger volatility

Changes Tracking in Telemetry System

在本节中,我们描述了我们目前基于意图的遥测系统的分层设计,以帮助跟踪变化。

Towards change-aware telemetry

Intent Modeling

我们使用一种基于Thrift的建模语言,使网络工程师能够轻松地指定他们的监控意图。

我们的语言包含三个部分,如图5所示。

  • 范围包括设备级范围(如骨干路由器)和网络级范围(如DC结构网络)。
  • 监控(Monitor)以厂商无关的方式指定要监控的内容。键是监测的指标,实体是时间序列数据流和离散事件表。
  • 行动包括两种类型。Emitter和Detector。发射器订阅从设备推送的离散网络事件,并在收到这些事件后定义行动。检测器允许我们为各种时间序列数据编写公式,并为公式值设置一个阈值作为警报条件。

Runtime

运行时执行系统根据模型从设备中收集数据,其中包括一套分布式的引擎和一个集中式的控制器来分配工作并从这些引擎中收集数据。

集中式控制器获取最新的收集和作业模型,与我们数据库中的设备信息相结合,并生成一连串的作业,在给定的期限内执行。

它根据负载和延迟将工作分配给指定的引擎。引擎执行采集命令,进行设备级处理,并将数据送回相应的存储。该系统经过大量的工程设计,以解决可靠性和可扩展性的挑战。

Change reduction w/ vendor-agnostic IR

供应商无关的中间表示(IR)数据模型。该数据模型是基于意图模型中的键字段而创建的。

Change Exploration

一旦PCAT根据监控意图收集数据,我们就会运行设备级和网络级处理,将数据反馈给应用程序。下面,我们通过探索变化方块之间的依赖关系,建立一些变化感知的应用程序。