时序数据存储系统 InfluxDB
2019-01-08 本文已影响8人
SlowGO
InfluxDB 是一款开源的用于存储时序数据的存储系统。
由于时序数据是随时间变化而产生的,每分每秒都会产生数据,而且这个数据量还会不断积累,最终将形成一个庞大的数据集。InfluxDB天生就用来存储这些大数据,同时还能对外提供高效的数据查询功能。
InfluxDB 非常适合记录指标数据、事件数据,并执行分析。
特性:
- 内置 http api,无需写任何服务端代码
- 数据可以加标签,能够灵活的查询
- 类似 SQL 的查询语言
- 安装和管理非常简单
- 解决实时查询需求,每个数据一进来就被编入索引,100ms 内就可以被查询
项目地址:
https://github.com/influxdata/influxdb
启动:
$ docker run \
-d \
-p 8086:8086 \
-v ~/influxdb:/var/lib/influxdb \
--name influxdb \
influxdb
进入容器内部,登录客户端:
$ docker exec -it influxdb influx
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query
>
查看数据库:
> show databases;
name: databases
name
----
_internal
现在只有一个名为 _internal 的数据库,它是内部数据库。
新建数据库:
> create database mydb;
>
> show databases;
name: databases
name
----
_internal
mydb
可以看到新建成功了。
使用新建的库:
> use mydb;
Using database mydb
插入时序数据:
> insert cpu,host=server01,region=uswest load=42 1434055562000000000
> insert cpu,host=server02,region=uswest load=78 1434055562000000000
> insert cpu,host=server03,region=useast load=15.4 1434055562000000000
# 时间戳可以不加,插入时自动生成
> insert cpu,host=server01,region=uswest load=33
insert 命令所插入的数据中包含3个部分:
- measurement - 量度,类似关系型数据库中的数据表(如cpu)【只能有一个】
- tag - 标签,类似关系型数据库中的索引,用
key=value
结构表示,每个tag用 “,” 分隔(如host=server01,region=uswest)【可以有多个】 - field - 字段,类似关系型数据库中的字段,field 用
key=value
结构表示(如load=42)
查询:
> SELECT * FROM cpu WHERE host='server01' AND time < now() - 1d
name: cpu
time host load region
---- ---- ---- ------
1434055562000000000 server01 42 uswest
统计:
> SELECT mean(load) FROM cpu WHERE region='uswest'
name: cpu
time mean
---- ----
0 51
从 cpu 度量中 根据标签查询。
InfluxDB也提供了便于使用的REST API,例如:
curl -XPOST "http://localhost:8086/write?db=mydb" \
-d 'cpu,host=server01,region=uswest load=42 1434055562000000000'
curl -XPOST "http://localhost:8086/write?db=mydb" \
-d 'cpu,host=server02,region=uswest load=78 1434055562000000000'
curl -XPOST "http://localhost:8086/write?db=mydb" \
-d 'cpu,host=server03,region=useast load=15.4 1434055562000000000'
curl -G "http://localhost:8086/query?pretty=true" --data-urlencode "db=mydb" \
--data-urlencode "q=SELECT * FROM cpu WHERE host='server01' AND time < now() - 1d"
curl -G "http://localhost:8086/query?pretty=true" --data-urlencode "db=mydb" \
--data-urlencode "q=SELECT mean(load) FROM cpu WHERE region='uswest'"