大数据和AI不分家,AI助力低代码和智能运维落地,AI智能体的探索实践,本届AS会议一站聚齐!>>> 了解详情
写点什么

大数据下的技术运营(二)——数据采集系统设计与实现

  • 2016-09-27
  • 本文字数:2827 字

    阅读完需:约 9 分钟

概述

监控系统是整个 IT 架构中的重中之重,小到故障排查、问题定位,大到业务预测、运营管理,都离不开监控系统,可以说一个稳定、健康的 IT 架构中必然会有一个可信赖的监控系统,而一个监控系统的基石则是一个稳定而健壮的数据采集系统 ****。

定义采集数据

数据结构的选择

监控数据是标准的时间序列数据,传统的监控系统中,一条监控数据一般是由监控指标、时间戳和值组成,比如有 10 台服务器的内存使用率需要监控,一个时间周期内映射到系统中可能就是 10 条 mem.userd.percent 时间 值 这种格式的数据,然后分别和对应的主机关联。

这样做的缺点是,如果某一时刻想统计某个产品线、业务系统、集群、数据中心的某些监控指标的使用情况,可能就不太好实现。所以我们需要 ** 在传统的数据结构基础上增加一个字段,用来存储我们自定义的数据标签。为此,我们调研了当前主流的时序数据库,如 RRDtool、Graphite、InfluxDB、openTSDB 等,其中 RRDtool 和 Graphite 只能支能持时间维度和值维度,Cacti 和 Zabbix 就是基于 RRDtool 来绘图展示的。而 InfluxDB 和 openTSDB 都能满足我们的需求:其中 InfluxDB 版本比较低,而且每次更新变动都比较大;而 openTSDB 则在企业中有大量的成功案例。所以在数据结构的定义上,我们借鉴了openTSDB的数据结构,每条数据由metrictimestampvaluetags组成,用tags键值对来标识不同的属性。** 比如网卡发送数据包数目为例,其数据结构如下:

复制代码
[
  {
    “metric”: “net.PacketsRecv”,
    “data_type”: “COUNTER”,
    “value”: 15729345.00,
    “time”: 1471242889,
    “cycle”: 30,
    “tags”:{ 
      “iface”=”eth0”
      }
   }
]
  • Metric 是一个可测量的单位的标称。metric 不包括一个数值或一个时间,其仅仅是一个标签,包含数值和时间的叫 datapoints,metric 是用逗号连接的不允许有空格,例如:cpu.idle,app.latency 等。
  • Tags:一个 metric 应该描述什么东西被测量,其不应该定义的太简单。通常,更好的做法是用 Tags 来描述具有相同维度的 metric。Tags 由 tagk 和 tagv 组成,前者表示一个分组,后者表示一个特定的项
  • Timestamp。一个绝对时间,用来描述一个数值或者一个给定的 metric 是在什么时候定义的。
  • Value。一个 Value 表示一个 metric 的实际数值。

这样对于相同的 metric 数据,我们可以自由的通过 tag 的组合来获取我们真正需要的数据。

三种数据类型

既然有了上面的数据结构的定义,当然就会有数据类型,不同的数据可能代表的意义都不一样,OWL 中采用了 RRDtool 中比较常用的三种数据类型,分别为 GAUGE、COUNTER、DRIVER。

GAUGE 类型是一个计量器,可以理解最终存储的数据就是采集到的数据,比如服务器上的磁盘使用率,内存使用率,cpu 使用率,硬件的温度,风扇的转速,业务系统中的访问时间等等,这种数据会随时间的变化而变化,并且没有什么规律可言。

COUNTER 类型是一个计数器,该类型一般用于记录连续增长的记录,例如操作系统中的网卡流量,磁盘的 io,交换机接口的流量,业务的吞吐量等等,COUNTER 类型会假设计数器的值永远不会减小,除非达到数据类型的最大值产生溢出,OWL 客户端会存储最近一次的值和上一次的值,每次上报的过程中会取每秒的速率发送到 repeater,当计数器溢出,agent 会自动对数据进行补值,否则可能会因为溢出产生一个巨大的错误值导致错误告警。

DRIVER 类型用于表示单位时间内的数据变化,简单来说就是用来表示当前值和上一次值之间的差值,在监控领域中的实际应用场景可能不是很多。

agent 每次采集都会判断数据类型,并应用对应的运算规则。

采集系统的整体架构

架构的变化

相比于上个版本的架构,我们的数据采集系统还是发生了很大的变化,变化主要体现在服务逻辑拆分和重新规划。

服务端在上个版本中,主要负责 agent 端配置的维护,监控数据的接收和转存,网络设备数据的采集,端口健康状态监测等功能,当服务端需要进行维护的时候,整个监控服务相当于不可用的。另外也不利于扩展。所以在该版本中对 server 进行了拆分,分别为 cfc、repeater、net-collect,其中 cfc 主要负责配置维护,repeater 负责监控数据接收和转发,net-collect 负责采集网络设备数据,任何一个组件都可用做到水平扩展,极大的降低了系统的风险。

模块的角色功能

  • agent:通过内置 metric 以及自定义插件方式采集主机硬件、操作系统、中间件、业务系统等数据,并通过 tcp 长连接异步发送到 repeater。
  • net-collect:负责采集网络设备各项性能指标,包含各接口接收发送字节数、数据包数、错误数等等,监控数据通过 tcp 长连接发送到 repeater 中,配置和接口信息发送到 cfc 中。
  • cfc:一般部署于数据中心,直连 MySQL,负责维护 agent 或 net-collect 同步过来的 metric 信息以及插件的同步等
  • cfc-proxy:一般部署于分支机构或异地机房,是 agent/net-collect 和 cfc 之间的通讯桥梁。
  • repeater:可任意部署,负责接收时间序列数据并转发到指定的后端,支持 repeater->repeater、repeater->openTSDB、repeater->Redis 等。

采集系统如何与应用系统对接

比如我们现在新开发一个应用,那么我们需要梳理我们需要关心的指标,比如系统的吞吐量、延迟、接口或 url 访问量等等,由于 OWL 不支持主动 push 数据,所以我们需要将这些数据通过 Http REST API 方式暴露出来,然后使用 OWL 自带的 app_collect 插件来定时采集数据,API 暴露的数据结构大概如下:

复制代码
[
  {
    "metric": "app. latency ",
    "data_type": "GAUGE",
    "value": 1.0,
    "tags": {
            "product": "app01"        
            }
  },
  {
    "metric": "app.page_view",
    "data_type": "COUNTER",
    "value": 10324564,
    "tags": {
            "product":"app01”,
            “page”:”index.html”,
       }
    }
]
{1}

采集系统的上层应用封装

基于该系统,我们可以在上层构建报警系统,统计分析系统,报表系统等等。大家可以自由去发挥。

其中,报警服务在上个版本中是基于 Python 的 Celery 去实现的,由于依赖众多模块,安装部署复杂,在开源过程中大部分反馈的问题都是在该模块的部署上。因此,在该版本中我们使用 go 语言对重构了报警服务,分为控制器和报警逻辑处理模块:其中控制器负责报警策略生成和报警结果处理;逻辑处理模块负责从控制器获取策略并去 OpenTSDB 读取数据进行对比,产生的结果返回给控制器处理。整体而言这是一个生产者消费者模型,理论上消费者可用无限扩展。更多报警的具体细节,会在本系列的报警文章中进行详细的介绍。

总结

数据的采集是起点而非终点,如何对采集到的数据进一步加工处理,并且能够帮助我们改善工作和生活才是最终目标,我们坚信,数据改变人们的决策方式,数据改善人类自身和环境。 TalkingData,让数据说话。


感谢木环对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-09-27 17:026232

评论

发布
暂无评论
发现更多内容

flutter之踩坑的日子(3)

霜蓝手环

Flutter Android Apk

Week06总结

SuperLab

英特尔重磅发布物联网增强处理器,产品性能、AI能力、功能安全提升显著

E科讯

架构师 0 期 | 大数据相关技术

刁架构

架构师训练

极客大学架构师训练营 - 同城快递业务架构设计 - 大作业一

叶鹏

Week02

SuperLab

10周作业-微服务

飞雪

99%的人都能看懂的分布式系统「补偿」机制

华为云开发者联盟

分布式 高可用 系统

Week05 总结

SuperLab

7周作业-性能测试与优化

飞雪

Week10总结

SuperLab

Week12

SuperLab

10个常见的软件架构模式

GuoYaxiang

架构模式 软件架构 架构设计

有的程序员写代码写到头秃,有的程序员却通过黑吃黑获利百万。

Java架构师迁哥

学习Java的三个阶段(学习目标+知识点),一起努力吧!

Java架构师迁哥

极客大学架构师训练营-架构师技术图谱-大作业二

叶鹏

Week08总结

SuperLab

Week13

SuperLab

Java经典面试题详解,突围金九银十面试季(附详细答案)

Java架构师迁哥

你的页面健康吗?

Lam

Java 大前端 浏览器 性能分析

Git:改变世界的一次代码提交

华为云开发者联盟

git Linux 代码

深入分析CRM系统对现代企业的作用

Philips

企业管理 CRM 客户关系管理

week03

SuperLab

Week07总结

SuperLab

Week09

SuperLab

Week11

SuperLab

小前端探索HTTP

Lam

Java 面试 大前端 网络 HTTP

英特尔扩大技术及用户端部署,加速推动智能边缘发展

E科讯

Week04

SuperLab

Mobileye携手吉利汽车共同推出领先的驾驶辅助功能

E科讯

iOS造轮子 - UITableView字母索引条

iOSer

ios 面试 UITableView

大数据下的技术运营(二)——数据采集系统设计与实现_语言 & 开发_吴迎松_InfoQ精选文章