InfluxDB介绍
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。 主要特性有:
- 内置HTTP接口,使用方便
- 数据可以打标记,这样查询可以很灵活
- 类SQL的查询语句
- 安装管理很简单,并且读写数据很高效
- 能够实时查询,数据在写入时被索引后就能够被立即查出
- ……
InfluxDB提供多种操作方式:
- 客户端命令行方式
- HTTP API接口
- 各语言API库
- 基于WEB管理页面操作
安装
准备
安装InfluxDB包需要root
或是有管理员权限才可以。
RedHat & CentOS
RedHat和CentOS用户可以直接用yum
包管理来安装最新版本的InfluxDB。
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[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
一旦加到了yum
源里面,就可以运行下面的命令来安装和启动InfluxDB服务:
sudo yum install influxdb
sudo service influxdb start
如果你的系统可以使用Systemd(比如CentOS 7 , RHEL 7 ),也可以这样启动:
代码语言:javascript复制sudo yum install influxdb
sudo systemctl start influxdb
配置
安装好之后,每个配置文件都有了默认的配置,你可以通过命令influxd config
来查看这些默认配置。
在配置文件/etc/influxdb/influxdb.conf
之中的大部分配置都被注释掉了,所有这些被注释掉的配置都是由内部默认值决定的。配置文件里任意没有注释的配置都可以用来覆盖内部默认值,需要注意的是,本地配置文件不需要包括每一项配置。
有两种方法可以用自定义的配置文件来运行InfluxDB:
- 运行的时候通过可选参数
-config
来指定:
influxd -config /etc/influxdb/influxdb.conf
- 设置环境变量
INFLUXDB_CONFIG_PATH
来指定,例如:
echo $INFLUXDB_CONFIG_PATH
/etc/influxdb/influxdb.conf
influxd
相关概念
对常见关系型数据库(MySQL)的基础概念对比
概念 | MySQL | InfluxDB |
---|---|---|
数据库(同) | database | database |
表(不同) | table | measurement |
列(不同) | column | tag(带索引的,非必须)、field(不带索引)、timestemp(唯一主键) |
创建数据库
代码语言:javascript复制# 执行influx连接到本地的InfluxDB实例上
influx -precision rfc3339
# 创建数据库
CREATE DATABASE mydb
# 显示有哪些数据库
SHOW DATABASES
# 删除数据库
SHOW DATABASES mydb
# 使用指定数据库
use mydb
Measurement(表) 操作
代码语言:javascript复制# 显示所有表
SHOW MEASUREMENTS
# 创建表
INSERT cpu,host=serverA,region=us_west value=0.64
# 删除表
DROP MEASUREMENTS cpu
写入数据
InfluxDB里存储的数据被称为时间序列数据
,其包含一个数值,就像CPU的load值或是温度值类似的。时序数据有零个或多个数据点,每一个都是一个指标值。数据点包括 time
(一个时间戳),measurement
(例如cpu_load),至少一个k-v格式的 field
(也即指标的数值例如 “value=0.64”或者“temperature=21.2”),零个或多个 tag
,其一般是对于这个指标值的元数据(例如“host=server01”, “region=EMEA”, “dc=Frankfurt)。
在概念上,你可以将 measurement
类比于SQL里面的table,其主键索引总是时间戳。tag
和 field
是在table里的其他列,tag
是被索引起来的,field
没有。不同之处在于,在InfluxDB里,你可以有几百万的measurements,你不用事先定义数据的scheme,并且null值不会被存储。
将数据点写入InfluxDB,只需要遵守如下的行协议:
代码语言:javascript复制# measurement 类比于SQL里面的table
# <tag-key>=<tag-value> 类似于索引
# <field-key>=<field-value> 普通字段
# [unix-nano-timestamp] UTC时间戳
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
下面是数据写入InfluxDB的格式示例:
代码语言:javascript复制# measurement(table):cpu tags(index):host region field:value timestamp:默认
INSERT cpu,host=serverA,region=us_west value=0.64
# measurement(table):payment tags(index):device product method field:billed licenses timestamp:1434067467100293230
INSERT payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
# measurement(table):stock tags(index):symbol field:ask timestamp:默认
INSERT stock,symbol=AAPL bid=127.46,ask=127.48
InfluxDB 无需向sql一样创建;INSERT时不存在则为创建表
读取数据
代码语言:javascript复制# 查询语句格式
SELECT DISTINCT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
# 示例 *可查所有字段 database(数据库) autogen(存储策略) measurement(表)
select *::field,*::tag from "database"."autogen"."measurement"
请注意观察select中field子句一定在tag子句前
WHERE子句
WHERE
子句用作field,tag和timestamp的过滤。
语法
代码语言:javascript复制SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
语法描述
WHERE
子句在field,tag和timestamp上支持conditional_expressions
.
fields
代码语言:javascript复制field_key <operator> ['string' | boolean | float | integer]
WHERE
子句支持field value是字符串,布尔型,浮点数和整数这些类型。
在WHERE
子句中单引号来表示字符串字段值。具有无引号字符串字段值或双引号字符串字段值的查询将不会返回任何数据,并且在大多数情况下也不会返回错误。
支持的操作符:
=
等于
<>
不等于
!=
不等于
>
大于
>=
大于等于
<
小于
<=
小于等于
tags
代码语言:javascript复制tag_key <operator> ['tag_value']
WHERE
子句中的用单引号来把tag value引起来。具有未用单引号的tag或双引号的tag查询将不会返回任何数据,并且在大多数情况下不会返回错误。
支持的操作符:
=
等于
<>
不等于
!=
不等于
timestamps
对于大多数SELECT
语句,默认时间范围为UTC的1677-09-21 00:12:43.145224194
到2262-04-11T23:47:16.854775806Z
。 对于只有GROUP BY time()
子句的SELECT
语句,默认时间范围在UTC的1677-09-21 00:12:43.145224194
和now()
之间。
schema查询语法
InfluxQL是一种类似SQL的查询语言,用于与InfluxDB中的数据进行交互。下面我们要介绍一些有用的查询schema的语法:
代码语言:javascript复制# 返回当前实例上的所有的数据库
SHOW DATABASES
# 返回指定数据库的保留策略的列表
SHOW RETENTION POLICIES
# 返回指定数据库的series列表
SHOW SERIES
# 返回指定数据库的measurement列表
SHOW MEASUREMENTS
# 返回指定数据库的tag key列表
SHOW TAG KEYS
# 返回数据库中指定tag key的tag value列表
SHOW TAG VALUES
# 返回field key以及其field value的数据类型
SHOW FIELD KEYS