【influxdb】influxdb使用之路(一)初探
用kafka来聚合分布式应用程序的数据,将数据集中后进行统一的分析和展示。这些数据可能会很多很多,聚合的频率也会很高,如果存到关系型数据库,比如mysql
,就会有很多问题。
首先,大量数据涌入,非常会占用空间,数据量会越来越大,查询也会越来越慢,比如查询某一个时间段的数据。
InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。
1.下载/安装
https://portal.influxdata.com/downloads/
#arm64
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.6-arm64.deb
sudo dpkg -i influxdb2-2.0.6-arm64.deb
#amd64
wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.6-amd64.deb
sudo dpkg -i influxdb2-2.0.6-amd64.deb
2.启动
2.1 单次启动
influxd
2.2 以服务的方式启动
systemctl start influxdb
3.概念
influxdb
版本更迭几次了,咱们用新不用旧。先了解一下概念吧。
- organization
用户所属组织
- bucket
bucket是存储时间序列数据的位置。所有bucket都有保留期,即每个数据点保存的时间。一个bucket属于一个组织。有点类似关系型数据库的database
- authentication token
身份认证token
-
measurement:度量,类似关系型数据库的数据表
-
Point:
fluxdb使用线协议(line protocol )写入数据点(Point)。它是一种基于文本的格式,提供数据点的度量(measurement)、标记集(tags)、字段集(fields)和时间戳(timestamp)。
- Point.field
- 数据值,指代的数据维度,如最大、最小、平均
- Point.tags
- tag,各种有索引的属性,例如温度、湿度、浓度
- Point.time
- 每个数据记录时间,是数据库中的主索引
- Point.field
这是一张水位measurement h2o_feet
,一共7次按时间存储的监测数据。这个measurement有一个tag
值location,标识地理位置,有两个tag值:coyote_creek
与santa_monica
。这个measurement还有两个fields
:level description
水位描述,water_level
水位值。
多个tag key会转换为数据列,会作为索引,多个field key 也会转换为数据列,也会作为索引
如果还不能理解,就多用多感受吧。
4.初始化设置
一定要记得自己输入的账号密码哟,忘了就麻烦了。^_^,博主差点就忘了。就备注一下username:admin password:12345678
,就能通过浏览器打开如下界面进行登录:
5.命令行读/写
5.1 全局注册
为了避免在每个命令都需要传递host
、authentication token
、organization
参数的繁琐,还是先全局注册一下。
influx config create --config-name global-config \
--host-url http://localhost:8086 \
--org randy \
--token 9KMVnInyi1ATEsTBbKKwyyafQW1KqOIw0S7KnM2tH3eNxrhB6WNq1yN0RLg8W7dRRzIq9Jjt4UdXGOxPD1-7hQ== \
--active
更多配置就去官方参考influx config
文档。
5.2 写入数据
通过命令行写入数据,使用influx write
命令。而使用这个命令要么通过标准输入(stdin)或者指定文件。
influx write \
-b server \
-o randy \
-p s \
'system,ip=192.168.31.204,hostName=masterkafka temperature=80.0,diskfree="400G",disktotal="500G" 1620218903089000000'
influx write \
-b server \
-o randy \
-p s \
'system,ip=192.168.31.205,hostName=nodekafka temperature=80.0,diskfree="400G",disktotal="500G" 1620217501'
上面就是两条执行命令写入数据的命令。
-
bucket
:server -
measurement
:system -
tag
:有两个,ip与hostname -
field
:有3个,温度、磁盘总量、可用磁盘
通过线(行)协议写数据点,大概有以下几点需要注意:
- 多个tag需要,逗号隔开
- 多个field也需要,逗号隔开
- 如果field的value为integer,需要在末尾加
i
myMeasurement fieldKey=1i
更多内容,去官方探索吧。https://docs.influxdata.com/influxdb/v2.0/reference/syntax/line-protocol
5.3 UI查询
通过influxdb
的UI
进行查询
在那之前,博主先执行一组样例数据:
influx write \
-b server \
-o randy \
-p s \
'system,ip=192.168.31.206,hostName=nodekafka temperature=70.0,diskfree="300G",disktotal="400G" 1620220866'
influx write \
-b server \
-o randy \
-p s \
'system,ip=192.168.31.206,hostName=nodekafka temperature=50.0,diskfree="300G",disktotal="400G" 1620221400'
influx write \
-b server \
-o randy \
-p s \
'system,ip=192.168.31.206,hostName=nodekafka temperature=40.0,diskfree="300G",disktotal="400G" 1620221529'
查询
按照博主个人查询习惯对上面的数据进行查询:
查询measurement下,ip为192.16.31.206的温度
我们切换一下折线图,更直观
剩下的留给大家慢慢探索吧。
5.4 查询数据
在influxDB 1.x中,几乎可以通过类似于sql语句就能完成查询,这种类sql被称为InfluxQL
,因为,数据是存在数据库中,但是在2.0中,引入了新的概念bucket
,数据是存储在bucket
中,如果仍然想使用InfluxQL
进行查询,那就必须在bucket
与database-DBRP
做一个映射。后面酌情看是否继续探索,因为最新的client library中,并没有这块的api,官方也没有示例(或许可能是博主没有找到)。
influx query 'from(bucket: "server") |> range(start: -2h) |> filter(fn: (r) => r._measurement == "system" and r._field=="temperature")'
一行不是很好看
from(bucket: "server")
|> range(start: -2h)
|> filter(fn: (r) => r._measurement == "system" and r._field=="temperature")
官方称上面的为Flux query
,所谓的命令行查询也就是传递Flux query
到命令行。
查询结果
更多Flux query,就请阅读文章的童鞋前往官方网站进行探索。
参考链接
line protocol:https://docs.influxdata.com/influxdb/v2.0/reference/syntax/line-protocol/
influx query:https://docs.influxdata.com/influxdb/v2.0/reference/cli/influx/query/
write cli:https://docs.influxdata.com/influxdb/v2.0/write-data/developer-tools/influx-cli/
read cli:https://docs.influxdata.com/influxdb/v2.0/query-data/execute-queries/influx-query/
- 原文作者:Garfield
- 原文链接:http://www.randyfield.cn/post/2021-05-06-influxdb/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。