Skip to content

InfluxDB Learning Report

Zaq edited this page Nov 7, 2019 · 1 revision

InfluxDB 基础

InfluxDB 基本知识

简介

InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go语言开发,着力于处理高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,实时数据等场景。

功能特色

  • 给予时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
  • 可度量性:可以实时地对大量数据进行计算
  • 基于事件:支持任意的事件数据

主要特点

  • 无结构(无模式):可以是任意数量的列
  • 可拓展
  • 支持min,max,sum,count,mean,median等一系列函数,方便统计
  • 原生的HTTP支持,内置HTTP API
  • 强大的类SQL语法
  • 自带管理界面,方便使用

与常见的关系型数据库(MySQL)的比较

概念 MySQL InfluxDB
数据库 database database
table measurement
column tag(带索引的,非必须的)、field(不带索引)、timestemp(唯一主键)
  • tag set:不同的每组tag key和tag value的集合

  • field set:每组field key和field value的集合

  • retention policy:数据存储策略(默认策略为auutogen)InfluxDB没有删除数据操作,规定数据的保留时间达到清除数据的目的

  • series:共同retention policy, measurement和tag set的集合

  • point:point由时间戳(time)、数据(field)、标签(tags)组成

    point相当于传统数据库里的一行数据,如下表所示

    Point属性 传统数据库中的概念
    time 每个数据记录时间,是数据库中的主索引(会自动生成)
    fields 各种记录值(没有索引的属性)
    tags 各种索引的属性
  • shared:Shard 在 InfluxDB 中是一个比较重要的概念,它和 retention policy 相关联。每一个存储策略下会存在许多 shard,每一个 shard 存储一个指定时间段内的数据,并且不重复,例如 7点-8点 的数据落入 shard0 中,8点-9点的数据则落入 shard1 中。每一个 shard 都对应一个底层的 tsm 存储引擎,有独立的 cache、wal、tsm file。

  • 组件:TSM 存储引擎主要由几个部分组成: cache、wal、tsm file、compactor。

    • Cache:cache 相当于是 LSM Tree 中的 memtabl。插入数据时,实际上是同时往 cache 与 wal 中写入数据,可以认为 cache 是 wal 文件中的数据在内存中的缓存。当 InfluxDB 启动时,会遍历所有的 wal 文件,重新构造 cache,这样即使系统出现故障,也不会导致数据的丢失。

    • cache 中的数据并不是无限增长的,有一个 maxSize 参数用于控制当 cache 中的数据占用多少内存后就会将数据写入 tsm 文件。如果不配置的话,默认上限为 25MB,每当 cache 中的数据达到阀值后,会将当前的 cache 进行一次快照,之后清空当前 cache 中的内容,再创建一个新的 wal 文件用于写入,剩下的 wal 文件最后会被删除,快照中的数据会经过排序写入一个新的 tsm 文件中。

    • WAL:wal 文件的内容与内存中的 cache 相同,其作用就是为了持久化数据,当系统崩溃后可以通过 wal 文件恢复还没有写入到 tsm 文件中的数据。

    • TSM File:单个 tsm file 大小最大为 2GB,用于存放数据。

    • Compactor:compactor 组件在后台持续运行,每隔 1 秒会检查一次是否有需要压缩合并的数据。

      主要进行两种操作,一种是 cache 中的数据大小达到阀值后,进行快照,之后转存到一个新的 tsm 文件中。

      另外一种就是合并当前的 tsm 文件,将多个小的 tsm 文件合并成一个,使每一个文件尽量达到单个文件的最大大小,减少文件的数量,并且一些数据的删除操作也是在这个时候完成。

一个小例子

name: census

time butterflies honeybees location scientist
2015-08-18T00:00:00Z 12 23 1 langstroth
2015-08-18T00:00:00Z 1 30 1 perpetua
2015-08-18T00:06:00Z 11 28 1 langstroth
2015-08-18T00:06:00Z 3 28 1 perpetua
2015-08-18T05:54:00Z 2 11 2 langstroth
2015-08-18T06:00:00Z 1 10 2 langstroth
2015-08-18T06:06:00Z 8 23 2 perpetua
2015-08-18T06:12:00Z 7 22 2 perpetua

分析:

​ 上方的数据中,有一列称为时间time,InfluxDB中的所有数据都有该列。time存储时间戳,时间戳以RFC3339 UTC的形式显示与特定数据相关联的日期和时间。

fields

​ 接下来两列称为butterflieshoneybees,它们是fields。Field由field key和field value组成,其中field key是string,上例中对应的field value为butterflies:12-7;honeybees:23-22。

​ Field values是你的数据,它们可以是字符串,浮点数,整数或者布尔值,并且由于InfluxDB是时间序列数据库,所以Field值始终与时间戳关联。

​ 示例中的field-key和field-value对组成了field set

​ Field是InfluxDB数据结构必不可少的部分,没有field,就无法拥有数据。需要注意的是,field未编入索引。所以,使用field-values作为过滤器的查询必须扫描与查询中其他条件匹配的所有的值,所以,这些查询相对于标签查询tags的性能不高,通常,field不应该包含常用查询的源数据。

tags

​ 接下来两列称为locationscientist,它们是tags,由tag-keys和tag-values组成。它们都存储为String并且记录元数据。location有两个tag-values:12scientist也有两个tag-values:langstrothperpetua

​ 所以,上述例子中,依照locationscientist的排列组合,有4种tag key-value。

​ tag标签是可选的,你无需在数据结构中包含标签,但通常最好使用它们,因为与字段不同,标签是被索引的。这意味着对标签的查询虚度更快,并且标签非常适合存储常见查询的元数据。

常见InfluxQL语句

show databases;

use database_name;

show measurements;

# 查询10条数据
select * from measurement_name limit 10;

# 数据中的时间字段默认显示的是一个纳秒时间戳,改成可读格式,之后再查询,时间就是rfc3339标准格式
precision rfx3339# 或可以在连接数据库的时候,直接带该参数
influx -precision rfc3339# 查看一个measurement中的所有tag key
show tag keys# 查看一个measurement中的所有field key
show field keys;

# 查看一个measurement中所有的保存策略(可以有多个,一个标识为default)
show retenttion policies;

docker安装

拉取镜像
docker pll influxdb
建立容器
docker run -d -p 8083:8083 -p8086:8086 --expose 8090 --expose 8099 --name influxDbService influxdb
    -d:deamon,后台启动
    -p:port, 端口映射,宿主机端口:容器内端口;8083是influxdb的web管理工具端口,8086是influxdb的HTTP API端口
    --expose:允许容器接受外部传入的数据
    --name:容器名称,此处为influxDbService
    influxdb:镜像名
进入容器
docker exec -it myInfluxdb /usr/bin/influx

InfluxDB 实战

新建数据库
create database test;
使用数据库
use test;
显示表
show measurements;
新建表
  • InfluxDB没有显式的新建表的语句,只能铜鼓耦insert数九的方式来建立新表
insert hello_influx,hostname=hello value=20191104i
数据保存策略

InfluxDB没有提供直接删除数据记录的方法,但是提供数据保存策略,主要用于指定数据保留时间,超过指定时间,就删除这部分数据

  • 查看当前数据库Retention Policies
show retention policies on "db_name"
  • 创建新的Retention Policies
create retention policy "rp_name" on "db_name" duration 3w replication 1 default 
    • 3w:保存3周,3周之前的数据将被删除(h(小时),d(天),w(星期))

    • replication 1:副本个数

    • default:设置为默认策略

    • 修改Retention Policies

      alter retention policy "rp_name" on "db_name" duration 30d default
      
    • 删除Retention Policies

      drop retention policy "rp_name" on "db_name"
      
连续查询

InfluxDB的连续查询是在数据库中自动定时启动的一组语句,语句中必须包含SELECT关键词和GROUP BY time()关键词。查询结果会放在指定的数据表中。

**目的:**使用连续查询是最优的降低采样率的方式,连续查询和存储策略搭配使用将会大大降低InfluxDB的系统占用量。而且使用连续查询后,数据会存放到指定的数据表中,这样就为以后统计不同精度的数据提供了方便。

  • 新建连续查询

    CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
    [RESAMPLE [EVERY <interval>] [FOR <interval>]]
    BEGIN SELECT <function>(<stuff>)[,<function>(<stuff>)] INTO <different_measurement> 
    FROM <current_measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<stuff>]
    END
    
    • 样例

      CREATE CONTINUOUS QUERY wj_30m ON shhnwangjian BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO redis_clients_30m FROM redis_clients GROUP BY ip,port,time(30m) END
      
    • 不同database样例

      CREATE CONTINUOUS QUERY wj_30m ON shhnwangjian_30 BEGIN SELECT mean(connected_clients), MEDIAN(connected_clients), MAX(connected_clients), MIN(connected_clients) INTO shhnwangjian_30.autogen.redis_clients_30m FROM shhnwangjian.autogen.redis_clients GROUP BY ip,port,time(30m) END
      
  • 显示所有已存在的连续查询

show continuous queries
  • 删除Continuous Queries
DROP CONTINUOUS QUERY <cq_name> ON <database_name>