智能运维基础-运维知识库之ETL

2,252 阅读6分钟
原文链接: mp.weixin.qq.com

作者简介

H++    百度云高级研发工程师

负责百度云Noah智能运维产品元数据建设、时序数据存储相关研发工作,在分布式系统架构、高性能数据服务、数据清洗等方向有着较为广泛的实践经验。

干货概览

在百度智能化运维的持续演进过程中,我们在逐步建设以智能运维机器人为核心的运维能力,将其应用于故障自愈、根因定位、智能变更等运维场景中。而建设以智能运维机器人为核心的运维能力,最基础的工作是要先建立运维的世界观(环境模型),以机器人的视角来理解运维世界、感知系统状态、获取环境变化等。

在传统运维模式中,运维数据分散 在不同的系统中,这些运维数据存在几个问题:访问方式不一致;数据术语、概念、模型不一致;系统间没有数据关联

这些问题使得我们日常的运维工作 ,经常需要理解处理各种不同的数据,导致运维成本高 ,效率难以提升。因此希望建立运维知识库 统一运维工作中的语言,对运维工作中的对象进行统一建模,收集并转录日常运维工作的资源与操作,为日常运维工作提供一种『书同文,车同轨,行同伦』 的基础。(PS:借鉴自秦始皇)

本文主要介绍百度云Noah智能运维产品,在构建运维知识库过程中的思考。

运维知识库中的数据

运维知识库中包含了元数据(Meta)、状态数据(Status)、事件数据(Event):

  • 运维元数据(Meta)对运维实体世界进行建模,包括运维实体的属性、组成以及关联关系等;

  • 状态数据(Status)反应系统的状态,表征服务的存活性、资源消耗或能力等;

  • 事件数据(Event)描述对系统做的变更、服务状态的异常等事件。

ETL系统架构

运维元数据、状态数据、事件数据分布在几十个不同的系统中,随着业务的增长和相关系统的不断增加暴露出了以下几个问题:

  • 数据分散,访问方式不一致:同一类型的数据分散在多个不同的系统,各系统提供不同的访问入口;

  • 数据术语、概念、模型不一致:各系统使用的术语、概念、模型各不相同,例如“应用”这个概念,每个系统或工具对于Application的理解都不尽相同;

  • 系统间数据没有建立关联:例如部署、监控和路由服务等核心场景在运维数据上没有打通,表现为部署平台、路由服务、监控系统所使用的服务管理机制各不相同,三个系统间的数据难以关联,且无联动性。

因此,依托『书同文』的理念建立运维知识库,提供一个统一的运维数据管理系统,来管理运维工作中的公共基础数据,打通系统间的数据关联,使这些数据能够遵循统一的模型被共享和使用。

为了使这些数据能够遵循统一模型,我们制定了各类数据的模型(Schema),采用ETL机制从各系统获取(Extract)数据、转换(Transform)成统一的模型、并存储(Load)在知识库中,其架构如图所示。

这些运维数据在建设时根据业务对数据时效性要求的不同,分为以下三种:

  • 离线数据建设,例如用于运维变更效率指标统计等相关的数据;

  • 近线数据建设,例如故障诊断过程中依赖的数据;

  • 实时数据建设,例如智能故障自愈、智能流量调度相关的路由数据等。

对于上述不同的数据我们采用不同的ETL方式,分别是:

  • 拉 (Pull ETL),周期性从数据源拉取 数据,适用于离线数据的建设;

  • 推 (Push ETL),数据源主动推送 变更的数据,适用于时效性较高的近线数据建设;

  • Federation (Lazy ETL),在查询时从数据源获取数据 、按照Schema转换后并返回,适用于实时数据建设。

1Pull ETL

Pull ETL提供了两种数据接入方式:自适应ETL基于SDK的自定义ETL

自适应ETL,是我们针对适用范围较广的数据源(如百度名字服务BNS、Noah监控平台、Noah部署平台等)开发的,用户仅需配置好ETL规则,自适应调度器会自动解析规则,并将数据按规则接入运维知识库。

基于SDK的自定义ETL,是我们为其他数据源提供的ETL方式,用户基于我们提供的SDK可以开发各种数据源的ETL脚本,配置好调度策略,通用调度器根据调度策略执行ETL脚本,即可将数据接入运维知识库。

2Push ETL

Push ETL采用消息队列(MQ),来支持时效性高的数据建设。数据源发生变更时,需要将变更消息推送至MQ,运维知识库订阅、消费这些消息,并转换、存储数据。

如下图所示,用户基于SDK开发Push ETL脚本,调度器执行脚本并保证其一直处于执行状态。数据源推送变更消息至MQ,Push ETL脚本订阅MQ中的变更消息,将变更的数据转换成统一的模型并存储在知识库中。

3Lazy ETL

Lazy ETL是为实时数据查询而提供的ETL模式。在运维领域我们需要看到系统的某些元数据/状态的实时变化,比如实时路由数据、监控系统的时序数据等。Pull ETL由于是周期性的执行,因此在时效性上无法满足需求;Push ETL需要数据源进行改造,有一定的成本,且变更消息传输存在一定的延迟,无法实时查询到最新数据。

因此,如下图所示,我们采用另一种经典方法Federation(Lazy ETL)来实现数据集成:即运维知识库处理用户查询时,直接调用接口去访问原始数据源,按schema转换后,返回给用户。

总结

本文主要介绍了百度云Noah智能运维产品中的运维知识库之ETL。针对不同业务场景使用的数据,提供不同的ETL方式。针对离线数据建设,采用Pull ETL周期性从数据源获取数据,此外综合考虑数据接入收益和成本,提供了自适应ETL以及基于SDK的自定义ETL;针对时效性高的数据建设,采用Push ETL,数据源主动推送变更到运维知识库中;针对实时数据建设,采用Lazy ETL,在查询时回源获取数据并进行转换。有对运维知识库和ETL感兴趣的同学,欢迎留言探讨。