作者 | 刘平
文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59428f6f7e850f039399fd02/index.html
Influxdb是一个基于golang编写,没有额外依赖的开源时序数据库,用于记录metrics、events,进行数据分析。这篇文章谈论的influxdb版本在1.2.0以上。这篇文章只谈论influxdb在监控中的数据存储应用,不会谈论influxdb提供的整套监控方案。本文主要谈论五个方面:时序数据库选型、influxdb基本概念、存储引擎、实践、数据聚合。
时序数据库选型
Influxdb vs Prometheus
我们其实仅仅需要的是一个数据库,其他组件都是自己开发的,而且存储的数据类型不仅仅是数字,因此选择了influxdb。希望上面的比较对大家有帮助。
Influxdb基本概念
Database
数据库是个逻辑容器,包含了measurement、retention policies、continuous queries、time series data,类似于mysql的database。
Measurement
描述了相关数据的存储结构,类似于mysql的table,但是不需要创建,写入数据的时候自动创建。关于schema的设计建议参考:设计建议。
Line Protocol
Line Protocol定义了influxdb的数据写入格式,如下:
Tag
上面的location和server就是tag key,us和host1是tag value,tag是可选的。不过写入数据时最好加上tag,因为它可以被索引。tag的类型只能是字符串。
Field
上面的temperature是field key,82是field value。field value会用于展示,value支持的类型有floats,integers,strings,booleans。
Timestamp
格式是:RFC3339 UTC。默认精确到纳秒,可选。
Series
measurement, tag set, retention policy相同的数据集合算做一个 series。理解这个概念至关重要,因为这些数据存储在内存中,如果series太多,会导致OOM。
Retention Policy
保留策略包括设置数据保存的时间以及在集群中的副本个数。默认配置是:RP是autogen,保留时间是永久,副本为1。这些配置在创建数据库时可以修改。
Continuous Query
CQ是预先配置好的一些查询命令,定期自动执行这些命令并将查询结果写入指定的measurement中,这个功能主要用于数据聚合。具体参考:CQ。
Shard
存储一定时间间隔的数据,每个目录对应一个shard,目录的名字就是shard id。每一个shard都有自己的cache、wal、tsm file以及compactor,目的就是通过时间来快速定位到要查询数据的相关资源,加速查询的过程,并且也让之后的批量删除数据的操作变得非常简单且高效。
存储引擎
TSM Tree是在LSM Tree的基础上稍作修改优化而来。它主要包含四个部分:cache、wal、tsm file、compactor。
目录结构
InfluxDB的数据存储有三个目录,分别是meta、wal、data。meta用于存储数据库的一些元数据,meta目录下有一个meta.db文件。wal目录存放预写日志文件,以.wal结尾。data目录存放实际存储的数据文件,以.tsm结尾。基本结构如下:
其中 test是数据库名称,autogen是存储策略名称,再下一层目录中的以数字命名的目录是 shard 的 ID 值,比如 autogen存储策略下有两个 shard,ID 分别为 1 和 2,shard存储了某一个时间段范围内的数据。再下一级的目录则为具体的文件,分别是 .wal和 .tsm结尾的文件。
更详细的参考:InfluxDB详解之TSM存储引擎解析(http://blog.fatedier.com/2016/08/05/detailed-in-influxdb-tsm-storage-engine-one/)。
实践
gateway用于检测和压缩influxdb的数据,用于跨机房传输,采用udp接受数据。
influxdb-relay是官方提供的高可用方案,但是它只提供简单的写入功能。
influxdb-proxy是用于替代influxdb-relay的高可用方案。
前期架构图
使用问题
influxdb-relay是官方提供的高可用方案,但是它只提供简单的写入功能。在初期使用时,并没有多大的问题,随着influxdb在公司的推广,接入方越来越多,意味着查询方越来越多,这就带来了以下问题:
踩过的坑
优化后的架构图
influxdb-proxy是为了解决上面的使用问题而开发出来的。具有以下功能:
数据聚合
influxdb提供数据聚合的功能,就是上面基本概念里提到的Continuous Query。预先定义好cq,就可以定期根据不同的tag进行聚合数据。目前它有个设计问题:cq是顺序执行的,cq越多,数据延迟越高,一般延迟在几分钟内。如果需要更实时的聚合,cq不能满足,需要引入其他工具,比如Spark。
Spark
经过内部调研,发现spark+kafka是个更好的聚合方案。spark支持流式处理且支持sql功能,我们只需要将cq改成sql就行。目前这个处于尝试阶段,已经上线部分功能。目前的处理流程如下:
总结
上文讲的整套架构已经支撑起饿了么2万台机器的监控,目前每秒写入的点数是300k。后端influxdb的机器数量是20台左右,维护成本基本趋于零。我们的焦点目前已经从influxdb转移到数据聚合和分析上。
刘平,基于saltstack开发配置管理系统,服务于饿了么上万台机器管理;基于golang、influxdb、grafana开发监控系统,服务于饿了么上万台机器以及基础设施。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有