时序数据库InfluxDb操作相关
简介
时序数据库就是存放事件序列数据的数据库,需要支持时序数据的快速写入、持久化、多维度的聚合查询等基本功能。
时间序列数据是基于时间的一系列数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
使用docker安装
下载镜像
docker pull influxdb:1.8.0
最新版为2.1.1,2.x相比1.x改动较大
查看版本
docker run --rm influxdb:1.8.0 influxd version
输出为
InfluxDB v1.8.0 (git: 1.8 781490de48220d7695a05c29e5a36f550a4568f5)
生成默认配置文件(2.1.1版本需要)
docker run --rm influxdb influxd print-config > config.yml
--rm 表示容器退出时自动清理用户数据,包括匿名的data volumes。
使用配置文件重新启动容器(2.1.1版本)
docker run -d -p 8086:8086 -v /root/test_influxdb/config.yml:/etc/influxdb2/config.yml --name influxdb2 influxdb
启动容器(1.8.0版本)
docker run -d -p 8086:8086 --name influxdb influxdb:1.8.0
防火墙开启8086端口,就可以通过浏览器(ip:8086)访问页面了(2.1.1版本才有可视化界面)。
客户端连接使用(1.8.0版本)
influxdb1.8-windows下载地址
高版本如2.1.1压缩包中没有客户端工具
influx -host ${your_ip} -p 8086
创建用户并分配权限
客户端连接之后
show users # 显示所有用户
create user "root" with password 'xxx' # 必须前面双引号,后面单引号,具体原因未知
grant all privileges to root # 分配权限
drop user "root" # 删除用户
服务器开启认证
docker cp influxdb:/etc/influxdb/influxdb.conf .
开启认证
[http]
auth-enabled = true
docker cp influxdb.conf influxdb:/etc/influxdb/
docker restart influxdb
重启容器就可以了
客户端使用账号密码连接
influx -host xxx -p 8086 -username root
连接时不使用账号密码,任何命令都会报错
ERR: unable to parse authentication credentials
使用账号密码
influx -host xxx -p 8086 -username root -password xxx
读写数据
创建数据库
show databases # 显示所有数据库
create database testdb # 创建数据库
use testdb # 切换数据库
show measurements # 查询所有measurement,类似查询tables
语法和SQL类似
写入数据
将数据点写入InfluxDB,只需要遵守如下的行协议:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
下面是数据写入InfluxDB的格式示例:
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
实际插入
INSERT cpu,host=serverA,region=us_west value=0.64
这样一个measurement为cpu,tag是host和region,value值为0.64的数据点被写入了InfluxDB中。我们在写入的时候没有包含时间戳,InfluxDB会自动添加本地的当前时间作为它的时间戳。
INSERT cpu,host=serverA,region=us_west value=0.64,value1=0.57
可以再次插入一条
数据查询
select * from cpu
类似于SQL的表数据查询,默认时间格式为纳秒级时间戳
precision rfc3339
再次查询,时间格式为国际标准时间,还可以使用tz指定时区
select * from cpu tz('Asia/Shanghai')
数据删除
delete form cpu where host='serverA'
where条件可以使用tag和time,不允许使用field,tag-value必须使用单引号,具体原因未知。
保留策略
如果influxdb中的数据不设置超时过期的机制的话,那么数据就会默认一直保存。这样一直保存的话,数据量就会导致偏大。这时候就要适当调整influxdb的数据存储时长,保留最近一段时间的数据即可。
InfluxDB的数据保留策略(RP)用来定义数据在InfluxDB中存放的时间,或者定义保存某个期间的数据。
一个数据库可以有多个保留策略, 但每个策略必须是独一无二的。
show retention policies on 数据库名 # 查询所有保留策略
默认结果为
name duration shardGroupDuration replicaN default
---- -------- ------------------ -------- -------
autogen 0s 168h0m0s 1 true
- name 策略名称:默认autogen
- duration 持续时间: 0s 代表无限制
- shardGroupDuration shardGroup数据存储时间:shardGroup是InfluxDB的一个基本存储结构, 应该大于这个时间的数据在查询效率上应该有所降低。
- replicaN 副本个数:1 代表只有一个副本
- default 是否默认策略:true 代表设置为该数据库的默认策略
create retention policy "one_hour" on testdb duration 1h replication 1 default
在testdb数据库创建一个保留时间为1分钟的策略,副本1,注意,最小保留时间为1小时,并设置为默认策略
insert cpu,host=serverA value=0.64
插入一条记录,在1个小时之后再次查看数据是否还在,以此验证保留策略是否生效。
insert into one_hour cpu2,host=serverA value=0.11
select * from one_hour.cpu2 # 查询指定RP的measurement
insert one_hour.cpu2,host=serverA value=0.11 # 错误写法,此时数据写到了名称为one_hour.cpu2的measurement中
写数据指定数据库或者RP时,需要使用 insert into。默认db和默认RP写数据使用insert。
注意:没有办法显而易见知道一个measurement到底指定了哪些retention policy。
[retention]
enabled = true #是否启用该模块,默认值 : true
check-interval = "30m" # 检查时间间隔,默认值 :"30m"
添加配置信息,如果不添加,保留策略可以创建成功,但不会生效
连续查询
连续查询在数据库内部自动周期性跑着的一个查询,需要在select语句中使用一个函数,并且一定包括一个group by time()语句。可以看做一个定时任务。
show continuous queries # 查询已有的连续查询
drop continuous query cq_mean_1m on testdb # 删除指定的连续查询
create continuous query "cq_mean_1m" on testdb begin select mean("value") as mean_value into two_hour.cq_cpu from cpu group by time(1m) end
创建一个连续查询,每1分钟执行一次,取cpu中value字段的平均值,写入到cq_cpu中,时间范围1分钟
docker logs xxx
docker容器日志可以看到,执行的语句为
SELECT mean(value) AS mean_value INTO testdb.two_hour.cq_cpu FROM testdb.one_hour.cpu WHERE time >= '2023-01-05T07:07:00Z' AND time < '2023-01-05T07:08:00Z' GROUP BY time(1m)
我们也可以指定时间范围,使用resample every for语法
create continuous query "cq_mean_1m" on testdb resample every 1m for 1d begin select mean("value") as mean_value into two_hour.cq_cpu from cpu group by time(1m) end
每分钟执行一次前1天内的记录
注意:every定义的interval必须大于等于group by定义的,且优先级更高
[continuous_queries]
enabled = true # enabled 是否开启CQs,默认值:true
log-enabled = true # 是否开启日志,默认值:true
run-interval = "1s" # 时间间隔,默认值:"1s"
添加配置信息,如果不添加,连续查询可以创建成功,但不会生效,添加了配置,也没有完全生效,具体原因还需要查找。
与SQL比较
- InfluxDB的measurement和SQL数据库里的table类似;
- InfluxDB的tag类似于SQL数据库里索引的列;
- InfluxDB中的field类似于SQL数据库里没有索引的列;
- InfluxDB里面的数据点类似于SQL数据库的行;
基于这些数据库术语的比较,InfluxDB的continuous query和retention policy与SQL数据库中的存储过程类似。它们被指定一次,然后定期自动执行。
参考
Docker安装InfluxDB
InfluxDB配置admin用户认证登陆
InfluxDB入门指南
与SQL比较
InfluxDB 设置数据保留策略,验证保留的数据存储大小
influxdb基础(四)——influxdb保留策略(retention policy)自动清理过期数据