参考influxdb中文文档
参考时间序列数据库排名db-engines
参考Python操作InfluxDB指南
1 influxdb简介
InfluxDB是一个用于存储和分析时间序列数据的开源数据库。
InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。InfluxDB 包括用于存储和查询数据,在后台处理ETL或监视和警报目的,用户仪表板以及可视化和探索数据等的API。
1.1 功能
用途:处理时间序列数据。
(1)专为时间序列数据编写的自定义高性能数据存储。 TSM引擎允许高摄取速度和数据压缩。
(2)完全用 Go 语言编写。 它编译成单个二进制文件,没有外部依赖项。
(3)简单,高性能的写入和查询HTTP API。
(4)插件支持其他数据提取协议,如Graphite,collectd和OpenTSDB。
(5)专为类似SQL的查询语言量身定制,可轻松查询聚合数据。
(6)标签允许对系列进行索引以实现快速有效的查询。
(7)保留策略有效地自动使过时数据过期。
(8)连续查询自动计算聚合数据,以提高频繁查询的效率。
InfluxDB 的开源版本只支持一个节点。
2 Centos7安装InfluxDB
安装InfluxDB最新的稳定版本yum包管理器。
RHEL一般指Red Hat Enterprise Linux。
Red Hat公司发布的面向企业用户的Linux操作系统。
2.1 安装
#vi /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
#yum search influxdb
#yum list influxdb查看可安装版本【1.8.6-1】
#yum install influxdb
#systemctl enable influxdb开机自启动
#systemctl start influxdb
#systemctl status influxdb
安装完成后的配置文件/etc/influxdb/influxdb.conf。
/usr/bin/influxd influxdb服务器
/usr/bin/influx influxdb命令行客户端
/usr/bin/influx_inspect 查看工具
/usr/bin/influx_stress 压力测试工具
/usr/bin/influx_tsm 数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)
/var/lib/influxdb/data 存放最终存储的数据,文件以.tsm结尾
/var/lib/influxdb/meta 存放数据库元数据
/var/lib/influxdb/wal 存放预写日志文件
/var/log/influxdb/influxd.log 日志文件
/etc/influxdb/influxdb.conf 配置文件
/var/run/influxdb/influxd.pid PID文件
2.2 修改配置文件
(1)创建数据目录
#mkdir -p /data/influxdb
#chmod -R 777 /data
(2)修改数据存储和绑定地址
#vi /etc/influxdb/influxdb.conf
找到如下配置并修改或取消注释:
[meta]
dir = "/data/influxdb/meta"
[data]
dir = "/data/influxdb/data"
wal-dir = "/data/influxdb/wal"
[http]
bind-address = ":8086"
注意:如果influxdb安装在hadoop主机上,因为8088的端口是yarn的默认端口,influxdb主服务的端口也是8088。为避免两者冲突,把其中一个端口号修改为8086。
#systemctl start influxdb启动
3 使用
3.1 存储数据格式
InfluxDB里存储的数据被称为时间序列数据,其包含一个数值,就像CPU的load值或是温度值类似的。
时序数据有零个或多个数据点,每一个都是一个指标值。
数据点包括:
(1)time(一个时间戳),
(2)measurement(例如cpu_load),
(3)零个或多个tag,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt),
(4)至少一个k-v格式的field(也即指标的数值例如 “value=0.64”或者“temperature=21.2”)。
在概念上,你可以将measurement类比于SQL里面的table,其主键索引总是时间戳。
tag和field是在table里的其他列,tag是被索引起来的,field没有。
不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。
<measurement>逗号
[,<tag-key>=<tag-value>...]空格
<field-key>=<field-value>[,<field2-key>=<field2-value>...]空格
[unix-nano-timestamp]
3.2 命令行
#influx打开客户端
>show databases
>create database mytest
>use mytest
>insert cpu,host=serverA,region=us value=0.64
>select host,region,value from cpu
>select "host","region","value" from "cpu"
>select * from cpu
>quit
当没有带时间戳的时候,InfluxDB会自动添加本地的当前时间作为它的时间戳。
InfluxDB是一个无模式(schemaless)的数据库,你可以在任意时间添加measurement,tags和fields。注意:如果你试图写入一个和之前的类型不一样的数据(例如,filed字段之前接收的是数字类型,现在写了个字符串进去),那么InfluxDB会拒绝这个数据。
3.3 使用內建的HTTP接口写入数据
3.3.1 创建数据库
#使用POST方式发送到URL的/query路径,参数q为创建数据库
# curl -i -X POST http://10.23.241.202:8086/query --data-urlencode "q=create database mydb"
3.3.2 写入数据
通过HTTP接口POST数据到/write路径是我们往InfluxDB写数据的主要方式。
# curl -i -XPOST 'http://10.23.241.202:8086/write?db=mytest' --data-binary 'cpu,host=server01,region=uk value=0.96 1434055562000000000'
写入这条数据点的时候,必须明确存在一个数据库对应名字是db参数的值。
POST的请求体我们称之为Line Protocol,包含了希望存储的时间序列数据。
它的组成部分有measurement,tags,fields和timestamp。
measurement是InfluxDB必须的,严格地说,tags是可选的,但是对于大部分数据都会包含tags用来区分数据的来源,让查询变得容易和高效。
tag的key和value都必须是字符串。
fields的key也是必须的,而且是字符串,默认情况下field的value是float类型的。
timestamp在这个请求行的最后,是一个从1/1/1970 UTC开始到现在的一个纳秒级的Unix time,它是可选的,如果不传,InfluxDB会使用服务器的本地的纳米级的timestamp来作为数据的时间戳,注意无论哪种方式,在InfluxDB中的timestamp只能是UTC时间。
世界协调时间 (UTC),Coordinated Universal Time(UTC) 。
3.3.3 同时写入多个点
要想同时发送多个数据点到多个series(在InfluxDB中measurement加tags组成了一个series),可以用新的行来分开这些数据点。
这种批量发送的方式可以获得更高的性能。
#curl -i -XPOST 'http://10.23.241.202:8086/write?db=mytest' --data-binary 'cpu,host=server01,region=uk value=0.96 1434055562000000000
cpu,host=server02,city=uu value=0.78'
3.4 使用内建的HTTP接口查询数据
3.4.1 使用HTTP接口查询数据
HTTP接口是InfluxDB查询数据的主要方式。
通过发送一个GET请求到/query路径,并设置URL的db参数为目标数据库,设置URL参数q为查询语句。
#curl -G 'http://10.23.241.202:8086/query?pretty=true' --data-urlencode "db=mytest" --data-urlencode "q=SELECT value FROM cpu WHERE region='uk'"
其中
-G参数用来构造 URL 的查询字符串。
如果数据需要 URL 编码,可以结合--data--urlencode参数。
查询结果
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu",
"columns": [
"time",
"value"
],
"values": [
[
"2015-06-11T20:46:02Z",
0.96
]
]
}
]
}
]
}
4 python操作influxdb
参考Python操作InfluxDB指南
CMD>pip install influxdb
4.1 写入
from influxdb import InfluxDBClient
client = InfluxDBClient('10.23.241.202', 8086, 'aiops_logwarn') # 连接数据库
client.create_database('example') # 创建数据库
points = [ # 待写入数据库的点组成的列表
{
"measurement": "cpu",
"tags": {
"host": "server01",
"region": "us"
},
"time": "2009-11-10T23:00:00Z",
"fields": {
"value": 0.84
}
}
]
client.write_points(points, database='example') # 将这些点写入指定database
# 查询刚刚写入的点
result = client.query('select value from cpu;', database='example')
print(result)
返回下面的内容
ResultSet({'('cpu', None)': [{'time': '2009-11-10T23:00:00Z', 'value': 0.84}]})