哪些情况下用tag

一般来说,你的查询可以指引你哪些数据放在tag中,哪些放在field中。

  • 把你经常查询的字段作为tag
  • 如果你要对其使用GROUP BY(),也要放在tag中
  • 如果你要对其使用InfluxQL函数,则将其放到field中
  • 如果你需要存储的值不是字符串,则需要放到field中,因为tag value只能是字符串

终端操作数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
查看所有数据库
show databases;

// 添加数据库
create database [database]

// 删除数据库
drop datebase [databese]

// 指定数据库
use [database]

// 查看指定数据库下所有measurement
show measurements

// 删除measurement
drop measurement [measurement]

// 用drop从索引中删除series
drop series from <measurement_name[,measurement_name]> where <tag_key>='<tag_value>'

// 从单个measurement删除所有series:
drop series from "h2o_feet"

//从单个measurement删除指定tag的series:
drop series from "h2o_feet" where "location" = 'santa_monica'


从数据库删除有指定tag的所有measurement中的所有数据:
drop series where "location" = 'santa_monica'

//用delete删除series
delete from <measurement_name> where [<tag_key>='<tag_value>'] | [<time interval>]

//删除measurementh2o_feet的所有相关数据:
delete from "h2o_feet"

// 删除measurementh2o_quality并且tagrandtag等于3的所有数据:
delete from "h2o_quality" where "randtag" = '3'

// 删除数据库中2016年一月一号之前的所有数据:
delete where time < '2016-01-01'

终端插入数据

1
2
3
4
5
6
7
8
格式:

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

示例:
insert cpu,host=servera,region=us_west value=0.64

insert temperature,machine=unit42,type=assembly external=25,internal=37

数据写入(网络通讯)

  • 使用http接口创建/删除数据库
1
2
3
curl -i -xpost http://localhost:8086/query --data-urlencode "q=create database dapengstate"

curl -i -xpost http://localhost:8086/query --data-urlencode "q=drop database dapengstate"
  • 使用http接口写数据

通过http接口post数据到/write路径是我们往influxdb写数据的主要方式。下面的例子写了一条数据到mydb数据库。这条数据的组成部分是measurement为cpu_load_short,tag的key为host和region,对应tag的value是server01和us-west,field的key是value,对应的数值为0.64,而时间戳是1434055562000000000

1
curl -i -xpost 'http://localhost:8086/write?db=dapengstate' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
  • 写入多个点
1
2
3
curl -i -xpost 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
  • 通过文件写入数据

    可以通过curl的@filename来写入文件中的数据,且这个文件里的数据的格式需要满足influxdb那种行的语法。

cup_data.txt

1
2
3
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257

写入

1
curl -i -xpost 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt

查询数据

1
curl -g 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=select \"value\" from \"cpu_load_short\" where \"region\"='us-west'"

返回值(json)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-06-11t20:46:02z",
0.64
]
]
}
]
}
]
}
  • pretty=ture参数在url里面,是为了让返回的json格式化。这在调试或者是直接用curl的时候很有用,但在生产上不建议使用,因为这样会消耗不必要的网络带宽。

  • 多个查询

1
curl -g 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=select \"value\" from \"cpu_load_short\" where \"region\"='us-west';select count(\"value\") from \"cpu_load_short\" where \"region\"='us-west'"

数据采样/数据保留策略

需求:

  • 自动将十秒间隔数据聚合到30分钟的间隔数据
  • 自动删除两个小时以上的原始10秒间隔数据
  • 自动删除超过52周的30分钟间隔数据
    如果我们写数据的时候没有指定rp的话,influxdb会使用默认的rp

  • 创建一个保留两小时的数据的rp

    1
    create retention policy "two_hours" on "food_data" duration 2h replication 1 default

创建数据库时,influxdb会自动生成一个叫做autogen的rp,并作为数据库的默认rp,autogen这个rp会永远保留数据。在输入上面的命令之后,two_hours会取代autogen作为food_data的默认rp。

  • 创建一个保留52周数据的RP
1
create retention policy "a_year" on "food_data" duration 52w replication 1

创建CQ(Continuous Query/连续查询)

1
2
3
4
5
6
create continuous query "cq_30m" on "food_data" begin
select mean("website") as "mean_website",mean("phone") as "mean_phone"
into "a_year"."downsampled_orders"
from "orders"
group by time(30m)
end

注意到我们在into语句中使用了”“.”“这样的语句,当要写入到非默认的rp时,就需要这样的写法。

上面创建了一个叫做cq_30m的cq作用于food_data数据库上。cq_30m告诉influxdb每30分钟计算一次measurement为orders并使用默认rptow_hours的字段website和phone的平均值,然后把结果写入到rp为a_year,两个字段分别是mean_website和mean_phone的measurement名为downsampled_orders的数据中。influxdb会每隔30分钟跑对之前30分钟的数据跑一次这个查询。

  • 创建数据库时指定保留策略
1
create database "noaa_water_database" with duration 3d replication 1 shard duration 1h name "liquid"

该语句创建了一个叫做noaa_water_database的数据库,并且创建了liquid作为数据库的默认保留策略,其持续时间为3天,副本数是1,shard group的持续时间为一个小时。

  • 修改保留策略
1
alter retention policy <retention_policy_name> on <database_name> duration <duration> replication <n> shard duration <duration> default

创建保留策略what_is_time其持续时间为两天

1
create retention policy "what_is_time" on "noaa_water_database" duration 2d replication 1

修改what_is_time的持续时间为3个星期,shard group的持续时间为30分钟,并将其作为数据库noaa_water_database的默认保留策略:+

1
alter retention policy "what_is_time" on "noaa_water_database" duration 3w shard duration 30m default
  • 删除保留策略
1
drop retention policy <retention_policy_name> on <database_name>

如何查看InfluxDB的版本

终端:

1
influxd version

curl:

1
curl -i 'http://localhost:8086/ping'