美文网首页
InfluxDB学习记录

InfluxDB学习记录

作者: andywangzhen | 来源:发表于2019-10-10 11:56 被阅读0次

背景

最近在做一个能源相关的业务后台,其中能耗统计的功能需要一个时序数据库。之前接触的时序数据库有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的常用函数。

相关文章

网友评论

      本文标题:InfluxDB学习记录

      本文链接:https://www.haomeiwen.com/subject/gwmopctx.html