前言
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
9cat <<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 | [root@k8s-m1 ~]# influx |
到此完成了influxDB的安装,接下来我们做基本的配置。
配置
- 用户管理
1 | -- 创建一个管理员用户 |
- 查看用户
1 | show users |
influxDB的配置项目有很多,剩下的可以根据自己的需求继续研究,这里就不展开了。
在进行数据库基本操作之前我们必须了解一下infuxDB的一些基本概念
influxDB基本概念
- influxDB里面最基本的概念就是,measurement,tags,fields,points。我们可以类比于MySQL来理解这几个字段:
- measurement类似于SQL中的table;
- tags类似SQL中的被索引的列;
- fields类似于SQL中没有被索引的列;
- points对应SQL的table中的每行数据。
- 知道了这几个概念,便可以继续往下进行,如需更加详细的文档,英文版文档猛戳这里,当然也有中文版,猛戳这里。不知为何中文版我只有番蔷才能访问。
influxDB基本操作
- 首先,跟MySQL一样,我们需要创建一个数据库
1 | -- 创建数据库,默认设置 |
我们创建了一个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
2precision <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
2curl -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
11func 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
8reqBody := "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的奥秘远不止这些,如需更加深入的研究可参阅官方文档。