InfluxDB数据模型和实践
本文是针对没有使用过InfluxDB的读者的一个入门介绍。
主要内容:介绍influx DB的数据模型
对influx DB 官方文档的摘写和导航
实践:使用JAVA对InfluxDB进行读写操作体验InfluxDB的性能
InfluxDB是什么
InfluxDB是开源的时间序列数据库,可用于实时查看堆栈,传感器和系统的指标查看。
优势:时序数据库的优势,在于处理指标数据的聚合,并且读写效率非常高。
特点:influxDB 不支持数据库的更新操作,毕竟时间数据只能随着时间产生新数据,肯定无法对过去的数据修改。
从数据结构上说,时间序列数据数据没有单一的主键标识,必须包含时间戳,数据只能和时间戳进行关联,不适合普通业务数据。
InfluxDB的数据模型InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。
时序数据有零个或多个数据点,每一个都是一个指标值。time(一个时间戳) 【类比SQL中的主键】
measurement(例如cpu_load) 【可以理解为SQL中的table】
至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”) 【类比SQL中的列】
零个或多个tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。【可以理解为列,与field不同的是,tag理解为一个对象,例如server01的主机温度为21.2。并且tag是被索引起来的】
与传统的关系型数据库不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。
将数据点写入InfluxDB,只需要遵守如下的行协议:ps: 注意 tag和field 之间有一个空格
[,=...] =[,=...] [unix-nano-timestamp]
例如:
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
搭建InfluxDB实验环境
本文使用Docker快速搭建。 在dockerHub上搜索InfluxDB的镜像查看使用说明 :https://hub.docker.com/_/influxdb/ 这里安装influxDB最新版本。示例如下。将端口号8086暴露,并将数据映射到本地路径。
docker run -d --name influxdbdemo1 -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb
验证 到此部署成功。
influx 命令行工具
有很多可以向InfluxDB写数据的方式,包括命令行、客户端还有一些像Graphite有一样数据格式的插件。influx这个工具包含在InfluxDB的安装包里,是一个操作数据库的轻量级工具。它直接通过InfluxDB的HTTP接口(如果没有修改,默认是8086)来和InfluxDB通信。 说明:也可以直接发送裸的HTTP请求来操作数据库,例如curl
进入到容器中.
docker exec -it influxdbdemo1 /bin/bash
root@09460d9e8053:/# influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.1
InfluxDB shell version: 1.8.1-precision参数表明了任何返回的时间戳的格式和精度,在上面的例子里,rfc3339是让InfluxDB返回RFC339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)的时间戳
influxdb的DDL命令和mysql的命令很相似创建数据库:
CREATE DATABASE [WITH [DURATION ] [REPLICATION ] [SHARD DURATION ] [NAME ]]切换数据库: use [数据库名称]
插入数据: insert [数据点]
查询数据: select * from [measurement]
示例如下:
root@09460d9e8053:/# influx -precision rfc3339
Connected to http://localhost:8086 version 1.8.1
InfluxDB shell version: 1.8.1
> CREATE DATABASE mydb
> show databases
name: databases
name
----
_internal
mydb
> use mydb
Using database mydb
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> SELECT * FROM "temperature"
name: te