influxdb和时间序列数据

对于运维、监控来说,我们经常会碰到大量的和时间有关的数据。最典型就是各种主机运行数据,例如CPU的使用率、磁盘占用、网络实时带宽等。这样的数据综合起来有几个共同的特点:

  1. 和时间具有强关联性,也就是说在偏离了同一个时间维度的情况下来衡量数据就没有什么太大的价值了。
  2. 这些数据集合的大小事实上可以由采样频率来决定。只要你愿意取样,数据就在那边。
  3. 越旧的数据,数据本身的价值就越低。也就是说数据集的大小事实上跟数据的价值并不成正比。

记得上半年我写过一个帖子:谈一个MySQL语句的优化。从中可见,尽管这些时间序列的数据本身并不复杂。但如果通过传统的数据库来保存数据不但在性能上,而且在数据结构上都会面临不少的难题。

时间是事物变化最直接的度量方式!

InfuxDB是一个基于go语言实现的时间序列数据库。它本身又是infuxdata公司力推的TICK架构和生态环境中的I部分。TICK旨在提供一整套的从数据采样,存储,分析报表,警报系统的解决方案。有点类似于monogodb的运作方式,influxdb的基础功能是开源的,但对于类似集群化等高级功能则提供闭源的商业支持。

安装过程可以用完全没有难度来形容,influxdb除了提供deb/rpm/binary之外,很贴心的提供了docker image方便我们直接下载使用。

驱动方面,influxdb也合乎情理的采用了http API的方式提供了读(get)/写(post)两个接口,查询语句也尽可能的沿用了SQL语句——不要问我为什么不是传统db的“增删改查”,因为历史不容篡改 ^_^!但平心而论,对于时间序列的数据来说,http的协议实在是显得非常的重,好在influxdb提供了udp的插件支持,但默认并不开启,需要手工配置一下。

几个名词解释:

  • Database: 基本上等价于MySQL的Database概念,同样用user <database>命令在各个database之间切换。
  • Serial/Measurements:可以视作table的概念,相对与传统的DB,influxdb支持在select * from <serial> 的<serial>中使用正则表达式从而实现类似于union all方法的并表查询。
  • Tag:即每条记录的附件分类信息,由一个tag key和tag valuede键值对组成。influxdb并不是传统意义的关系型数据库,可以视作每个时间只有一个metric(注:这个metric可以是单一的数字、字符、布尔值,也可以是数列、向量、多维坐标什么的),那区分value的任务就由tag来担当。也就是说tag的存在更像是一个仅供参与查询的字段。
  • retention policies:从之前对于时间序列的总结上来看,时间序列数据的特点就是数据越旧价值越低。retention policies就允许用户设定一定的规则定时清理过期数据的。不过就我本人来说,influxdb的数据自带压缩,数据文件大小用M计算已经足够,即便你用了价格最昂贵的NVMe的话,也完全没有必要进行频繁的清理。
  • continous queries(CQ):类似于“触发器”或者“物化视图”,它允许用户可以通过一个serial定期自动创建另一个serial。这对于做短期统计报表来说是非常方便的。

据官方网站的说法,influxDB可以支撑动辄每秒以万计的连接数,经过本人在一台双路E5 2699+32G的机器上粗测,至少在一千次并发之内,每个http的读写时间都可以控制在0.03秒以内,可以说性能上是可以得到保证的。

最后,其实influxdb并不是唯一的时间序列数据库,比它更为专业的还有PI数据库等一系列的解决方案。但influx是免费的,而且有了自家TICK的全套解决方案之后,功能性也是不容小觑的。

 

推荐阅读:
之前已经弄过许多篇关于LAMP
Coreseek是一个基于sp
  要说最近最热的云
之前接触到的基于LAMP平台的

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据