InfluxDB是什么?
InfluxDB 是一个由InfluxData开发的开源时序性数据库。它由Go语言组成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,loT行业的实时数据等场景。
Influxdb 三大特性:
- 基于时间序列
- 可度量性
- 基于事件
时序性数据库:
- opentsdb 基于HBase
- InfluxDB
- TimeScaleDB 基于PostgreSQL
- KairosDB 基于Cassandra
通用数据库:
- kudu
- CreateDB 基于 ElasticSearch
InfluxDB数据模型
1.IMeasurement(表)
2.Tags(维度列,相当于主键,数据库中的索引列)
device=dev1 building=b1
device=dev1 building=b2
device=dev2 building=b1
device=dev2 building=b2
不同的设备在不同的时间有不同的数据
3.Field (数值列,相当数据库中的未索引列)
4.Point(一条完整的记录,类似于SQL行)
InfluxDB时间线
时间线:一个数据源采集的一个指标随着时间变化而源源不断吐出的数据,形成的一条数据线。
InfluxDB系统架构
RP:数据保留策略(是数据库级别,不是表级别)
每个数据库有多个保留策略,但是只能有一个默认策略。
ShardGroup:分片组
每个ShardGroup只存储指定时间段的数据,不同的ShardGroup指定的时间段不会重合。
为什么这么划分?
1.InfluxDB中数据过期删除的执行力度就是ShardGroup
2.可以有效根据时间维度选择目标分区,淘汰部分数据。
InfluxDB安装部署 (Mac版本)
参考链接:mac上安装influxdb - 云+社区 - 腾讯云
InfluxDB进行HTTP API查询
使用HTTP API在InfluxDB进行查询主要是发送 GET 请求到 InfluxDB的 /query 端,调用示例如下所示:
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb"
--data-urlencode "q=SELECT value FROM mt WHERE name = 'wenhao'"
参数db指定了需查询的数据库,q代表了需执行的查询语句。
我们可能需要用InfluxDB进行多条查询,HTTP API提供的多条查询的格式如下所示:
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT value FROM mt WHERE name='wenhao';
SELECT count(value) FROM mt WHERE name='wenhao'"
格式与单条查询相同,只是在多条语句之间要用分号“;”分隔。
返回值也是包含结果的json串。
InfluxDB 数据保留策略操作
语法:CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
- <retention_policy_name>:保留策略名称
- <database_name>:数据库名称
- <duration>:保留策略对应数据的过期时间
- REPLICATION:副本因子
- SHARD DURATION:分片组默认时长
- [DEFAULT]:是否为默认的保留策略
创建数据保留策略
CREATE RETENTION POLICY "influx_retention" ON "mydb" DURATION 30d REPLICATION DEFAULT;
查看保留期
SHOW RETENTION POLICIES ON mydb
修改保留期
ALTER RETENTION POLICY "influx_retention" ON mydb DURATION 15d
删除保留期
DROP RETENTION POLICY "influx_retention" ON mydb
InfluxDB 表操作
显示所有表
show measurements
插入数据
use mydb
insert weather,altitude=1000,area=北,temperature=11,humidity=-4
insert weather,altitude=500,area=北,temperature=18,humidity=5
insert weather,altitude=1000,area=南,temperature=12,humidity=-5
insert weather,altitude=500,area=南,temperature=25,humidity=7
查询表
select * from weather
设置一下时间格式
precision rfc3339
删除表
DROP MEASUREMENT weather
InfluxDB 用户操作
显示用户
show users
创建用户
【普通用户】创建并设置密码
create user zhouwenhao with password '999999';
【管理员用户】创建并设置密码
create user “admin” with password ‘admin’ all privileges;
修改用户密码
set password for zhouwenhao = '123456'
删除用户
drop user admin;
InfluxDB 数据库访问权限操作
用户授权
授权用户数据库操作权限
GRANT ALL PRIVILEGES ON mydb T0 zhouwenhao
赋予用户管理员权限
GRANT ALL PRIVILEGES T0 zhouwenhao
备注:只能使用admin权限才可以操作数据库
撤销授权
撤销用户数据库操作权限
REVOKE ALL PRIVILEGES ON mydb from zhouwenhao
撤销用户管理员权限
REVOKE ALL PRIVILEGES FROM zhouwenhao
InfluxDB开启用户登录认证
开启登陆验证
在influxdb配置文件influxdb.conf中,开启用户登录认证,添加如下内容:
[http] auth-enabled = true
开启认证后无密码登录
bin /zhouwenhao
开启认证后无密码登录
bin /zhouwenhao -username zhouwenhao -password 123456
InfluxDB聚合
Count()
返回非空字段值的数量
语法
SELECT COUNT([*|<field_key>|/<regular_expression>]) [INTO_clause] FROM_clause [WHERE_clasuse] [GROUP_BY_clause] [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
嵌套语法
SELECT COUNT(DISTINCT([*| <filed_key> | /<regular_expression>/]))[...]
COUNT(field_key)
返回与字段键关联的字段值的数量。
COUNT(/regular_expression/)
返回与匹配正则表达式的每个字段键关联的字段值的数量。
COUNT(*)
返回与测量中的每个字段键关联的字段值的数量。
COUNT()
支持所有字段值数据类型。InfluxQL 支持DISTINCT()与COUNT()
.
> SELECT COUNT("water_level") FROM "h2o_feet"
name: h2o_feet
time count
---- -----
1970-01-01T00:00:00Z 15258
查询返回测量中water_level
字段键中非空字段值的数量。h2o_feet
> SELECT COUNT(*) FROM "h2o_feet"
name: h2o_feet
time count_level description count_water_level
---- ----------------------- -----------------
1970-01-01T00:00:00Z 15258 15258
h2o_feet
该查询返回与测量关联的每个字段键的非空字段值的数量。
测量h2o_feet
有两个字段键:level description
和water_level
。
> SELECT COUNT(/water/) FROM "h2o_feet"
name: h2o_feet
time count_water_level
---- -----------------
1970-01-01T00:00:00Z 15258
water
查询返回包含测量中单词的每个字段键的非空字段值的数量h2o_feet
。
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-17T23:48:00Z' AND time <= '2015-08-18T00:54:00Z' GROUP BY time(12m),* fill(200) LIMIT 7 SLIMIT 1
name: h2o_feet
tags: location=coyote_creek
time count
---- -----
2015-08-17T23:48:00Z 200
2015-08-18T00:00:00Z 2
2015-08-18T00:12:00Z 2
2015-08-18T00:24:00Z 2
2015-08-18T00:36:00Z 2
2015-08-18T00:48:00Z 2
water_level
查询返回字段键中非空字段值的数量。它涵盖了和之间的时间范围2015-08-17T23:48:00Z
,并将结果分组为 12 分钟的时间间隔和每个标签。该查询用空的时间间隔填充并将返回的点和系列的数量限制为 7 和 1。2015-08-18T00:54:00Z
200
> SELECT COUNT(DISTINCT("level description")) FROM "h2o_feet"
name: h2o_feet
time count
---- -----
1970-01-01T00:00:00Z 4
level description
该查询返回字段键和h2o_feet
度量的唯一字段值的数量。
COUNT() 的常见问题
count() 和 fill()
大多数 InfluxQL 函数报告null
没有数据的时间间隔的值,并将 fill(<fill_option>) 该null
值替换为fill_option
. COUNT()
报告0
没有数据的时间间隔,并将fill(<fill_option>)
任何0
值替换为fill_option
.
下面代码块中的第一个查询不包括fill()
. 最后一个时间间隔没有数据,因此该时间间隔的报告值为零。第二个查询包括fill(800000)
;它将最后一个间隔中的零替换为800000
.
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-09-18T21:24:00Z' AND time <= '2015-09-18T21:54:00Z' GROUP BY time(12m)
name: h2o_feet
time count
---- -----
2015-09-18T21:24:00Z 2
2015-09-18T21:36:00Z 2
2015-09-18T21:48:00Z 0
> SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-09-18T21:24:00Z' AND time <= '2015-09-18T21:54:00Z' GROUP BY time(12m) fill(800000)
name: h2o_feet
time count
---- -----
2015-09-18T21:24:00Z 2
2015-09-18T21:36:00Z 2
2015-09-18T21:48:00Z 800000
更多聚合语法请看InfluxDB官方文档:InfluxQL functions | InfluxDB OSS 1.7 Documentation
关于为什么 InfluxDB 不是 CRUD 的说明
InfluxDB 是一个针对时间序列数据进行了优化的数据库。这些数据通常来自分布式传感器组、大型网站的点击数据或金融交易列表等来源。
这些数据的一个共同点是它在聚合中更有用。一篇文章说您的计算机的 CPU 在星期二 12:38:35 UTC 的利用率为 12%,很难从中得出结论。当与该系列的其余部分结合并可视化时,它会变得更加有用。这是随着时间的推移开始显示趋势的地方,并且可以从数据中得出可行的见解。另外,时序数据一般只写一次,很少更新。
结果是 InfluxDB 不是一个完整的 CRUD 数据库,而是更像一个 CR-ud,将创建和读取数据的性能优先于更新和销毁,并防止某些更新和销毁行为以使创建和读取性能更高:
- 要更新一个记录,请插入一个具有相同Measurement、Tags 和时间戳的记录。
- 你可以删除或删除一个系列,但不能基于字段值删除单个记录。作为一种解决方法,您可以搜索字段值,检索时间,然后根据time字段删除。
- 如果你还不能更新或重命名标签 - 请参阅 GitHub 问题#4157了解更多信息。要修改一系列点的标记,请找到具有违规标记值的点,将值更改为所需的值,将点写回,然后删除具有旧标记值的系列。
- 你不能按标签键(而不是值)删除标签
InfluxDB 设计见解和权衡
InfluxDB 是一个时间序列数据库。针对这个用例进行优化需要一些权衡,主要是为了以功能为代价来提高性能。下面列出了一些导致权衡的设计见解:
-
对于时间序列用例,我们假设如果多次发送相同的数据,那么它就是客户端刚刚发送多次的完全相同的数据。
优点:简化冲突解决提高了写入性能。
缺点:不能存储重复数据;在极少数情况下可能会覆盖数据。 -
删除很少发生。当它们确实发生时,几乎总是针对大量冷写的旧数据。
优点:限制对删除的访问可以提高查询和写入性能。
缺点:删除功能受到很大限制。 -
对现有数据的更新很少发生,有争议的更新永远不会发生。时间序列数据主要是从未更新的新数据。
优点:限制对更新的访问可以提高查询和写入性能。
缺点:更新功能受到很大限制。 -
绝大多数写入都是针对具有最近时间戳的数据,并且数据是按时间升序添加的。
优点:按时间升序添加数据的性能明显更高。
缺点:使用随机时间或时间不按升序写入点的性能显着降低。 -
规模至关重要。数据库必须能够处理大量的读取和写入。
优点:数据库可以处理大量的读取和写入。
缺点: InfluxDB 开发团队被迫做出权衡以提高性能。 -
能够写入和查询数据比拥有高度一致的视图更重要。
优点:写入和查询数据库可以由多个客户端在高负载下完成。
缺点:如果数据库负载过重,查询返回可能不包括最近的点。 -
许多时间序列都是短暂的。经常有时间序列只出现几个小时然后就消失了,例如一个新主机启动并报告了一段时间然后被关闭。
优点: InfluxDB 擅长管理不连续的数据。
缺点:无模式设计意味着不支持某些数据库功能,例如没有交叉表连接。 -
没有Point很重要。
优点: InfluxDB 有非常强大的工具来处理聚合数据和大型数据集。
Con:Point 没有传统意义上的ID,它们是通过时间戳和序列来区分的。