influxdb 的安装,概念及使用(1)

最近做nginx 的访问监控,用到到 influxdb, 把自己对于 influxdb 的使用记录下来.由于现在主要是单机在做实验,所以先写下第一部分给大家分享,第一部分是概念及使用,接下来会是集群的部署及相关概念,第三部分是优化,我会慢慢跟着自己的项目进度补全这三部分,不过也许会太监,写多少是多少吧.[以下说明是基于0.9版本的]

influxdb的安装

首先 influxDB 是一个时序数据库.我的理解是主要按照时间维护提供查询与存储的数据库,我没有去百度上查(因为我不是理论党),所以看到我的理解你也不要惊讶和你在网上看到的不一样,但最终只要用对用好产生价值才是王道.

首先说 influxDB 的安装方式:我的是 centos

1
2
wget http://influxdb.s3.amazonaws.com/influxdb-0.9.5.1-1.x86_64.rpm
sudo yum localinstall influxdb-0.9.5.1-1.x86_64.rpm

估计有的童鞋访问不了这个地址,但是作为大陆 IT 从业人员,不会或者不能翻墙的话,可以开率换个行业.

然后就是配置文件的修改,
/etc/influxdb/influxdb.conf
单机最简配置:

1
2
3
4
5
6
7
#是否关闭向 influx.com 提交报告
reporting-disabled = true
[data]
#数据文件的存储路径
dir = "/data/influxdb/data"
#wal (The Write Ahead Log)文件的存储路径,如果有多盘,和数据文件分开存放也许会好一点,没验证春 YY 的想法
wal-dir = "/data/influxdb/wal"

然后启动就 ok 了
service influxdb start

influxdb的一些概念

databse:

数据库,你完全可以理解为 mysql 里面 database 一样的意思

measurement:

英文的意思是度量,这里理解为 mysql 里面的 table, 基本上这是记录一类数据集的一张表,包含在 database 下面.

series(tags):

这个有点不太好解释,理解为标签也是可以的,例如记录一组机器的 CPU 采样的时候,你可以设置两个 tag, 一个是机器的 IP, 一个是 第几个 cpu, 他是一个 map[stirng]string 结构的,在查询的时候,放在 where 条件里面

fields:

这个就是实际记录的数据值,结果是 map[string]interface{},这里面 interface{}可以是 int,int32,int64,float32,float64,是真正需要显示或者计算的值.接着上面的例子说,你可以记录 cpu 里面 sys,io,use 等值.

内置函数:

这里主要是用户 query 的时候让 influxdb 内置计算结果的函数,有点类似 mysql 里面的函数,常用的是 mean(),sum() 其他的我没去用,可以参考官网的说明.

time字段:

这个算是一个内置字段,你不设置的时候数据库会自己添加当前时间,你也可以设置自己想要的时间戳

sequense:

这个也是数据库内置的一个值,用于唯一标记行的,我没有用到基本上也不会用所以没有去深究,有兴趣可以自己去看看官网说明或者 google(别跟我说不会翻墙).

总的来说,没有什么很特别的,只是 series 和 fields在查询的时候和普通的数据库操作不太一样,这点要注意,另外还有一点就是 influxdb 对时间单位的定义是这样的:

1
2
3
4
5
6
u microseconds
s seconds
m minutes
h hours
d days
w weeks

influxdb 会自动解析这个时间后缀,这个在后面会讲到.

influxdb 的操作

有了上面的概念说明,下面的操作也好讲了,
先连接数据库, influxdb 提供了很简单的管理界面,端口是8083,如:http://localhost:8083,补充说一点,8086是它的 RestAPI 端口,还可以使用本地的 client 来连接,命令就是

1
2
influx
#接下来会自动连接本地的数据库,当然也可以后面带上 help 参数,具体内容不列出,自己实践

首先说说常用数据库操作:

1
2
3
4
5
6
//创建数据库
create database "xxxxxx"
//切换数据库
use "xxxxxx"
//删除数据库
drop database "xxxxxx"

这三条基本上会用 mysql 的就不用我解释了.

下面是measurement的操作:

1
drop measurement "xxxxxx"

这里并没有 cteate 的操作,因为在代码里面只要存储了这个measurement,那么就会自动生成.

有了数据库有了表,再来操作 tag与 field.

操作 tag 使用的是 series 这个,具体操作有下面几个:

1
2
3
4
5
6
7
8
#删除列出的表里面 tag为指定值的所有记录点
DROP SERIES FROM <measurement_name[,measurement_name]> WHERE <tag_key>='<tag_value>'
#删除所有的关联,相当于是清空表的操作
DROP SERIES FROM 'measurement_name'
#删除指定表中所有 tag 为指定值的数据
DROP SERIES FROM 'measurement_name' WHERE <tag_key>='<tag_value>'
#删除当前数据库中所有 tag 为指定值的数据
DROP SERIES WHERE <tag_key>='<tag_value>'

这里有两个警告,我是没用到,所以直接借用官网的内容:

1
2
DROP SERIES does not support time intervals in the WHERE clause. See GitHub Issue #1647 for more information).
Currently, InfluxDB does not support regular expressions with DROP SERIES. See GitHub Issue #4276 for more information.

删除写完了,其实还有一个数据切割策略,这里我确实没有用到,所以留到做集群的时候再一并写掉.

下面是查询的说明:

基本上语法结构是和SQL 的语法一致,都是 select xxx from table_name where xxx=xxx order by xxx group by xxx limit 10这种结构.

例如:

1
SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

另外, where 的时候如果带时间的查询可以有两种方式:
第一种是指定具体时间,格式如下”

1
SELECT * FROM foodships WHERE planet = 'Saturn' AND time > '2015-04-16 12:00:01'

第二种时间格式为:

1
SELECT * FROM foodships WHERE time > now() - 1h

这事使用内置函数来做计算,后面的1h也就是用上面提到的时间单位来换算的.

注意,这里指定时间的查询条件里面对空格是有规定的,

1
2
3
4
SELECT * FROM mydb WHERE time > now() - 1d
SELECT * FROM mydb WHERE time> now() - 1d
SELECT * FROM mydb WHERE time >now() - 1d
SELECT * FROM mydb WHERE time > now()- 1d

以上写法都可以,但是一下写法都是错误的:

1
2
SELECT * FROM mydb WHERE time > now() -1d
SELECT * FROM mydb WHERE time > now() - 1 d

再讲讲二元操作符,直接官网摘抄一下:

1
2
3
4
5
6
7
= equal to
<> not equal to
!= not equal to
> greater than
< less than
=~ matches against
!~ doesn’t match against

还可以用正则来进行查询,例如:

1
SELECT * FROM /.*/ LIMIT 1

其实我没有用过这些,也就没有深究,知道有这么回事就够了.有问题再查官网文档.

说了新增,删除和,那么更新能做么?

不好意思,不能更新,官方的说法是, influxdb 是一个时间序列数据库,它里面的数据是一个时间点的实际情况的记录,要想获取结果,是这些时间点聚合出来的结果,所以不需要更新,更新的话相反会破坏数据的完整性与真实性,所以要么就生成要么就销毁,这理论说起来也对,谁叫别人是这个数据库的原作者呢

influxdb 的一些问题

其实我在使用过程中确实也没有遇到什么问题,只是宕机了两次,没有任何的 dump 文件,在日志里面也找不到,触发条件是我在 grafana 里面

坚持原创技术分享,您的支持将鼓励我继续创作!