InfluxDB是一个开源的时序数据库,使用GO语言开发,特别适合用于处理和分析资源监控数据这种时序相关数据。而InfluxDB自带的各种特殊函数如求标准差,随机取样数据,统计数据变化比等,使数据统计和实时分析变得十分方便。本文针对influxdb的数据库、表的概念,增删改查操作、RESTful操作等做下总结。

简介

  • https://www.influxdata.com/
  • https://docs.influxdata.com/influxdb/

influxdb 与 Mysql 对比

库、表比较

influxDB 传统数据库中的概念
database 数据库
measurement 数据库中的表
points 表里面的一行数据

Influxdb 数据的构成

Point由时间戳(time)、数据(field)、标签(tags)组成。

Point属性 传统数据库中的概念
time 每个数据记录时间,是数据库中的主索引(会自动生成)
fields 各种记录值(没有索引的属性)也就是记录的值:温度, 湿度
tags 各种有索引的属性:地区,海拔

这里不得不提另一个名词:series:

所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。具体可以通过SHOW SERIES FROM “表名” 进行查询。

安装

步骤

wget  https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm
rpm -ivh influxdb-1.1.0.x86_64.rpm

启动:

systemctl enable  influxdb
systemctl start influxdb

注:本示例是在 centos7 中配置的服务,更多参考:

  • https://docs.influxdata.com/influxdb/v1.3/introduction/installation/

文件说明

安装后, 在/usr/bin下面有如下文件:

influxd          influxdb服务器
influx           influxdb命令行客户端
influx_inspect   查看工具
influx_stress    压力测试工具
influx_tsm       数据库转换工具(将数据库从b1或bz1格式转换为tsm1格式)

/var/lib/influxdb/下面会有如下文件夹:

data            存放最终存储的数据,文件以.tsm结尾
meta            存放数据库元数据
wal             存放预写日志文件

配置文件路径 :/etc/influxdb/influxdb.conf

默认端口

influxdb使用的端口如下:

Enabled ports:

  • 8086: Influxdb HTTP service 默认运行端口
  • 8088: 备份和存储的 RPC service 运行端口

Disabled ports:

  • 2003: Graphite service 默认运行端口
  • 4242: 时间序列服务(OpenTSDB service)默认运行端口
  • 8089: UDP service 默认运行端口
  • 25826: Collectd service 默认运行端口

参考:https://docs.influxdata.com/influxdb/v1.6/administration/ports/#enabled-ports

使用

InfluxDB的操作语法 InfluxQLSQL 基本一致,也提供了一个类似 mysql-client 的名为influx的CLI。

登陆

登陆数据库命令:

influx -host 127.0.0.1 -port 8086

用户权限管理

关于用户的操作如下:

# 显示用户
SHOW USERS
# 创建用户
CREATE USER <username> WITH PASSWORD <password>
# 创建管理员权限的用户
CREATE USER <username> WITH PASSWORD <password> WITH ALL PRIVILEGES
# 删除用户
DROP USER <username>

influxdb的权限设置比较简单,只有读、写、ALL几种。更多用户权限设置可以参看官方文档:https://docs.influxdata.com/influxdb/v1.0/query_language/authentication_and_authorization/ 。默认情况下,influxdb类似与mongodb,是不开启用户认证的,可以修改其 conf文件,配置http块内容如下:

[http]
  enable = true
  bind-address = ":8086"
  auth-enabled = true  # 开启认证

DATABASES

通过influx命令进行管理,可以使用如下命令创建数据库:

# 创建数据库
create database <test_name>
# 查询所有数据库
> show databases
# 使用某个数据库
> use <test_name>

建库的操作可以发现非常类似于mysql下的操作。

MEASUREMENTS

而在influxdb下没有细分的表的概念,influxdb下的表在插入数据库的时候自动会创建:

# SHOW measurements命令查看所有的表,这个类似于mysql下的 show tables;
SHOW MEASUREMENTS;
# 创建表,直接在插入数据的时候指定表名
INSERT <measurement_name>,host=server1,region=cn_east-1 value=0.68
# 删除表
DROP MEASUREMENT <measurement_name>

INSERT 插入说明:

  • :表名
  • host=server1,region=cn_east-1:tag
  • value=0.68:field

SELECT

# 查询全部数据
select * from <measurement_name> order by time desc
# 查询最近的三条数据
SELECT * FROM <measurement_name> ORDER BY time DESC LIMIT 3
# 正则表达式查询
SELECT * FROM /.*/ LIMIT 1

DELETE

# 删除某条数据
delete from <measurement_name> where time=1480235366557373922

ALTER

update更新语句没有,不过有alter命令,在influxdb中,删除操作用和更新基本不用到 。

数据保存策略(Retention Policies)

influxDB是没有提供直接删除数据记录的方法,但是提供数据保存策略,主要用于指定数据保留时间,超过指定时间,就删除这部分数据。

SHOW

# 查看当前数据库的Retention Policies
SHOW RETENTION POLICIES ON <test_name>

CREATE

# 创建新的Retention Policies
CREATE RETENTION POLICY <retention_policies_name> ON <db_name> DURATION 30d REPLICATION 1 DEFAULT

说明如下:

  • :策略名
  • :具体的数据库名
  • 30d:保存30天,30天之前的数据将被删除,它具有各种时间参数,比如:h(小时),w(星期)
  • REPLICATION 1:副本个数,这里填1就可以了
  • DEFAULT 设为默认的策略

ALTER

# 修改 Retention Policies
ALTER RETENTION POLICY <retention_policies_name> ON <db_name> DURATION 3w DEFAULT

DROP

# 删除 Retention Policies
DROP RETENTION POLICY <retention_policies_name> ON <db_name>

连续查询(Continuous Queries)

当数据超过保存策略里指定的时间之后,就会被删除。如果我们不想完全删除掉,比如做一个数据统计采样:把原先每秒的数据,存为每小时的数据,让数据占用的空间大大减少(以降低精度为代价)。这就需要InfluxDB提供的:连续查询(Continuous Queries)。

SHOW

# 查看数据库的Continous Queries
SHOW CONTINUOUS QUERIES

CREATE

# 创建新的 Continuous Queries
CREATE CONTINUOUS QUERY cq_30m ON testDB BEGIN SELECT mean(temperature) INTO weather30m FROM weather GROUP BY time(30m) END

说明如下:

  • cq_30m:连续查询的名字
  • testDB:具体的数据库名
  • mean(temperature): 算平均温度
  • weather: 当前表名
  • weather30m: 存新数据的表名
  • 30m:时间间隔为30分钟

当我们插入新数据之后,通过SHOW MEASUREMENTS查询发现。可以发现数据库中多了一张名为weather30m(里面已经存着计算好的数据了)。这一切都是通过Continuous Queries自动完成的。

DROP

# 删除Continuous Queries
DROP CONTINUOUS QUERY <cq_name> ON <database_name>

RESTful 接口操作

插入及查询操作:

now=$(date '+%FT%T.000Z')
tomorrow=$(date -v +1d '+%FT%T.000Z')
echo "creating database"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE DATABASE foo"
echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION INF REPLICATION 1 DEFAULT"
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$now\",\"fields\": {\"value\": 100}}]}" -H "Content-Type: application/json" http://localhost:8086/write
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$tomorrow\",\"fields\": {\"value\": 200}}]}" -H "Content-Type: application/json" http://localhost:8086/write
sleep 1
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu"
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu where time < now() + 10d"

GZIP压缩数据插入及查询:

echo "inserting data"
curl -v -i -H "Content-encoding: gzip" -H "Content-Type: application/json" -X POST -T foo.json.gz http://localhost:8086/write
rm foo.json.gz
echo "querying data with gzip encoding"
curl -v -G --compressed http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT sum(value) FROM \"foo\".\"bar\".cpu GROUP BY time(1h)"

还可以指定数据保存策略及表的各关键值插入:

echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION 300d REPLICATION 3 DEFAULT"
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"uswest"},"time": "2015-02-26T22:01:11.703Z","fields": {"rx": 2342,"tx": 9804}}]}' -H "Content-Type: application/json" http://localhost:8086/write
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"useast"},"time": "2015-02-27T22:01:11.703Z","fields": {"rx": 4324,"tx": 7930}}]}' -H "Content-Type: application/json" http://localhost:8086/write

更多可以参考github上的测试内容。

无论是influx还是通过RESETful 参数进行查询,其还有pertty参数可以使输出的json格式更加美观 。除此之外,influx命令还有column、CSV等格式输出,influx命令支持通过import参数输入类csv类格式的数据。

influxdb 配置

配置

配置文件路径 :/etc/influxdb/influxdb.conf,可以通过以下命令生成默认配置文件:

influxd config > default.conf

Web 管理

默认 WEB 管理

当前版本的influxdb,默认情况下未开启web管理功能。可以通过修改influxdb.conf文件中admin项的配置开启web管理界面,具体如下:

[admin]
  # Determines whether the admin service is enabled.
  enabled = true

  # The default bind address used by the admin service.
  bind-address = ":8083"

Chronograf 组件

1.5版本,Influxdb添加了Chronograf组件作为web管理端Chronograf下载与安装:

# centos
wget https://dl.influxdata.com/chronograf/releases/chronograf-1.4.4.1.x86_64.rpm
sudo yum localinstall chronograf-1.4.4.1.x86_64.rpm

# ubuntu
wget https://dl.influxdata.com/chronograf/releases/chronograf_1.4.4.1_amd64.deb
sudo dpkg -i chronograf_1.4.4.1_amd64.deb

启动web服务:

sudo systemctl start chronograf

然后通过http://localhost:8888连接Web页面。

完毕。