技术周刊之influxDB使用入门

前言

InfluxDB是一个用于存储和分析时间序列数据的开源数据库。

主要特性有:

  • 内置HTTP接口,使用方便
  • 数据可以打标记,查让查询可以很灵活
  • 类SQL的查询语句
  • 安装管理很简单,并且读写数据很高效
  • 能够实时查询,数据在写入时被索引后就能够被立即查出
  • ……

在最新的DB-ENGINES给出的时间序列数据库的排名中,InfluxDB高居第一位,可以预见,InfluxDB会越来越得到广泛的使用。

  • influxDB使用go语言编写,采用了SQL like的语法,非常灵活高效,如果你的数据是与时间相关的,那么使用influxDB做数据可视化是最合适不过的,尤其是influxDB自身就提供数据库CRUD所需要的API,虽然不是RESTFul的,但是也省去了编写后端接口的力气。

  • 下面从influxDB的安装、使用CLI的influxdb基本操作、使用API对influxdb操作及golang代码实现、经历的坑,几个方面分享influxDB的入门经历。

安装

  • 本次安装的环境是:

    • CentOS 7
    • 内核版本:4.4.135-1.el7.elrepo.x86_64
  • 直接使用yum安装

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo # 输入influxDB的repoURL地址等信息
      [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
      EOF
      #EOF是文本的结束符
  • 1
    sudo yum install influxdb
  • influxd config

    安装完成后使用该命令查看influxDB的配置内容,default的config文件路径在:/etc/influxdb/influxdb.conf

  • 启动influxDB

1
2
3
4
5
[root@k8s-m1 ~]# influx
Connected to http://localhost:8086 version 1.7.1
InfluxDB shell version: 1.7.1
Enter an InfluxQL query
>

到此完成了influxDB的安装,接下来我们做基本的配置。

配置

  • 用户管理
1
2
3
4
5
6
7
8
9
10
-- 创建一个管理员用户
CREATE USER "admin" WITH PASSWORD 'xxxx' WITH ALL PRIVILEGES
-- 创建一个普通用户
CREATE USER "user" WITH PASSWORD 'xxxxx'
-- 为用户授权读权限
GRANT READ ON [database] to "user"
-- 为用户授权写权限
GRANT WRITE ON [database] to "user"
---------------------
# 需要修改InfluxDB的配置文件/etc/influxdb/influxdb.conf,设置http下的auth-enabled = true,重启后,使用influx命令登录数据库就需要用户名和密码了。(Influx命令实际上也是使用API来操作InfluxDB的,InfluxDB只提供了API接口)
  • 查看用户
1
2
3
4
5
6
> show users
user admin
---- -----
admin true
sjhan true
>

influxDB的配置项目有很多,剩下的可以根据自己的需求继续研究,这里就不展开了。

在进行数据库基本操作之前我们必须了解一下infuxDB的一些基本概念

influxDB基本概念

  • influxDB里面最基本的概念就是,measurement,tags,fields,points。我们可以类比于MySQL来理解这几个字段:
  • measurement类似于SQL中的table;
  • tags类似SQL中的被索引的列;
  • fields类似于SQL中没有被索引的列;
  • points对应SQL的table中的每行数据。
  • 知道了这几个概念,便可以继续往下进行,如需更加详细的文档,英文版文档猛戳这里,当然也有中文版,猛戳这里。不知为何中文版我只有番蔷才能访问。

influxDB基本操作

  • 首先,跟MySQL一样,我们需要创建一个数据库
1
2
3
4
5
-- 创建数据库,默认设置
CREATE DATABASE "first_db"
-- 创建数据库,同时创建一个Retention Policy,数据保留时间描述
-- Retention Policy各部分描述:DURATION为数据存储时长,下面的1d即只存1天的数据;REPLICATION为数据副本,一般在使用集群的时候才会设置为>1;SHARD DURATION为分区间隔,InfluxDB默认对数据分区,填写30m即对数据每隔30分钟做一个新的分区;Name是RP的名字。
CREATE DATABASE "first_db" WITH DURATION 1d REPLICATION 1 SHARD DURATION 30m NAME "myrp"

我们创建了一个influxDB的数据库,名字为first_db, 数据存储时间为一天,一个副本,每30分钟做一个新的分区。

  • influxDB插入数据

    influx -username admin -password

    我们插入一条数据到刚刚创建的数据库中

    1
    insert product,productName=disk,usageType=pay,creator=zhangsan,appId=105 cost=3421.6

    我们分析一下这条插入语句,其中product字段是influxDB中的measurement,前面讲基本概念的时候已经解释过,类似于MySQL中的table,“productName=disk,usageType=pay,creator=zhangsan,appId=105”,这一坨在influxDB中叫做tag set,可以理解为tag的一个集合,tag的类型只能是字符串的K-V,还有需要注意的是tag set与前面的measurement之间只有一个逗号,并没有空格!,一开始不知道这回事,怎么插入都是失败。“cost=3421.6”这个叫做filed set,filed的类型可以是float、boolean、integer。这样插入的一条数据,influxDB中叫做一个point。

  • 查询操作

    查询之前要选择你想查询的数据库

    1
    use first_db
    1
    select * from product
  • 可以看到influxDB自动为我们的这个point加了一个timestamp,这个是数据的UNIX时间格式的时间精度,我们在启动数据库时可以定义这个precision,像下面这样

    1
    influx --precision rfc3339

    influxDB规定了很多时间精度,具体可以在命令行输出help查看

    1
    2
    precision <format>    specifies the format of the timestamp: rfc3339, h, m, s, ms, u or ns
    # 可指定的时间精度
    • 使用influxDB内置CLI执行查询操作

      还是查询我们刚刚插入的那条数据,在命令行中输入以下命令

      1
      curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=first_db" --data-urlencode "q=SELECT \"cost\" FROM \"product\" WHERE \"productName\"='disk'"

      得到输出为json结构的查询结果

      influxDB内置的API很大程度简化了后端的开发,使各种项目可以快速上线。

    • 插入操作的API

    在命令行中输入

    1
    2
    curl -i -XPOST 'http://localhost:8086/write?db=first_db' --data-binary 'weather,location=us-midwes temperature=125'
    # 插入一条数据,measurement=weather,tag=location,filed=temperature,时间戳为当地服务器时间
    • 我们使用postman测试这个插入接口,以确定该接口的header,body等,为接下来使用go编写请求代码做好准备。通过分析URL,我们可知请求的param是db=first_db,–dat-binary这个参数,意味着你的request body必须是raw,而且header的content-Type=”text”,具体的postman设置参照下图:
    • 点击Send之后,可以在下面看到response的statusCode是204,在http协议中,这个状态码意思是返回体中没有内容。
    • 我们回到influxDB的terminal中查看一下,可以看到这条数据已经插入成功了。

    GO操作influxDB的API实现插入数据

    • 可以利用这样方便的API,编写代码,实现数据的批量采集、管理、展示,这里我用GO对插入数据的操作简单实现。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      func main() {
      reqBody := "weather,location=us-midwes temperature=521 1475839730100400200"
      rb := []byte(reqBody)
      headers := map[string]string{
      "Content-type": "text",
      }
      resp, _,err := simpleHttpClient.DoRequest("POST","http://10.18.5.30:8086/write?db=first_db",headers,rb,10)
      if err != nil {
      panic(err)
      }
      fmt.Println(string(resp))
      • 使用的DoRequest方法来自这里,这个库对golang的http操作进行简单的封装,而且加入了错误处理,timeout异常检测等。

      • 当然也可以使用Go自带的net/http包中的POST方法

        1
        2
        3
        4
        5
        6
        7
        8
        reqBody := "weather,location=us-midwes temperature=521 1475839730100400200"
        //rb := []byte(reqBody)
        rb := io.NewReader(reqBody)
        resp, err := http.Post("http://10.18.5.30:8086/write?db=first_db","text",rb)
        if err != nil {
        panic(err)
        }
        fmt.Println(string(resp))
        • 需要注意的是对request body的类型处理,net/http.post方法要求该参数的类型是io.reader,所以要使用io.NewReader()进行转换。

        总结

        • 以上就是对influxDB的入门介绍,包括基本概念,安装,配置,基本操作(CLI,API)以及使用GO编写操作数据库的代码。但influxDB的奥秘远不止这些,如需更加深入的研究可参阅官方文档

-------------The End-------------

本文标题:技术周刊之influxDB使用入门

文章作者:cloud sjhan

发布时间:2018年12月08日 - 23:12

最后更新:2018年12月08日 - 23:12

原始链接:https://cloudsjhan.github.io/2018/12/08/技术周刊之influxDB使用入门/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

cloud sjhan wechat
subscribe to my blog by scanning my public wechat account
坚持原创技术分享,您的支持将鼓励我继续创作!
0%
;