参考文献

InfluxDB 1.7文档https://docs.influxdata.com/influxdb/v1.7/

InfluxDB简介

InfluxDB是一个时间序列数据库,旨在处理高写入和查询负载。它是TICK堆栈的组成部分 。InfluxDB旨在用作涉及大量带时间戳数据的任何用例的后备存储,包括DevOps监控,应用程序指标,物联网传感器数据和实时分析。

主要特点

以下是InfluxDB目前支持的一些功能,使其成为处理时间序列数据的绝佳选择。

  • 专为时间序列数据编写的自定义高性能数据存储。TSM引擎允许高摄取速度和数据压缩
  • 完全写在Go。它编译成单个二进制文件,没有外部依赖项。
  • 简单,高性能的写入和查询HTTP API。
  • 插件支持其他数据提取协议,如Graphite,collectd和OpenTSDB。
  • 专为类似SQL的查询语言量身定制,可轻松查询聚合数据。
  • 标签允许对系列进行索引以实现快速有效的查询。
  • 保留策略有效地自动使过时数据过期。
  • 连续查询自动计算聚合数据,以提高频繁查询的效率。

InfluxDB的开源版本在单个节点上运行。如果您需要高可用性来消除单点故障,请考虑InfluxDB企业版。

InfluxDB默认使用以下网络端口:

  • TCP端口8086用于通过InfluxDB的HTTP API进行客户端 - 服务器通信
  • TCP端口8088用于RPC服务以进行备份和还原

除了上面的端口,InfluxDB还提供了多个可能需要自定义端口的插件。可以通过配置文件修改所有端口映射,配置文件位于/etc/influxdb/influxdb.conf默认安装位置。


使用网络时间协议(NTP)用于保证写入InfluxDB的时间准确

在安装部署InfluxDB的服务器首先要保证好服务器的UTC本地时间准确,不然写入的时间序列数据肯定有误。为了保证时间准确,最好开启NTP服务进行时钟同步。

使用docker启动InfluxDB

下载镜像:docker pull influxdb

[root@server81 influxdb]# docker pull influxdb<br></br>Using default tag: latest<br></br>Trying to pull repository docker.io/library/influxdb ...<br></br>latest: Pulling from docker.io/library/influxdb<br></br>cd8eada9c7bb: Pull complete<br></br>c2677faec825: Pull complete<br></br>fcce419a96b1: Pull complete<br></br>7eb470cb34c6: Pull complete<br></br>5d32b89f3e91: Pull complete<br></br>c06b59b518ce: Pull complete<br></br>59c5fc9b8822: Pull complete<br></br>a6b36405d3fd: Pull complete<br></br>Digest: sha256:2c1dba8c2b9713355edce4a9824a10226be0d4ace071ecb663224a4d29ae8403<br></br>Status: Downloaded newer image for docker.io/influxdb:latest<br></br>[root@server81 influxdb]#

编写启动influxdb服务脚本:

[root@server81 influxdb]# cat restart_influxdb.sh<br></br>#!/bin/bash<br></br>basedir=$(cd `dirname $0`;pwd)<br></br><br></br>docker stop influxdb<br></br>docker rm influxdb<br></br>docker run -d --name influxdb -p 8086:8086 -v $basedir/influxdb:/var/lib/influxdb influxdb<br></br>[root@server81 influxdb]#

执行启动influxdb服务:

## 执行shell脚本重启服务<br></br>[root@server81 influxdb]# ./restart_influxdb.sh<br></br>influxdb<br></br>influxdb<br></br>d2918dc47850c94f0532e41465e8943c5e45c30c1884b529939bd49cd8c30263<br></br>[root@server81 influxdb]#<br></br>[root@server81 influxdb]# ls<br></br>influxdb  restart_influxdb.sh<br></br>[root@server81 influxdb]#<br></br>[root@server81 influxdb]# ls influxdb/<br></br>data  meta  wal<br></br>[root@server81 influxdb]#

登陆influxdb的CLI界面

## 查看docker启动进程<br></br>[root@server81 influxdb]# docker ps<br></br>CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES<br></br>d2918dc47850        influxdb            "/entrypoint.sh in..."   17 minutes ago      Up 17 minutes       0.0.0.0:8086->8086/tcp   influxdb<br></br>82a294241ff7        registry:2          "/entrypoint.sh /e..."   4 weeks ago         Up 2 days           0.0.0.0:5000->5000/tcp   registry<br></br>[root@server81 influxdb]#<br></br>## 进入influxdb容器内<br></br>[root@server81 influxdb]# docker exec -it influxdb bash<br></br>root@d2918dc47850:/#<br></br>root@d2918dc47850:/#

执行influx将启动CLI并自动连接到本地InfluxDB实例(假设您已经启动了服务器service influxdb start或influxd直接运行)。输出应如下所示:

[root@server81 influxdb]# docker exec -it influxdb bash<br></br>root@d2918dc47850:/#<br></br>root@d2918dc47850:/# influx<br></br>Connected to http://localhost:8086 version 1.7.2<br></br>InfluxDB shell version: 1.7.2<br></br>Enter an InfluxQL query<br></br>> exit<br></br>root@d2918dc47850:/#<br></br>root@d2918dc47850:/# influx -precision rfc3339<br></br>Connected to http://localhost:8086 version 1.7.2<br></br>InfluxDB shell version: 1.7.2<br></br>Enter an InfluxQL query<br></br>>

注意:

  • InfluxDB HTTP API 8086默认在端口上运行。因此,influx将连接到端口8086和localhost默认。如果您需要更改这些默认值,请运行influx --help查看相关帮助。
  • 使用-precision参数指定任何返回的时间戳的格式/精度。在上面的示例中,rfc3339告诉InfluxDB以RFC3339格式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)返回时间戳。

退出的方式,输入exit现在,命令行已准备好以Influx查询语言(又称InfluxQL)语句的形式获取输入。要退出InfluxQL shell,请键入exit并单击return。

创建InfluxDB数据库

全新安装的InfluxDB没有数据库(除了系统\_internal),因此创建一个是我们的首要任务。您可以使用CREATE DATABASE InfluxQL语句创建数据库,其中是您要创建的数据库的名称。只要数据库的名称是双引号的字符串,就可以包含任何unicode字符。如果名称仅包含ASCII字母,数字或下划线且不以数字开头,则也可以不加引号。

创建一个数据库,名称为mydb:

> CREATE DATABASE mydb<br></br>>
**注意:**按 Enter键后,将出现一个新提示,并且不显示任何其他提示。在CLI中,这意味着语句已执行且没有要显示的错误。如果出现问题,将始终显示错误。没有消息就是好消息!

现在已经创建了mydb数据库,可以SHOW DATABASES语句显示所有现有数据库:

root@d2918dc47850:/# influx -precision rfc3339<br></br>Connected to http://localhost:8086 version 1.7.2<br></br>InfluxDB shell version: 1.7.2<br></br>Enter an InfluxQL query<br></br>><br></br>> CREATE DATABASE mydb<br></br>><br></br>> show databases<br></br>name: databases<br></br>name<br></br>----<br></br>_internal<br></br>mydb<br></br>><br></br>><br></br>> SHOW DATABASES<br></br>name: databases<br></br>name<br></br>----<br></br>_internal<br></br>mydb<br></br>>
注意: 该\_internal数据库中创建和使用InfluxDB存储内部运行指标。稍后再查看以了解InfluxDB如何在幕后执行。

设置使用哪个数据库 use

在使用SHOW DATABASES查看了有哪些数据库之后,就可以使用USE 来设置将要使用的数据库,自动为将来的所有请求设置数据库。例如:

> SHOW DATABASES<br></br>name: databases<br></br>name<br></br>----<br></br>_internal<br></br>mydb<br></br>><br></br>> use mydb<br></br>Using database mydb<br></br>>

现在,将来的命令只会针对mydb数据库运行。

写入数据到数据库中

现在我们有了一个数据库,InfluxDB已准备好接受查询和写入。InfluxDB中的数据按“时间序列”进行组织,其中包含测量值,如“cpu\_load”或“temperature”。时间序列的数据存在多个时间点测量值都是零的情况,部分存在测量值。其中每个时间点的数据包含了时间戳和测量值(例如"cpu\_load"),并且至少有一个键值field对应,例如cpu\_load = 21.2。大体格式可以简单理解这样 :时间 cpu\_load = 21.2。另外还有一种键值标签 tags 的数据,例如 "host=server01","region=EMEA"等。

从概念上讲,您可以将存储测量值数据表格视为一个SQL表,其中主索引始终是时间。tags并且fields是表中的有效列。tags可以是索引,而fields则无法设置为索引。相对于SQL表不同之处在于,使用InfluxDB,您可以进行数百万次测量,您不必预先定义表格,也不会存储空值。

使用线路协议(Line Protocol)将点写入InfluxDB,其遵循以下格式:[,=...] =[,=...] [unix-nano-timestamp]

以下几行都是可以写入InfluxDB的点的示例:

cpu,host=serverA,region=us_west value=0.64<br></br>payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230<br></br>stock,symbol=AAPL bid=127.46,ask=127.48<br></br>temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
**注意:**有关线路协议的更多信息,请参见“ 语法”页面。

要使用CLI将单个时间序列数据点插入InfluxDB,请输入INSERT后跟一个点:

root@d2918dc47850:/# influx<br></br>Connected to http://localhost:8086 version 1.7.2<br></br>InfluxDB shell version: 1.7.2<br></br>Enter an InfluxQL query<br></br>> show databases<br></br>name: databases<br></br>name<br></br>----<br></br>_internal<br></br>mydb<br></br>><br></br>> use mydb<br></br>Using database mydb<br></br>><br></br>> INSERT cpu,host=serverA,region=us_west value=0.64<br></br>>

INSERT cpu,host=serverA,region=us\_west value=0.64**说明:**测量名称为cpu和标记(tag)的点host,region现在已经写入数据库,测量value值为0.64。

查询刚才写的数据:

> SELECT "host", "region", "value" FROM "cpu"<br></br>name: cpu<br></br>time                host    region  value<br></br>----                ----    ------  -----<br></br>1546688002825475579 serverA us_west 0.64<br></br>>

可以看出测量名称cpu就是SQL的表名,其他就是字段名称。这样就更加好理解了。

注意:在插入数据的时候,并没有提供时间戳。如果没有为某个点提供时间戳,InfluxDB会在获取该点时分配本地当前时间戳。这个时间戳就类型mysql中的自增长id。

让我们尝试存储另一种类型的数据,在同一测量中有两个字段:

> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>>

查询刚刚插入temperature的所有字段和标记,您可以使用*运算符:

> select * from temperature<br></br>name: temperature<br></br>time                external internal machine type<br></br>----                -------- -------- ------- ----<br></br>1546688551508705124 25       37       unit42  assembly<br></br>>
警告: 在大型数据库上使用*不带LIMIT子句可能会导致性能问题。您可以使用Ctrl+C取消响应时间过长的查询。
## 再次插入多条数据<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>> INSERT temperature,machine=unit42,type=assembly external=25,internal=37<br></br>><br></br>> select * from temperature<br></br>name: temperature<br></br>time                external internal machine type<br></br>----                -------- -------- ------- ----<br></br>1546688551508705124 25       37       unit42  assembly<br></br>1546688749536654124 25       37       unit42  assembly<br></br>1546688750174577918 25       37       unit42  assembly<br></br>1546688750737028280 25       37       unit42  assembly<br></br>1546688751229687907 25       37       unit42  assembly<br></br>1546688751772543015 25       37       unit42  assembly<br></br>1546688752401279324 25       37       unit42  assembly<br></br>## 使用limit查询,基本跟SQL写法一致<br></br>> select * from temperature limit 3<br></br>name: temperature<br></br>time                external internal machine type<br></br>----                -------- -------- ------- ----<br></br>1546688551508705124 25       37       unit42  assembly<br></br>1546688749536654124 25       37       unit42  assembly<br></br>1546688750174577918 25       37       unit42  assembly<br></br>>

InfluxQL有许多功能和关键字,这里没有涉及,包括对Go风格的正则表达式的支持。例如:

执行使用正则匹配所有数据 SELECT * FROM /.*/ LIMIT 1

> SELECT * FROM /.*/<br></br>name: cpu<br></br>time                external host    internal machine region  type value<br></br>----                -------- ----    -------- ------- ------  ---- -----<br></br>1546688002825475579          serverA                  us_west      0.64<br></br><br></br>name: temperature<br></br>time                external host internal machine region type     value<br></br>----                -------- ---- -------- ------- ------ ----     -----<br></br>1546688551508705124 25            37       unit42         assembly<br></br>1546688749536654124 25            37       unit42         assembly<br></br>1546688750174577918 25            37       unit42         assembly<br></br>1546688750737028280 25            37       unit42         assembly<br></br>1546688751229687907 25            37       unit42         assembly<br></br>1546688751772543015 25            37       unit42         assembly<br></br>1546688752401279324 25            37       unit42         assembly<br></br>><br></br>## 如果要看有哪些表格数据,可以使用这句进行查看。<br></br>> SELECT * FROM /.*/ limit 1<br></br>name: cpu<br></br>time                external host    internal machine region  type value<br></br>----                -------- ----    -------- ------- ------  ---- -----<br></br>1546688002825475579          serverA                  us_west      0.64<br></br><br></br>name: temperature<br></br>time                external host internal machine region type     value<br></br>----                -------- ---- -------- ------- ------ ----     -----<br></br>1546688551508705124 25            37       unit42         assembly<br></br>>

执行where语句条件判断:select * from "temperature" where "internal" > 36

> select * from "temperature" where "internal" > 36<br></br>name: temperature<br></br>time                external internal machine type<br></br>----                -------- -------- ------- ----<br></br>1546688551508705124 25       37       unit42  assembly<br></br>1546688749536654124 25       37       unit42  assembly<br></br>1546688750174577918 25       37       unit42  assembly<br></br>1546688750737028280 25       37       unit42  assembly<br></br>1546688751229687907 25       37       unit42  assembly<br></br>1546688751772543015 25       37       unit42  assembly<br></br>1546688752401279324 25       37       unit42  assembly<br></br>><br></br>> select * from "temperature" where "internal" > 38<br></br>>

这就是将数据写入InfluxDB并进行查询所需要知道的全部内容。要了解有关InfluxDB写入协议的更多信息,请查看写入数据指南。要进一步探索查询语言,请查看查询数据指南。有关InfluxDB概念的更多信息,请查看“ 关键概念”页面。

标签: Centos7, 入门, influxdb, InfluxDB, unit42

相关文章推荐

添加新评论,含*的栏目为必填