Fork me on GitHub

时序数据介绍

基于时间序列,实现数据聚合

时序数据 就是基于时间序列的数据,其常常表现为同一指标按时间序列记录的数据列,在需求实时性的场景中比较常见。而对于此种数据的运用通常使用基本的 聚合 方式就能达到需求了。当然,目前 AI 盛行的时代,机器学习领域也不断出现很多基于 时序预测 的算法。但本文主要介绍时序数据的基础认识,这部分的认知主要是从自己目前所做的数据监控项目的经验所得,若有不正确,请大家批评指正。

基本格式

时序数据 和一般的数据没什么区别的,基本上也都用 json 格式表示,唯一不同点就是数据中一定包含关于 时间 的信息,比如: 时间戳

一般一条时序数据只表示一个键值信息,而在时序数据中,这个键常常称为 指标指标名 (英: metric ),而值则就是指标对应的值了。因而,一个时序数据的基本格式如下:

1
2
3
4
5
{
"timestamp": 1346846400, // 时间戳
"metric": "sys.mem.bytes", // 指标名
"value": 18 // 指标值
}

主要包含了 时间戳、指标名、指标值。其中,对于指标的值,也就是上面的 value 字段值,这个值一般都是 数值型 ( Integer、Float、Double ) 的, 为什么大多是 数值型 的呢?这个下面会进行说明。

到这里,我们已经知道了一个时序数据的基本格式。但是,难道时序数据就是一个格式吗?即使加入了时间信息,那也和普通的 json 数据也没什么本质区别呀?

数据聚合

的确,时序数据的存在可不是因为一个数据格式,而是由于 数据聚合 应用的需求而出现的。比如,我们现在有 1 台服务器,我想快速地知道今天上午 10 点到上午 12 点之间这台服务器的 内存 使用的 平均值、最高值、最小值,那我们怎么办?其中,这个指标可能也会是 CPU磁盘 IO 等其他指标。

这里我们可以看出像 平均值、最高值、最小值 等等功能对于 metric 是通用的,因此,我们只需要将各种需求功能设计成通用的 聚合函数,那么我们需要看哪种指标的 平均、最高、最小 等聚合值时,只要选择对应的函数即可了。

这实际上也就是为什么 value 字段大多是 数值型 的原因,因为聚合函数绝大部分只是一些常规的 数学计算,数值型是最好处理的类型。当然这不是绝对的,只要你的后台明白如何处理对应的值类型即可了。

然而,上面举例是 1 台服务器,那我们如果有 2 或多台服务器,比如叫 hostA,hostB,host… 。 那么,我们直接对内存指标进行聚合那会计算到两台机器的聚合值,这个不是我们想要的,我们需要能对特定的主机进行聚合的能力,那该如何做?

标签

这时就用到了 标签 功能,一个标签就是一个 键值对,通常标签是作为后台的过滤条件的,而由于过滤条件的多样化也需要标签的多样化,因此一个时序数据中可以包含多个标签的。从而我们需要在基本的时序数据格式中再添加一种 键名,即 标签组tags,如下:

1
2
3
4
5
6
7
8
9
{
"timestamp": 1346846400, // 时间戳
"metric": "sys.mem.bytes", // 指标名
"value": 18, // 指标值
"tags":{ // 标签组
"host.name": "hostA",
"address": "shanghai"
}
}

这样表示的时序数据更具有通用化、个性化、定制化的能力,从而我们可以先进行指标、标签的过滤后再进行相应的 聚合操作,这样就能更满足多样化的业务需求。而上面多台服务器的情况,则需要在上传数据时加入 host.name 值, 这样后台可根据该字段检索 host.name = hostA 也就是 A 主机的指标,然后对特定指标进行聚合即可。

总结说明

时序数据的需求通常是出现在 随着时间的推移某个指标值变化关系到业务运转 的情况下,因此我们就需要 间隔性地上传那个指标的数据 以实时地知道其状态值以应对突发情况,这个实际上就是一种 数据监控 场景。这里的 监控 可不是我们平常的视频监控,而是 指标的检测与上报,比如我们用 脚本 实时检测网站服务器的内存指标状态、CPU 状态、磁盘 IO 状态并上传到统一的后台,这个传输过程的数据格式就是使用时序数据,这样后台只需通过简单的 聚合功能 就能够对服务器的运行状态 了如指掌 了。

目前,时序数据应用最为广泛的也就是上面提到的 实时检测服务器主机指标 状态信息了,比如:阿里云、腾讯云等这些公有云服务提供商,当你购买一台服务器后,你在后台是可以看到一些服务器的性能指标的,这些指标信息就是实时监控主机并以 时序数据 格式传输出来的。

明白了上面的时序格式和应用方式,我们可以反过来想下,实际上时序数据的出现主要是由于 我们很想知道一段时间内一些指标信息的聚合结果 而产生的。为实现这种目的,我们不希望重复实现聚合功能,因此只需要实现一次可复用的聚合函数即可,这就产生了通用的 聚合函数。这相应地要求一条时序数据只包含一条 指标信息 以实现简单统一、包含一组 标签信息 以便实现筛选过滤。

因此,时序数据和其他一切业务名词一样,也都是由大量的实际需求逐渐演变成的统一化、规格化的结果!都是历史的选择!

苟且一下