Influxdb 介绍与使用

基本概念

与传统数据库对比

时间序列数据库,主键永远是时间time
Influxdb 介绍与使用

point

Influxdb 介绍与使用

measurement

一类数据
Influxdb 介绍与使用

series

数据序列
Influxdb 介绍与使用

  • 一个series就是一个测点,或者说一条曲线,那么retention policy, measurement, tagset就共同组成了一个定位测点序列的唯一标识。
  • point,就是某个series的同一个时刻的多个field的value,就组成了一个point;其实就是一般曲线上的一个点。
  • InfluxDb不需要做schema定义,这意味着你可以随意的添加measurements, tags, and fields at any time,

初步使用

下载和安装

请参考官网。本人使用docker来运行,并从官网下载客户端命令行工具influx

//下载influx客户端,其实这个压缩包已经包含了influxdb,不过我只需要客户端influx
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.4.2_linux_amd64.tar.gz
tar xvfz influxdb-1.4.2_linux_amd64.tar.gz

//将/usr/local/bin/influx 连接到influxdb-1.4.2/usr/bin/influx
ln -s influxdb-1.4.2/usr/bin/influx /usr/local/bin/influx

//docker
docker pull registry.docker-cn.com/tutum/influxdb
docker tag registry.docker-cn.com/tutum/influxdb:latest tutum/influxdb

//8083是influxdb的web管理工具端口,8086是influxdb的HTTP API端口
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdb

//连接客户端,默认连接到localhost:8086
influx

//指定host port user pasword连接


influx其他参数请使用:influx --help

//退出
exit

用户管理

# 显示用户列表
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdbshow users;
# 创建用户
create user "use_name" with password 'user_password'' with all privileges;
# 删除用户
drop user "user_name"
# 使用账号密码登陆(influx 默认不启动认证机制,需要修改配置文件来启动认证机制)
influx -host 'influxdb_host' -port '8086' -username 'user_name'

database

show databases
create database test
use db_name
drop database test

measurement

measurement无需创建语法,只需在插入时指定measurement即可,influx会根据你的插入的数据创建相应的measurement结构

insert

//语法
select|insert <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

insert your_measurement,tag_name=tag_value... column_name=column_value

//例子
insert payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i // i是integer的意思,默认数字是float


//指定时间
insert payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1516167115623067775

select

select * from payment
select billed from payment  //查询time billed字段

//如果字段名或者measurement是关键字,那么可以使用引号。如user是关键字
//注意,不能只select *或者select field字段
select * from "user"

//select device from paymet是错误的

//限制查询数量:limit
//注意select的内容要么是*,要么是field
select * from payment limit 10

//select "device" from payment 是错误的,因为没有field字段

//where
select * from payment where billed > 10
select * from payment where "device"='mobile'  #注意引号的使用

//and or not
select * from payment where billed > 10 and "device"='mobile'

select * from payment where time > '2018-07-19 03:00:00'
select * from payment where time > now() - 1h

delete

delete from where tag_key=tag_value and ... or ...

update

influxdb 是没有update的(一般数据仓库只用户数据存储与查询)

where

  • group by

    select sum(billed) from payment group by "device"
    select sum(billed) from payment group by time(30m) //30m聚合一次数据`

常用的聚合函数有count、disinct、mean(平均值)、median(中位数)、spread(最小值和最大值之间的差值)、sum等。

选择类函数

select top("billed",3) from payment

常用的选择类函数有

  • top 返回最大的n个值,如top("billed", 3) 返回billed的最大的三条记录。如果measurement的总记录数m小于n,则返回m条
  • bottom 返回最小的n个值,用法同top
  • first 返回time字段最小的纪录的字段,如first("billed") 返回time最小的纪录的billed字段
  • last 返回time字段最大的纪录的字段,用法同last
  • max
  • min
  • percentile 选取某个字段中大于N%的这个字段值。如果一共有4条记录,N为10,则10%*4=0.4,四舍五入为0,则查询结果为空。N为20,则 20% * 4 = 0.8,四舍五入为1,选取的是4个数中最小的数。如果N为40,40% * 4 = 1.6,四舍五入为2,则选取的是4个数中第二小的数。由此可以看出N=100时,就跟MAX(field_key)是一样的,而当N=50时,与MEDIAN(field_key)在字段值为奇数个时是一样的。
  • 其他不细说,DERIVATIVE为变化率、DIFFERENCE数值差异、ELAPSED字段在连续的时间间隔间的差异、MOVING_AVERAGE、NON_NEGATIVE_DERIVATIVE、STDDEV标准偏差

drop

删除整个measurement

drop measurement measurement_name;

其他

  • 不要用引号括住数值或字符串
  • insert时不要用引号括住measurement
  • 如果measurement或者字段有引号,需要使用转义:
SELECT * FROM "\"weather\""
  • 对于一些符号如:, = 空格 ,如果出现在measuremnt或者字段,需要转义

连续查询

可见https://www.linuxdaxue.com/in...

  • InfluxDB的连续查询是在数据库中自动定时启动的一组语句,语句中必须包含 SELECT 关键词和 GROUP BY time() 关键词。
  • InfluxDB会将查询结果放在指定的数据表中。
  • 一般用于定时聚合数据,如聚合访问记录为每天访问量。连续查询主要用在将数据归档,以降低系统空间的占用率,主要是以降低精度为代价。连续查询和存储策略搭配使用将会大大降低InfluxDB的系统占用量。
  • 只有管理员才可以操作连续查询

语法

create continuous query cq_name on db_name [resample [every <interval>][for <interval>]]
begin
select <function><field>,... into measurement_1
from measurement_2 where... group by time(time<interval>)
end

//例子
create continuous query billed_30 on payment begin select sum(billed) into billed_30min from payment group by time(30m) end
//这个连续查询会每30分钟执行一次
  • resample every用于指定运行的频次,如resample every 30m表示 每30m运行一次
  • resample for 指定连续查询的时间范围。如create ... resample for 60m every 30m ... group by time(30m)表示,每30m运行一次,每次将1小时的数据执行连续查询,也就是说,每次执行时,会将now()到now()-30m和now()-30m到now()-60m分别做连续查询,这样我们就可以手动指定连续查询的时间范围了。

显示所有连续查询

show continuous queries

删除

drop continuous query cq_name on db_name

保存策略

InfluxDB本身不提供数据的删除操作,因此用来控制数据量的方式就是定义数据保留策略。

查看现有策略

show retention policies on db_name

--------------------------output---------------------------
name    duration    shardGroupDuration    replicaN    default
default    0        168h0m0s        1        true
  • 每个db都有一个默认的策略,每个策略都有shardGroupDuration时间,检测的时间窗口,默认为7d
  • duration--持续时间,0代表无限制,如duration 1h,即只保留一小时内的数据
  • replicaN--全称是REPLICATION,副本个数

新建策略

create retention policy "policy_name" on "db_name" duration <time> replication n [default]

//例子
create retention policy "3_hour" on "test" duration 3h default

修改策略

alter retention policy "3_hour" on "test" duration 4h default

删除策略

drop retention policy "3_hour" on "test"

数据备份与回复

doc https://docs.influxdata.com/e...

先从之前下载的压缩包中获取备份工具

ln -s influxdb-1.4.2/usr/bin/influxd /usr/local/bin/influxd

本地数据备份

//语法
influxd backup -database db_name [since 2018-07-02 12:00:00] path_to_back
//since可以指定备份某个时间点之后的数据

//例子
influxd backup payment ~/tmp/backup/payment

远程备份

influxd backup -database db_name -hosthost:port [since 2018-07-05 13:00:00]path_backup

数据恢复

influxd restore [ -metadir | -datadir ] <path-to-meta-or-data-directory> <path-to-backup>


//例子
influxd restore -database payment -metadir /var/lib/influxdb/meta -datadir /var/lib/influxdb/data ~/tmp/backup/payment
//注意,在restore之前需要把influxd stop,restore后重启influxd数据才会成功恢复

reference

相关推荐