用kafka来聚合分布式应用程序的数据,将数据集中后进行统一的分析和展示。这些数据可能会很多很多,聚合的频率也会很高,如果存到关系型数据库,比如mysql,就会有很多问题。

首先,大量数据涌入,非常会占用空间,数据量会越来越大,查询也会越来越慢,比如查询某一个时间段的数据。

InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。

1.下载/安装

https://portal.influxdata.com/downloads/

image-20210505042815609

#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
      • 每个数据记录时间,是数据库中的主索引

image-20210505044646670

这是一张水位measurement h2o_feet,一共7次按时间存储的监测数据。这个measurement有一个tag值location,标识地理位置,有两个tag值:coyote_creeksanta_monica。这个measurement还有两个fieldslevel description水位描述,water_level水位值。

多个tag key会转换为数据列,会作为索引,多个field key 也会转换为数据列,也会作为索引

如果还不能理解,就多用多感受吧。

4.初始化设置

image-20210505052202768

一定要记得自己输入的账号密码哟,忘了就麻烦了。^_^,博主差点就忘了。就备注一下username:admin password:12345678,就能通过浏览器打开如下界面进行登录:

image-20210505052356869

image-20210505052421744

5.命令行读/写

5.1 全局注册

为了避免在每个命令都需要传递hostauthentication tokenorganization参数的繁琐,还是先全局注册一下。

influx config create --config-name global-config \
  --host-url http://localhost:8086 \
  --org randy \
  --token 9KMVnInyi1ATEsTBbKKwyyafQW1KqOIw0S7KnM2tH3eNxrhB6WNq1yN0RLg8W7dRRzIq9Jjt4UdXGOxPD1-7hQ== \
  --active

image-20210505201745357

更多配置就去官方参考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查询

通过influxdbUI进行查询

在那之前,博主先执行一组样例数据:

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'

查询

image-20210505213405079

按照博主个人查询习惯对上面的数据进行查询:

查询measurement下,ip为192.16.31.206的温度

image-20210505213533501

我们切换一下折线图,更直观

image-20210505213724511

剩下的留给大家慢慢探索吧。

5.4 查询数据

influxDB 1.x中,几乎可以通过类似于sql语句就能完成查询,这种类sql被称为InfluxQL,因为,数据是存在数据库中,但是在2.0中,引入了新的概念bucket,数据是存储在bucket中,如果仍然想使用InfluxQL进行查询,那就必须在bucketdatabase-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到命令行。

查询结果

image-20210505221431831

更多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/