背景
最近在做一个能源相关的业务后台,其中能耗统计的功能需要一个时序数据库。之前接触的时序数据库有ElasticSearch,但相比小型网站,找一个轻量级的时序数据库更加的合适,所以被推荐用InfluxDB,之前没了解过,趁此机会来认识一下他。
安装
工欲善其事必先利其器,首先肯定是本地装一个数据库,方便调试和使用。我目前使用的环境是win10+WSL,所以直接就思考,使用docker装一个容器:
github:https://github.com/influxdata/influxdb-python
安装方法比较简单,不再赘述,docker常规安装,版本使用最新即可。
docker run -d -p 8053:8086 -p8054:8088 -v /mydata/influxdb:/var/lib/influxdb --name=influxdb influxdb
安装后,使用 docker exec -it influxdb /bin/bash进入容器,创建数据库和用户:
> create database xxxxx ## 创建数据库xxxxx
> show databases
name: databasesname
----
internal
xxxxx
> CREATE USER testuser WITH PASSWORD 'testpwd' ## 创建用户和设置密码
> GRANT ALL PRIVILEGES ON xxxxx TO testuser ## 授权数据库给指定用户
> CREATE RETENTION POLICY "xxxxx_retention" ON "xxxxx" DURATION 30d REPLICATION 1 DEFAULT ## 创建默认的数据保留策略,设置保存时间30天,副本为1
插入数据
influxdb支持类SQL的查询方式,目前即使用此种方法在python中操作。
python需要安装influxdb客户端库:pip3 install influxdb
例子:
from influxdb import InfluxDBClient
json_body = [
{
"measurement": "cpu_load_short",
"tags": {
"host": "server01",
"region": "us-west"
},
"time": "2009-11-10T23:00:00Z",
"fields": {
"value": 0.64
}
}
]
client = InfluxDBClient('127.0.0.1', 8086, 'testuser', 'testpwd', 'testdb')
client.write_points(json_body)
result = client.query('select * from cpu_load_short;')
print("Result: {0}".format(result))
这也是官方给的示例参考,但有个坑,就是我拿到查询结果后,如何使用呢?
这里通过client.query拿到的数据,数据格式是没办法像dict一样直接使用的,后面摸索了一下,得到下面方法:
items = client.query('select * from cpu_load_short;')
list(items .get_points())
通过Http API的方式插入数据
查看官网文档,看到写入InfluxDB的方式还有API调用,看起来没有Json数据格式直观,所以没有使用。因为也没看到有性能上的提升。在此简单总结一下:
example
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
参数说明:
db是数据库名称;
--data-binary中,cpu_load_short是measurement名,可以理解为表名;host和region两个键值对是主键,后面空格隔开,value键值对是field,再空格后面是时间戳
官网也说明,influxDB的API不是Restful API
另一个很方便的用法是,将文件内容写入influxdb。意思是,将刚刚传入api的--data-binary的参数,一行一行的写在文件里面,直接将文件内所有行数据写入influxDB。用法如下:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt
cpu_data.txt的文件内容为:
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
插入数据的坑
这里调试的时候,遇到一个细节问题,即influxdb和ES一样,都是无模式的数据库,所以首次插入的字段,决定了该字段的数据类型。同一个measurenment中,同一个key只能有一个数据类型。例如第一次插入temp=25,成功;再次插入temp=26.5,就会失败。
基本数据查询语法
参考文档:https://jasper-zhang1.gitbooks.io/influxdb/content/Query_language/data_exploration.html
太多了,不一一列举说明了。主要可以注意一下GROUP BY time(),其中的区间包含方法,和offset偏移方式,说的不是很清楚,可能也是由于英文翻译到中文的语义差别吧。
下一篇文章,我们将着重归纳学习InfluxDB的常用函数。
网友评论