参考文献
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
Using default tag: latest
Trying to pull repository docker.io/library/influxdb ...
latest: Pulling from docker.io/library/influxdb
cd8eada9c7bb: Pull complete
c2677faec825: Pull complete
fcce419a96b1: Pull complete
7eb470cb34c6: Pull complete
5d32b89f3e91: Pull complete
c06b59b518ce: Pull complete
59c5fc9b8822: Pull complete
a6b36405d3fd: Pull complete
Digest: sha256:2c1dba8c2b9713355edce4a9824a10226be0d4ace071ecb663224a4d29ae8403
Status: Downloaded newer image for docker.io/influxdb:latest
[root@server81 influxdb]#
编写启动influxdb
服务脚本:
[root@server81 influxdb]# cat restart_influxdb.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
docker stop influxdb
docker rm influxdb
docker run -d --name influxdb -p 8086:8086 -v $basedir/influxdb:/var/lib/influxdb influxdb
[root@server81 influxdb]#
执行启动influxdb服务:
## 执行shell脚本重启服务
[root@server81 influxdb]# ./restart_influxdb.sh
influxdb
influxdb
d2918dc47850c94f0532e41465e8943c5e45c30c1884b529939bd49cd8c30263
[root@server81 influxdb]#
[root@server81 influxdb]# ls
influxdb restart_influxdb.sh
[root@server81 influxdb]#
[root@server81 influxdb]# ls influxdb/
data meta wal
[root@server81 influxdb]#
登陆influxdb的CLI界面
## 查看docker启动进程
[root@server81 influxdb]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2918dc47850 influxdb "/entrypoint.sh in..." 17 minutes ago Up 17 minutes 0.0.0.0:8086->8086/tcp influxdb
82a294241ff7 registry:2 "/entrypoint.sh /e..." 4 weeks ago Up 2 days 0.0.0.0:5000->5000/tcp registry
[root@server81 influxdb]#
## 进入influxdb容器内
[root@server81 influxdb]# docker exec -it influxdb bash
root@d2918dc47850:/#
root@d2918dc47850:/#
执行influx将启动CLI并自动连接到本地InfluxDB实例(假设您已经启动了服务器service influxdb start或influxd直接运行)。输出应如下所示:
[root@server81 influxdb]# docker exec -it influxdb bash
root@d2918dc47850:/#
root@d2918dc47850:/# influx
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query
> exit
root@d2918dc47850:/#
root@d2918dc47850:/# influx -precision rfc3339
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query
>
注意:
- 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 <db-name>InfluxQL
语句创建数据库,其中<db-name>
是您要创建的数据库的名称。只要数据库的名称是双引号的字符串,就可以包含任何unicode
字符。如果名称仅包含ASCII
字母,数字或下划线且不以数字开头,则也可以不加引号。
创建一个数据库,名称为mydb
:
> CREATE DATABASE mydb
>
注意:按 Enter键后,将出现一个新提示,并且不显示任何其他提示。在CLI中,这意味着语句已执行且没有要显示的错误。如果出现问题,将始终显示错误。没有消息就是好消息!
现在已经创建了mydb数据库,可以SHOW DATABASES语句显示所有现有数据库:
root@d2918dc47850:/# influx -precision rfc3339
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query
>
> CREATE DATABASE mydb
>
> show databases
name: databases
name
----
_internal
mydb
>
>
> SHOW DATABASES
name: databases
name
----
_internal
mydb
>
注意: 该
_internal
数据库中创建和使用InfluxDB
存储内部运行指标。稍后再查看以了解InfluxDB
如何在幕后执行。
设置使用哪个数据库 use <db-name>
在使用SHOW DATABASES
查看了有哪些数据库之后,就可以使用USE <db-name>
来设置将要使用的数据库,自动为将来的所有请求设置数据库。例如:
> SHOW DATABASES
name: databases
name
----
_internal
mydb
>
> use mydb
Using database mydb
>
现在,将来的命令只会针对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,其遵循以下格式:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
以下几行都是可以写入InfluxDB的点的示例:
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
注意:有关线路协议的更多信息,请参见“ 语法”页面。
要使用CLI将单个时间序列数据点插入InfluxDB,请输入INSERT后跟一个点:
root@d2918dc47850:/# influx
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query
> show databases
name: databases
name
----
_internal
mydb
>
> use mydb
Using database mydb
>
> INSERT cpu,host=serverA,region=us_west value=0.64
>
INSERT cpu,host=serverA,region=us_west value=0.64
说明:测量名称为cpu
和标记(tag
)的点host,region
现在已经写入数据库,测量value
值为0.64
。
查询刚才写的数据:
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
1546688002825475579 serverA us_west 0.64
>
可以看出测量名称cpu
就是SQL
的表名,其他就是字段名称。这样就更加好理解了。
注意:在插入数据的时候,并没有提供时间戳。如果没有为某个点提供时间戳,InfluxDB会在获取该点时分配本地当前时间戳。
这个时间戳就类型mysql中的自增长id。
让我们尝试存储另一种类型的数据,在同一测量中有两个字段:
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
>
查询刚刚插入temperature
的所有字段和标记,您可以使用*
运算符:
> select * from temperature
name: temperature
time external internal machine type
---- -------- -------- ------- ----
1546688551508705124 25 37 unit42 assembly
>
警告: 在大型数据库上使用*不带LIMIT子句可能会导致性能问题。您可以使用Ctrl+C取消响应时间过长的查询。
## 再次插入多条数据
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
>
> select * from temperature
name: temperature
time external internal machine type
---- -------- -------- ------- ----
1546688551508705124 25 37 unit42 assembly
1546688749536654124 25 37 unit42 assembly
1546688750174577918 25 37 unit42 assembly
1546688750737028280 25 37 unit42 assembly
1546688751229687907 25 37 unit42 assembly
1546688751772543015 25 37 unit42 assembly
1546688752401279324 25 37 unit42 assembly
## 使用limit查询,基本跟SQL写法一致
> select * from temperature limit 3
name: temperature
time external internal machine type
---- -------- -------- ------- ----
1546688551508705124 25 37 unit42 assembly
1546688749536654124 25 37 unit42 assembly
1546688750174577918 25 37 unit42 assembly
>
InfluxQL有许多功能和关键字,这里没有涉及,包括对Go风格的正则表达式的支持。例如:
执行使用正则匹配所有数据 SELECT * FROM /.*/ LIMIT 1
> SELECT * FROM /.*/
name: cpu
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
1546688002825475579 serverA us_west 0.64
name: temperature
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
1546688551508705124 25 37 unit42 assembly
1546688749536654124 25 37 unit42 assembly
1546688750174577918 25 37 unit42 assembly
1546688750737028280 25 37 unit42 assembly
1546688751229687907 25 37 unit42 assembly
1546688751772543015 25 37 unit42 assembly
1546688752401279324 25 37 unit42 assembly
>
## 如果要看有哪些表格数据,可以使用这句进行查看。
> SELECT * FROM /.*/ limit 1
name: cpu
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
1546688002825475579 serverA us_west 0.64
name: temperature
time external host internal machine region type value
---- -------- ---- -------- ------- ------ ---- -----
1546688551508705124 25 37 unit42 assembly
>
执行where语句条件判断:select * from "temperature" where "internal" > 36
> select * from "temperature" where "internal" > 36
name: temperature
time external internal machine type
---- -------- -------- ------- ----
1546688551508705124 25 37 unit42 assembly
1546688749536654124 25 37 unit42 assembly
1546688750174577918 25 37 unit42 assembly
1546688750737028280 25 37 unit42 assembly
1546688751229687907 25 37 unit42 assembly
1546688751772543015 25 37 unit42 assembly
1546688752401279324 25 37 unit42 assembly
>
> select * from "temperature" where "internal" > 38
>
这就是将数据写入InfluxDB并进行查询所需要知道的全部内容。要了解有关InfluxDB写入协议的更多信息,请查看写入数据指南。要进一步探索查询语言,请查看查询数据指南。有关InfluxDB概念的更多信息,请查看“ 关键概念”页面。