时序数据库InfluxDb操作相关

发布时间 2023-09-03 11:03:07作者: strongmore

简介

时序数据库就是存放事件序列数据的数据库,需要支持时序数据的快速写入、持久化、多维度的聚合查询等基本功能。

时间序列数据是基于时间的一系列数据。在有时间的坐标中将这些数据点连成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。

使用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)自动清理过期数据