这个小文章里尽量避免使用数据挖掘的概念, 争取用简单的语言解释出来, 如果以后有时间, 再仔细介绍几种开源时序数据库的结构和关键技术。
时序数据简单的说, 就是随着时间流而不断产生的数据, 比如一台服务器的cpu负载, 或者一个应用的log文件等。 对于这种时序数据, 有一些常用的操作, 比如统计每分钟的平均值, 中位数等。所谓时序数据库, 就是针对这类场景做了优化的一类数据存储查询系统。在OLAP中, 此类时序数据的统计有着重要的应用。
我们用例子来说明时序数据以及对这些数据的处理。比如我们就以 cpu 使用率这个数据为例。假设我们一个集群有近百台服务器, 对于每台服务器, 我们每秒采集一次数据, 数据是服务器cpu 当前的 us sy id wa st 。那么, 我们采集到的数据除了这几个值之外一定还有数据的一些其它属性, 比如采集时间, 服务器编号, 服务器物理配置,服务器上主要的应用。 这些属性一般叫做维度(dimension)。此类数据实时产生, 我们最常用的查询可能类似这样:
最近1小时内, 每5分钟cpu使用率的平均值。-----在一个时间范围内, 按照时间段归类, 计算均值(也可能是中位数, 最大最小值, topN等)
最近6小时内, 每5分钟每种服务器类型cpu使用率的平均值。 最近1小时内, 每1分钟每台服务器的cpu使用率的平均值。
最近1小时内, 每1分钟所有跑web service 应用的服务器的cpu使用率的平均值。
综上, 我们看到这类数据处理基本是要对一个时间范围的数据, 根据时间段, 维度进行归类,做一些聚合运算。
时序数据库要解决的问题就是如何能在海量数据中, 快速响应用户的此类查询。
补充一种时序数据常用的操作, count distinct(基数统计), 比如从web 服务器的log里统计独立访问ip数量, 这种需求时序数据库也必须要解决。
时序数据库面临的主要困难是, 数据量大, 数据的维度多, 统计查询复杂, 需要快速响应查询。
时序数据有一个比较大的特点, 就是数据的价值随着时间流逝而逐步降低。
时序数据库解决这些问题的主要的技术手段有:分布式处理, 按照时间分片存储,按照维度条件做哈希, 通过位图索引优化查询, 尽量保证最新数据在内存中, 使用统计算法。后面我们以druid (http://druid.io/)为例来具体介绍这些技术的实现。 顺便提一下, druid 的文档写的不好, 甚至还有错误,如果想要测试druid, 要文档和 google group 结合起来。