InfluxDB
简述
时间序列数据:从定义上来说,就是一串按时间维度索引的数据。
时序数据库(TSDB)特点:
持续高并发写入、无更新;
数据压缩存储;
低查询延时。
常见 TSDB:influxdb、opentsdb、timeScaladb、Druid 等。
概念
influxdb是一个开源分布式时序、时间和指标数据库,使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展,是 InfluxData 的核心产品。
应用:性能监控,应用程序指标,物联网传感器数据和实时分析等的后端存储。
相关特点
1) 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等);
2) 可度量性:你可以实时对大量数据进行计算;
3) 基于事件:它支持任意的事件数据;
4) 无结构(无模式):可以是任意数量的列;
5) 支持min, max, sum, count, mean, median 等一系列函数;
6) 内置http支持,使用http读写;
7) 强大的类SQL语法;
8) 自带管理界面,方便使用(新版本需要通过Chronograf)
模型和基本概念
databases、series、measurements、tag keys和field keys
与传统数据库相关区别,和传统数据库相比,influxdb在相关概念上有一定不同,具体如下:
influxdb 中的概念 传统数据库中的概念
database 数据库
measurement 数据库中的表
point 表中的一行数据
point的数据结构由时间戳(time)、标签(tags)、数据(fields)三部分组成,具体含义如下:
point属性 含义
time 数据记录的时间,是主索引(自动生成)
tags 各种有索引的属性
fields 各种value值(没有索引的属性)
保留策略(retention policy)
每个数据库刚开始会自动创建一个默认的存储策略 autogen,数据保留时间为永久,在集群中的副本个数为1,之后用户可以自己设置(查看、新建、修改、删除),例如保留最近2小时的数据。插入和查询数据时如果不指定存储策略,则使用默认存储策略,且默认存储策略可以修改。InfluxDB 会定期清除过期的数据。
每个数据库可以有多个过期策略:
show retention policies on "db_name"
Shard 在 influxdb中是一个比较重要的概念,它和 retention policy 相关联。每一个存储策略下会存在许多 shard,每一个 shard 存储一个指定时间段内的数据,并且不重复,例如 7点-8点 的数据落入 shard0 中,8点-9点的数据则落入 shard1 中。每一个 shard 都对应一个底层的 tsm 存储引擎,有独立的 cache、wal、tsm file。
这样做的目的就是为了可以通过时间来快速定位到要查询数据的相关资源,加速查询的过程,并且也让之后的批量删除数据的操作变得非常简单且高效。
建议在数据库建立的时候设置存储策略,不建议设置过多且随意切换
create database testdb2 with duration 30d
连续查询
influxdb 的连续查询是在数据库中自动定时启动的一组语句,语句中必须包含
SELECT 等关键词。influxdb 会将查询结果放在指定的数据表中。
目的:使用连续查询是最优的降低采样率的方式,连续查询和存储策略搭配使用将会大大降低 InfluxDB 的系统占用量。而且使用连续查询后,数据会存放到指定的数据表中,这样就为以后统计不同精度的数据提供了方便。
CREATE CONTINUOUS QUERY wj_30m ON shhnwangjian
BEGIN
SELECT mean(connected_clients), MEDIAN(connected_clients),
MAX(connected_clients), MIN(connected_clients)
INTO redis_clients_30m
FROM redis_clients
GROUP BY ip,port,time(30m)
END
/*在shhnwangjian库中新建了一个名为 wj_30m 的连续查询,
每三十分钟取一个connected_clients字段的平均值、中位值、最大值、最小值 redis_clients_30m 表中,
使用的数据保留策略都是 default。*/
当数据超过保存策略里指定的时间之后就会被删除,但是这时候可能并不想数据被完全删掉,可以使用连续查询将数据聚合储存。
操作优化
1.控制 series 的数量;
2.使用批量写;
3.使用恰当的时间粒度;
4.存储的时候尽量对 Tag 进行排序;
5.根据数据情况,调整 shard 的 duration;
6.无关的数据写不同的database;
7.控制 Tag Key, 与 Tag Value 值的大小;
8.存储分离 ,将 wal 目录与 data 目录分别映射到不同的磁盘上,以减少读写操作的相互影响。
InfluxDB的优势
InfluxDB专注于DevOps监控、IoT监控等场景,针对时序存储、高性能读写、实时操作、高可用性而设计的一套软件,
从零设计架构和开发,InfluxDB通过实现高度可扩展的数据接收和存储引擎,可以高效地实时收集、存储、查询、可视化显示和执行预定义操作。
它通过采样和数据保留策略,以支持将高价值、高精度数据保存在内存中,将低价值数据保存到磁盘。作为一套精心设计、架构卓越的专用系统,
相比OpenTSDB、MongoDB、Graphite、Cassandra等,InfluxDB的性能优势和成本优势明显。
注意:
需要注意的是,influxdb虽然很多时候都可以通过SQL语句操作,但数据更新例外。influxdb中数据更新只能重新Insert,且需要tags和时间戳相同,
所以不建议大量更新数据。极少出现删除数据的情况,删除数据基本都是清理过期数据。
简单使用
# 先创建一个DataBase
CREATE DATABASE monitor;
use monitor;
# 写入上图中的数据(系统会自动创建Measurement)
# 写入第一条时间线数据
INSERT CPU,role=FrontServer,addr=192.168.1.1 load1=24,load5=21,load15=18 1554076800
INSERT CPU,role=FrontServer,addr=192.168.1.1 load1=27,load5=22,load15=18 1554077100
INSERT CPU,role=FrontServer,addr=192.168.1.1 load1=29,load5=23,load15=19 1554077400
# 写入第二条时间线数据
INSERT CPU,role=BackendServer,addr=192.168.1.3 load1=11,load5=18,load15=15 1554076800
INSERT CPU,role=BackendServer,addr=192.168.1.3 load1=10,load5=13,load15=13 1554077100
INSERT CPU,role=BackendServer,addr=192.168.1.3 load1=10,load5=12,load15=13 1554077400
查看Series、Measurement、Tag keys和Felid keys
# 显示时间线
show series
# 显示度量
show measurements
# 显示Tag的Key
show tag keys
# 显示数据字段的Key
show field keys
# 查看自定度量的数据, 里面的相关字段,官方建议使用“双引号”标注出来
select * from "CPU" order by time desc
# 查看指定的Field和Tag
select "load1","role" from "CPU" order by time desc
# 只查看Field
select *::field from "CPU"
# 执行基本的运算
select ("load1" * 2) + 0.5 from "CPU"
# 查询指定Tag的数据,注意,Where子句的字符串值要使用“单引号”,字符串值
# 如果没有使用引号或者使用了双引号,都不会有任何值的返回
select * from "CPU" where role = 'FrontServer'
# 查询Field中,load1 > 20 的所有数据
select * from "CPU" where "load1" > 20