influxdb-连续查询
简介
InfluxDB每秒可以处理数十万的数据点。如果要长时间地存储大量的数据,对于存储会是很大的压力。一个很自然的方式就是对数据进行采样,对于高精度的裸数据存储较短的时间,而对于低精度的的数据可以保存得久一些甚至永久保存。
InfluxDB提供了两个特性——连续查询(Continuous Queries
简称CQ
)和保留策略(Retention Policies
简称RP
),分别用来处理数据采样和管理老数据的。
Continuous Query
(CQ)是在数据库内部自动周期性跑着的一个InfluxQL的查询,CQs需要在SELECT语句中使用一个函数,并且一定包括一个GROUP BY time()语句。
Retention Policy
(RP)是InfluxDB数据架构的一部分,它描述了InfluxDB保存数据的时间。InfluxDB会比较服务器本地的时间戳和请求数据里的时间戳,并删除比你在RPs里面用DURATION设置的更老的数据。一个数据库中可以有多个RPs但是每个数据库的RPs是唯一的。
基本语法
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
BEGIN
<cq_query>
END
cq_query
cq_query需要一个函数,一个INTO
子句和一个GROUP BY time()
子句:
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
注意:请注意,在
WHERE
子句中,cq_query不需要时间范围。 InfluxDB在执行CQ时自动生成cq_query的时间范围。cq_query的WHERE子句中的任何用户指定的时间范围将被系统忽略。
运行时间点以及覆盖的时间范围
- CQ对实时数据进行操作。他们使用本地服务器的时间戳,GROUP BY time()间隔和InfluxDB的预设时间边界来确定何时执行以及查询中涵盖的时间范围。
- CQs以与cq_query的GROUP BY time()间隔相同的间隔执行,并且它们在InfluxDB的预设时间边界开始时运行。如果GROUP BY time()间隔为1小时,则CQ每小时开始执行一次。
- 当CQ执行时,它对于now()和now()减去GROUP BY time()间隔的时间范围运行单个查询。 如果GROUP BY time()间隔为1小时,当前时间为17:00,查询的时间范围为16:00至16:59999999999。
高级语法
influxQL
InfluxQL是一种类似于SQL的查询语言,用于与InfluxDB进行交互。它经过精心设计,可以使来自其他SQL或类似SQL环境的用户熟悉,同时还提供特定于存储和分析时间序列数据的功能。
InfluxQL的SELECT语句遵循SQL SELECT语句的形式:
SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>
WHERE是可选的。
要在上面的部分中获取InfluxDB输出,请输入:
SELECT * FROM "foodships"
如果您只想查看有关该行的数据Saturn
,请输入:
SELECT * FROM "foodships" WHERE "planet" = 'Saturn'
如果您想Saturn在2015年4月16日世界标准时间12:00:01
之后查看行星的数据,请输入:
SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'
如上面的示例所示,InfluxQL允许您在WHERE子句中指定查询的时间范围。您可以使用日期时间字符串,这些日期时间字符串用单引号引起来,其格式为YYYY-MM-DD HH:MM:SS.mmm
(mmm是毫秒,是可选的,还可以指定微秒或纳秒)。您还可以使用相对时间now()来引用服务器的当前时间戳:
SELECT * FROM "foodships" WHERE time > now() - 1h
该查询foodships以时间戳记比服务器当前时间减去一小时新的量度输出数据。用于指定持续时间的选项now()
有:
格式 | 单位 |
---|---|
ns | 纳秒 |
u或µ | 微秒 |
ms | 毫秒 |
s | 秒 |
m | 分钟 |
H | 小时 |
d | 天 |
w | 周 |
InfluxQL还支持正则表达式,表达式,SHOW语句和GROUP BY语句中的算术运算。
InfluxQL功能包括
COUNT
,MIN
,MAX
,MEDIAN
,DERIVATIVE
等等。查询中的基本计算
SELECT声明支持使用基本数学运算符,如+,-,/,*,(),等。
-- Add two field keys
SELECT field_key1 + field_key2 AS "field_key_sum" FROM "measurement_name" WHERE time < now() - 15m
-- Subtract one field from another
SELECT field_key1 - field_key2 AS "field_key_difference" FROM "measurement_name" WHERE time < now() - 15m
-- Grouping and chaining mathematical calculations
SELECT (field_key1 + field_key2) - (field_key3 + field_key4) AS "some_calculation" FROM "measurement_name" WHERE time < now() - 15m
- 计算查询中的百分比
使用基本的数学函数,您可以通过将一个字段值除以另一字段值并将结果乘以100来计算百分比:
SELECT (field_key1 / field_key2) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m
- 使用聚合函数计算百分比
如果在百分比计算中使用汇总函数,则必须使用汇总函数引用所有数据。 您不能混合使用汇总数据和非汇总数据。
所有聚合功能都需要一个GROUP BY time()
子句,该子句定义将数据点分组和聚合的时间间隔。
SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage" FROM "measurement_name" WHERE time < now() - 15m GROUP BY time(1m)
influxdb-API
支持的API client
http
创建数据库
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
写入数据
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
配置gzip压缩
InfluxDB支持gzip压缩。要减少网络流量,请考虑以下选项:
- 要接受来自InfluxDB的压缩数据,请将Accept-Encoding: gzip标头添加到InfluxDB API请求中。
- 要在将数据发送到InfluxDB之前压缩数据,请将Content-Encoding: gzip标头添加到InfluxDB API请求中。
批量写入
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
从文件写入
通过传递@filename
到文件来写入文件中的点curl。文件中的数据应遵循InfluxDB行协议语法。
格式正确的文件(cpu_data.txt)的示例:
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
写入数据cpu_data.txt
到mydb
与数据库:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt
注意:如果您的数据文件具有5,000个以上的点,则可能有必要将该文件拆分为几个文件,以便将数据批量写入InfluxDB。默认情况下,HTTP请求在五秒钟后超时。超时后,InfluxDB仍将尝试写入这些点,但是不会确认它们已成功写入。
HTTP响应摘要
- 2xx:如果收到您的写请求HTTP 204 No Content,那就成功了!
- 4xx:InfluxDB无法理解该请求。
- 5xx:系统过载或严重损坏
查询数据
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
InfluxDB返回JSON。您的查询结果将显示在”results”数组中。如果发生错误,InfluxDB会设置一个”error”包含错误说明的密钥。
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
}
]
}
注意:附加pretty=true到URL会启用精美打印的JSON输出。尽管这对于调试或在使用诸如之类的工具直接查询时很有用curl,但不建议用于生产环境,因为它会消耗不必要的网络带宽。
多个查询
通过单个API调用将多个查询发送到InfluxDB。只需使用分号分隔每个查询,例如:
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west';SELECT count(\"value\") FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
返回:
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"value"
],
"values": [
[
"2015-01-29T21:55:43.702900257Z",
2
],
[
"2015-01-29T21:55:43.702900257Z",
0.55
],
[
"2015-06-11T20:46:02Z",
0.64
]
]
}
]
},
{
"statement_id": 1,
"series": [
{
"name": "cpu_load_short",
"columns": [
"time",
"count"
],
"values": [
[
"1970-01-01T00:00:00Z",
3
]
]
}
]
}
]
}
java
- Java 1.8+ (tested with jdk8 and jdk11)
- Maven 3.0+ (tested with maven 3.5.0)
org.influxdb
influxdb-java
2.17
compile 'org.influxdb:influxdb-java:2.17'
python
go
influxdb使用
CLI连接
influx -precision rfc3339
influx
默认使用本地8086
端口和localhost
连接,更多参考influx --help
-precision
格式化时间,rfc3339
使用RFC3339
format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ
).
管理连接
exit
创建数据库
CREATE DATABASE <db-name>
例如CREATE DATABASE mydb
.default
是默认关键字,不能用于数据库名.
查看数据库
创建完数据库可以用SHOW DATABASES
查看所有数据库.
> SHOW DATABASES
name: databases
name
----
_internal
mydb
使用数据库
USE <db-name>
> USE mydb
Using database mydb
存储策略
查看当前数据库Retention Policies
show retention policies on "db_name"
创建新的Retention Policies
create retention policy "rp_name" on "db_name" duration 3w replication 1 default
数据格式
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
measurement
相当于表名.tag
是数据的标签,可以有多个field
是数据的值,可以有多个,例如 “value=0.64”, or “temperature=21.2”timestamp
是数据的时间戳
每一条数据称之为
points
.
插入一条数据
INSERT cpu,host=serverA,region=us_west value=0.64
INSERT temperature,machine=unit42,type=assembly external=25,internal=37
查询数据
SELECT "host", "region", "value" FROM "cpu"
SELECT * FROM "temperature"
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
SELECT * FROM cpu where time = '2020-02-20T06:43:42.9206681Z'
influxdb安装
influxdb简介
influxdb是一款常年在db-engine使用排名第一的时序数据库,提供存储管理、用户管理、http接口、各类语言API接口。
TSM
时序数据使用类似 LSM Tree 的 TSM Tree (Time Series Merge Tree
)存储,而且是一种「列式」存储结构。
数据写入时:
- 先保存到 cache 和 WAL 当中
- 当 WAL 当中数据超出阈值时,将 WAL 文件写入到 level 1 的 TSM 文件当中,cache 和 WAL 也随之清空
- 每个 TSM 文件主要分成两部分:时序数据,以及时序数据的索引,通过索引可以使用二分查找找到我们需要的数据
- 随着 TSM 文件变多,系统会将多个小 的TSM 文件会合并成一个的更大的 TSM 文件,持续这个过程保证文件数量不会过多
- TSM 文件的合并策略是比较老的 size-tiered 策略,将小的文件压缩成大的文件,这一点和 leveldb 不太一样,leveldb 要严格保证每个 level 下的文件没有重叠,但是 influxdb 不会。
之所以这么设计,应该是因为查询时序数据的时候,一般会根据时间进行筛选,而大部分时候每个 TSM 文件当中都是越老的文件数据也越老,数据天然会按照时间排序,虽然会有重叠的情况,但是权衡利弊,最终可以容忍这种情况,查询的时候做数据合并的成本更小。
TSI
TSI 是 Time Series Index
的缩写,influxdb 用 TSI 来保存时序数据的倒排索引。可以通过 TSI 快速查询到某个表中,包含某个 tag 的 series 都有哪些。
TSI 的另一个工作是将倒排索引保存在磁盘当中,在 TSI 之前,influxdb 完全是使用内存存储倒排索引的,当时序数据变多的时候,特别是「表」变多的时候,倒排索引消耗的内存会飙升。TSI 使用类似 TSM 的文件结构来存储索引。
inflxdb数据库安装
centos安装
- 下载地址
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10.x86_64.rpm
sudo yum localinstall influxdb-1.7.10.x86_64.rpm
- 安装
yum localinstall influxdb-1.7.10.x86_64.rpm
- 卸载
rpm -qa | grep influx
rpm -e influxdb-1.7.10.x86_64
- 启动
service influxdb start
systemctl enable influxdb
systemctl start influxdb
systemctl restart influxdb
systemctl stop influxdb
windows
https://dl.influxdata.com/influxdb/releases/influxdb-1.7.10_windows_amd64.zip unzip influxdb-1.7.10_windows_amd64.zip
docker安装
docker pull influxdb
可视化UI-Chronograf
docker安装
docker pull quay.io/influxdb/chronograf:1.7.17
centos
wget https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17.x86_64.rpm
sudo yum localinstall chronograf-1.7.17.x86_64.rpm
windows
https://dl.influxdata.com/chronograf/releases/chronograf-1.7.17_windows_amd64.zip
unzip chronograf-1.7.17_windows_amd64.zip
数据收集器-Telegraf
docker安装
docker pull telegraf
centos
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.13.3-1.x86_64.rpm
windows
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.13.3_windows_amd64.zip
unzip telegraf-1.13.3_windows_amd64.zip
处理和监控服务-Kapacitor
docker安装
docker pull kapacitor
centos
wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4-1.x86_64.rpm
sudo yum localinstall kapacitor-1.5.4-1.x86_64.rpm
windows
wget https://dl.influxdata.com/kapacitor/releases/kapacitor-1.5.4_windows_amd64.zip
unzip kapacitor-1.5.4_windows_amd64.zip