基本概念
与传统数据库对比
时间序列数据库,主键永远是时间time
point
measurement
一类数据
series
数据序列
- 一个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
- https://www.linuxdaxue.com/no...,也是本文的图片来源
- https://www.influxdata.com/bl..., retention policy
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。