之所以学习InfluxDB,是因为在一篇公众号的文章中发现作者使用InfluxDB结合爬虫和ganfana实现一个动态的可视化监控系统,也是我第一次接触时序数据库的开始。

InfluxDB

什么是InfluxDB

InfluxDB是一个时间序列数据库,旨在处理高写入和查询负载。存储设计实际戳的数据,可用于DevOps监控,应用程序指标,物联网传感器数据和实时分析。Influxdb使用NTP(Network Time Protocol),InfluxDB使用主机的UTC本地时间为数据分配时间戳并用于协调目的。 使用网络时间协议(NTP)同步主机之间的时间; 如果主机的时钟与NTP不同步,写入InfluxDB的数据的时间戳可能不准确。

InfluxDB的安装以及配置

注:influxdb的安装需要root权限或者需要管理员权限,默认情况下,influxdb使用8086,8088两个端口,TCP端口8086用于通过InfluxDB的HTTP API进行客户端 - 服务器通信TCP端口8088用于RPC服务以进行备份和还原。端口的映射可以通过配置文件来进行修改(/etc/influxdb/influxdb.conf)。

由于我使用的是Centos,所以在这里介绍Centos的安装,对于其他系统的软件安装,可以从官方文档中查看,十分详细。

⑴添加仓库

cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

⑵安装并启动

sudo yum install influxdb
sudo service influxdb start

⑶配置

对于Influxdb,每个配置文件设置的内部默认值,使用Influxd config命令可以查看默认配置,本地配置文件(/etc/influxdb/influxdb.conf)中的大多数设置都被注释掉了; 所有注释掉的设置将由内部默认值确定。 本地配置文件中的任何未注释的设置都会覆盖内部默认值。

两种方式的配置文件:

①指出配置文件,使用-config

influxd -config /etc/influxdb/influxdb.conf

②设置环境变量,INFLUXDB_CONFIG_PATH

echo $INFLUXDB_CONFIG_PATH
/etc/influxdb/influxdb.conf

influxd

相关概念

数据样本:

name: student
time                           height id id_1 name value
----                           ------ -- ---- ---- -----

Influxdb是一个时序数据库,上面是一个student样本数据,对于每一个数据,都有time列,用来存储时间戳,时间戳的显式方式为连接influxdb时设置的时间格式。 height,name,value代表字段(field),字段有key-value组成。字段的值可以是字符串,浮点数,整型,布尔类型。字段集合即所有的字段和字段值,对于influxdb,Fields是InfluxDB数据结构的必需部分 - 没有字段,不能在InfluxDB中拥有数据。 注意字段未编入索引。 使用字段值作为过滤器的查询必须扫描与查询中的其他条件匹配的所有值。 因此,相对于标记上的查询,这些查询不具有高性能(更多信息在下面的标记上) 通常,字段不应包含常用查询元数据。id,id_1是标签(tags),由键值对组成,标签集合即所有的标签和标签值组,标签是可选的。 您不需要在数据结构中包含标记,但通常最好使用它们,因为与字段不同,标记是索引的。 这意味着对标签的查询更快,并且该标签非常适合存储常用查询元数据。保留策略描述了InfluxDB保存数据的时间(DURATION)以及这些数据的副本数量(REPLICATION)。 InfluxDB默认创建保留策略autogen ; 它具有无限持续时间并且复制因子设置为1。

连接InfluxDB

我们使用命令行接口连接influxdb.

[land@localhost influxdb]$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.7.2
InfluxDB shell version: 1.7.2
Enter an InfluxQL query

解释:influx是连接influxdb的命令,percision用于格式化时间戳,rfc3339是一种时间戳格式(YYYY-MM-DDTHH:MM:SS)

⑴创建数据库: CREATE DATABASE databaseName

⑵查看已创建的数据库: SHOW DATABASES

⑶使用数据库 : USE databaseName

⑷删除数据库: DROP databaseName

写入数据:

在时序数据库中,数据通过时序被组织起来,时间序列有零到多个点,每个点对应度量的每个离散样本,点包括时间,至少一个键值字段,零个或多个键值标签。每行数据都有一个确定的标识,类似与表名,标签(tag)和字段(field)可以看做是表的列,区别就是,字段不能建立索引,而标签可以被索引。eg:

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

student,id=001,name=zs height=175
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

插入数据(InfluxDB没有显示的创建表,插入的同时会创建表):eg:

INSERT studnet,id=001,name=zs height=175

查询数据:eg

> SELECT * FROM student
name: student
time                           height id id_1 name value
----                           ------ -- ---- ---- -----
2019-01-11T08:34:12.016573844Z           1    zs   1
2019-01-11T08:34:26.024481448Z        1       zs   
2019-01-11T08:35:23.206678345Z 175       001  zs   

注意:如果没有为某个点提供时间戳,InfluxDB会在获取该点时分配本地当前时间戳。

删除表:eg:

InfluxDB术语

batch:点的集合,用于在每次HTTP请求的时候,将批量的点存储数据库,进行批量操作,可以大量减少HTTP开销。

continuous query(CQ):在数据库中自动且定期运行的InfluxQL查询。 连续查询需要SELECT子句中的函数,并且必须包含GROUP BY time()子句。

database :用于存储数据的集合。

field:InfluxDB数据结构中的键值对,用于记录元数据和实际数据值。

field key - field  value: 字段的键 - 字段的值。

field set : 字段键的集合。

function: InfluxDB中的执行单元,方法。

measurement:InfluxDB结构的一部分,描述存储在相关字段中的数据。

poing:InfluxDB数据结构的一部分,由一系列中的单个字段集合组成。 每个点由其系列和时间戳唯一标识。

series:InfluxDB数据结构中的数据集合,测量,标记集和保留策略。

shard,tag,schema等等等,只要有数据库的基础,这些概念就很好理解,基本意思一样。

InfluxDB模式设计:

鼓励使用的模式:

在标记中编辑元数据,标记可以被索引,字段则不行。

如果数据是常见查询元数据,则将数据存储在标记(tag)中;

如果您计划将数据与GROUP BY()一起使用,请将数据存储在标记(tag)中;

如果您打算将数据与InfluxQL函数一起使用,请将数据存储在字段(field)中;

如果您需要将数据存储在字符串以外的字段中,则将数据存储在字段(field)中。

不鼓励使用的模式:

没有太多的series

包含高度可变信息的标签将导致数据库中出现大量序列,通俗地称为高级基数。高级系列基数是许多数据库工作负载的高内存使用率的主要驱动因素。对于内存有限制的话,请考虑将高基数数据存储为字段而不是标记。

不要在measurement名里面编辑数据,对于measurement的编辑,尽量不要单独为一个数据把绑定一个measurement,而是尽量使用标签,这样当进行多个值的操作时(求总和,平均)等操作时,对于单个绑定一个measurement名的多个数据行时不行的,使用标签可以轻松的求取。

不要在标签中放置多条信息,在进行查询的时候,会因为标签的不同而需要使用复杂的表达式,可以尝试使用多个标签来分配每个不同的标记。

等等等等。。。

 

如有问题,敬请指出,,参考http://docs.influxdata.com/influxdb/v1.7/introduction/