引言
最近项目中需要使用TICK监控方案实现对于服务器运行状态、服务运行状态等运行时状态监控以及告警。所谓TICK即为Telegraf+InfluxDB+Chronograf +Kapacitor。本文主要介绍SpringBoot结合Influxdb实现数据查询的方法,网上相关的资料不多。所以想在此记录下学习的过程,一方面是对自己学习过程的记录,另一方面希望也可以给需要的同学一点经验分享。(网上已经有InfluxDB安装相关的文章,这里就不再进行赘述)
TICK各个模块说明如下所示:
T(Telegraf):服务监控数据采集,包括服务器CPU、内存、IO、进程状态、服务状态等等;
I(InfluxDB):时序型数据库,存储Telegraf采集的监控数据,每条数据都会有time序列;
C(Chronograf):时间序列数据可视化展示;
K(Kapacitor):可以按照预先编写好的规则,实时地订阅influxDB数据或者批量查询数据,并进行告警。
本文将按照以下几部分进行阐述。
- InfluxDB简要介绍
- InfluxDB相关概念
- InfluxDB数据查询
一、InfluxDB简要介绍
InfluxDB是一款Go语言实现的开源时序性数据库,它不需要外部依赖。其设计目的主要用于系统的水平式以及分布式扩展,它对于数据的实时分析,历史数据展示等都提供了良好的支持。插句题外话,学习一项新技术的最好办法就是阅读它的官方文档,大部分的技术官方文档都是英文的,读起来稍微有点费劲,但是只要坚持下去,配上谷歌翻译,并没有想象中那么难。因为官方文档应该是作者对于该技术最原汁原味的理解和叙述,其他翻译的有可能会丢失部分原作者的技术理解。废话不多说,InfluxDB提供的主要特性如下:
1.内置HTTP API,所以我们不需要另外写服务端的代码来启动和运行它;
2.它可以为每条数据打上标签,实现更加方便快捷的数据查询;
3.提供类SQL的查询语句,可以实现几乎无成本的SQL学习迁移,方便开发者快速掌握;
4.数据库安装和管理更加简便,快速的数据保存以及读取;
5.它的目的是实时的数据查询响应,当数据进入数据库时将被索引,同时数据的查询结果要在100ms内进行返回。
二、InfluxDB相关概念
|database|field key|field set| |:–:| :–:|:–: | |field value|measurement|point| |retention policy|series|tag key| |tag set|tag value| timestamp| 下面将对这些概念进行说明。
time | cpu | usage_idle | host |
---|---|---|---|
1526035302000000000 | cpu-total | 43.952299828963156 | OS1 |
1526035302000000000 | cpu0 | 0 | OS1 |
1526035302000000000 | cpu1 | 89.58333333455441 | OS1 |
1526035302000000000 | cpu-total | 46.952299823520136 | OS2 |
1526035302000000000 | cpu0 | 0 | OS2 |
1526035302000000000 | cpu1 | 91.58333339451375 | OS2 |
influxDB是时序性数据库,所以每一条数据都带有时间戳。
服务器cpu数据存在influxDB中的cpu表中,其中cpu
为cpu
名称,host
为机器名称,time
是数据库中每条数据都会自带的时间戳,是fluxDB区别于其他数据库的重要特征之一。usage_idle
,cpu
被称为fields
,它是由对应的field key
以及field value
组成。由于influxDB是时序性数据库,所以每个field value都有对应的时间戳与其进行对应。由上表可知,每组field key
和field value
的集合组成了field set
。
field
是influxDB中不可获取的数据组成部分,每一条存放在数据库中的数据都包含field
。但是field
本身是没有索引的,如果以field为条件进行数据查询的时候,数据库会遍历库中所有的field直到匹配到对应的field
,这样的查询是很耗费资源的。所以尽量在索引上去执行数据操作。
以上数据库表中host
就相当于tag,因为它是带有索引属性的,通过它作为条件可以进行数据的筛选,意味着通过它来进行查询操作效率更高。
InfluxDB中measurement
作为tag,fields和time列的容器,measurement
的名字是存储在相关fields
数据的描述。 measurement的名字是字符串,相对于传统关系型数据库,influxDB中的measurement
就相当于mysql中的table
。
在样本数据中,measurement census
中的所有内容都属于autogen
的retention policy
。 InfluxDB自动创建该存储策略, 它具有无限的持续时间和复制因子设置为1。
现在我们已经熟悉了measurement
,tag set
和retention policy
,那么现在是讨论series
的时候了。 在InfluxDB中,series
是共同retention policy
,measurement
和tag set
的集合。
series编号 | retention policy | measurement | tag set |
---|---|---|---|
series 1 | autogen | cpu | host=OS1 |
最后,point
就是具有相同timestam
p的相同series
的field
集合。
三、InfluxDB数据查询
1.linux环境相关操作
(1) 在linux环境安装好influxDB之后,进入root权限下输入influx,linux显示如下:
(2) 输入use telegraf_1,表示使用telegraf_1这个数据库。
(3) 输入show measurements,展示该库中存在的表有哪些。后面就可以像普通sql查询一样,使用select语句进行查询的了,但是注意在查询语句后面加上limit做限制,不然会查询出来时间段内所有的数据。
SpringBoot工程中需要使用对应的Java Client library来进行相关的数据库操作。在pom文件中引入以下依赖,由于本文需要使用sql的参数化查询功能,所以使用的client版本为2.10。
<dependency>
<groupId>org.influxdbgroupId>
<artifactId>influxdb-javaartifactId>
<version>2.10version>
dependency>
以下代码为influxDb构建方法,代码中附有部分注释方便读者理解。
//构建InfluxDB客户端
@Configuration
public class InfluxdbBuilder {
Logger logger = LoggerFactory.getLogger(InfluxdbBuilder.class);
/**
*
* 方法功能描述:服务启动时向Spring容器注入influxDB bean
* @author taomeng 2018年5月15日 上午10:44:30
* @return
*/
@Bean("influxDB")
public InfluxDB createInfluxDB() {
InfluxDB influxDB = null;
if (null == influxDB) {
try {
//influxDb默认端口为8086,默认没有用户名和密码
influxDB = InfluxDBFactory.connect("http://127.0.0.1:8086", " ", " ");
} catch (Exception e) {
logger.error("Connect influxDB has a excecption", e);
}
}
//指定对应的数据库名称
influxDB.setDatabase("telegraf");
return influxDB;