您当前的位置:首页 > 互联网教程

influxDB基本操作

发布时间:2025-05-24 16:45:33    发布人:远客网络

influxDB基本操作

一、influxDB基本操作

1、创建数据库操作:在InfluxDB中创建数据库的命令格式为"create database"db_name""。

2、显示数据库:要查看所有数据库,可以使用"show databases"命令。

3、删除数据库:要删除数据库,使用"drop database"db_name""命令。

4、使用数据库:通过"use db_name"切换至所需数据库。

5、显示表:使用"show measurements"命令查看指定数据库中的所有表。

6、创建表:在插入数据时直接指定表名。

7、插入数据示例:"insert test,host=localhost,monitor_name=test count=1"。

8、查询数据:"select* from test order by time desc"。

9、删除表:"drop measurement"measurement_name""。

10、查询与SQL相似:InfluxDB的查询语法与SQL有相似之处,便于理解与应用。

11、连续查询:InfluxDB支持自动启动的一组查询语句,实现数据统计采样,优化资源利用。

12、创建连续查询:"cq_name:连续查询名字"、"db_name:数据库名字"、"sum(count):计算总和"、"table_name:当前表名"、"new_table_name:存新的数据表名"、"30m:时间间隔为30分钟"。

13、删除连续查询:"drop Continuous query cp_name on db_name"。

14、创建用户:"create user“username” with password‘password’"。

15、创建管理员:"create user“username” with password‘password’ with all privileges"。

16、删除用户:"drop user“username”"。

17、series操作:"show series from dbname"。

18、写入数据:"插入多条数据,直接写即可"。

19、响应:InfluxDB的响应代码包括2xx、4xx、5xx三类,分别表示请求接收、解析错误和系统错误。

20、从文件读取数据:使用命令行读取数据文件,指定数据库、表名、tag字段和field字段,自动生成时间戳。

21、通过HTTP接口读取:"参数db指定了需查询的数据库,q代表了需执行的查询语句"。

22、多条查询:"多条查询只需要用”;”将查询语句分割即可"。

23、时间格式与结果大小:"使用epoch参数指定数据的时间格式,可选值有 epoch=[h,m,s,ms,u,ns],使用 chunk_size参数来指定每次结果的大小"。

24、数据保留策略:"当前正在执行的语句"、"kill query命令来终止执行"。

25、备份与恢复:"influxd backup"备份数据库,"influxd restore"恢复数据库,远程备份与数据恢复支持参数配置"。

26、Line Protocol:InfluxDB使用固定的Line Protocol格式存储数据点,实现高效的数据输入与查询。

二、Spring Boot中使用时序数据库InfluxDB

除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用 MongoDB、 LDAP这些存储的案例。接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在Spring Boot中的使用。

什么是时序数据库?全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时间序列数据主要由电力行业、化工行业等各类型实时监测、检查与分析设备所采集、产生的数据,这些工业数据的典型特点是:产生频率快(每一个监测点一秒钟内可产生多条数据)、严重依赖于采集时间(每一条数据均要求对应唯一的时间)、测点多信息量大(常规的实时监测系统均有成千上万的监测点,监测点每秒钟都产生数据,每天产生几十GB的数据量)。虽然关系型数据库也可以存储基于时间序列的数据,但由于存储结构上的劣势,使得这些数据无法高效地实现高频存储和查询统计,因此就诞生了一种专门针对时间序列来做存储和优化的数据库,以满足更高的效率要求。(参考:百度百科:时序数据库)

InfluxDB就是目前比较流行的开源时序数据库(官网地址:),我们比较常见的使用场景就是一些与时间相关的高频的数据记录和统计需要,比如:监控数据的存储和查询。

在进行下面的动手环节之前,先了解一下InfluxDB中的几个重要名词:

其中,一个Point由三个部分组成:

在了解了什么是时序数据库以及InfluxDB一些基础概念之后,下面我们通过一个简单的定时上报监控数据的小案例,进一步理解InfluxDB的基础配置、数据组织和写入操作!

第一步:创建一个基础的Spring Boot项目(如果您还不会,可以参考这篇文章:快速入门()

第二步:在 pom.xml中引入influx的官方SDK

注意:这里因为Spring Boot 2.x版本的parent中有维护InfluxDB的SDK版本,所以不需要手工指明版本信息。如果使用的Spring Boot版本比较老,那么可能会缺少version信息,就需要手工写了。

第三步:配置要连接的influxdb信息

三个属性分别代表:连接地址、用户名、密码。到这一步,基础配置就完成了。

注意:虽然没有spring data的支持,但spring boot 2.x版本中也实现了InfluxDB的自动化配置,所以只需要写好配置信息,就可以使用了。具体配置属性可以查看源码: org.springframework.boot.autoconfigure.influx.InfluxDbProperties。

第四步:创建定时任务,模拟上报数据,并写入InfluxDB

第一步:启动InfluxDB,并通过命令行准备好要使用的数据库,主要涉及的命令如下;

第二步:启动Spring Boot应用,在定时任务的作用下,我们会看到类似下面的日志:

第三步:通过命令,查看一下InfluxDB中是否已经存在这些数据

可以看到,已经存在与日志中一样的数据了。

本文的完整工程可以查看下面仓库中 2.x目录下的 chapter6-3:

三、InfluxDB 存储引擎

1、深入探究一个存储引擎的磁盘存储结构是理解其整体工作机制的关键。本文将重点解析InfluxDB的主目录结构,特别是"data"目录下的核心文件组织。

2、在InfluxDB的主目录中,数据主要存储在"data"目录下,这个目录包含多个子目录,其中"wal"和"meta"目录不在本文讨论范围之内。"data"目录的第一层子目录对应的是各个数据库。在每个数据库的第一层,我们能找到"_series"目录和代表自动生成的RP(RetentionPolicy)的"RP"目录,而"RP"目录下的第一层目录则是"shard"。所有数据及索引文件都存储在"shard"目录中,这表明在InfluxDB中,"shard"是最基本的数据管理单元。

3、"shard"目录内部的文件结构是本文的重点。在解析这些文件之前,我们先大致了解InfluxDB的指标数据存储格式。

4、InfluxDB的指标数据以TSM(Time Series Management)文件格式存储。一个典型的TSM文件由四部分组成:Header、DataBlocks、IndexBlocks和Footer。Header包含用于标识文件类型的4字节魔数和版本号1字节。Footer则相对简单,存储了8字节的偏移量,指示第一个IndexBlock在文件起始位置。核心部分DataBlocks和IndexBlocks分别用于存储指标数据和时间线索引,进一步理解数据访问机制。

5、DataBlocks以时间戳对齐的方式存储指标数据,每个Block最多包含1000个point的指标值,满了后自动切分到下一个Block。每个Block存储的是单个指标项的值,因此InfluxDB从存储模型角度看是单值模型。Block内部包含两部分内容:crc用于数据校验,CompressedData存储压缩后的指标数据和时间戳,其中type标识数据类型,timestampsLen表示时间戳个数,timestamps和values分别按照升序排序存储时间戳和指标值。

6、IndexBlocks则是为了实现数据访问效率而设计,通过将时间线和对应的指标数据关联起来。IndexBlocks包含关键长度(keyLen)、由seriesKey和fieldKey组成的key,以及field类型(type)和indexEntry数量(count)。indexEntry包含指向对应DataBlock地址和偏移,为了快速裁剪数据,还存储了最大最小时间。程序启动时,所有IndexBlocks被加载到内存中,加速数据块访问。由于IndexBlocks按照key排序,给定key后在内存中进行二分查找,即可快速读取相关指标数据。

7、除了TSM文件,InfluxDB还利用TSI(Time Series Index)文件存储倒排索引。TSI文件包含Header、Tag Block、Measurement Block和Series Data等关键模块,用于构建高效的数据访问和查询机制。Tag Block和Measurement Block提供了对测量数据的高效索引和管理,而Series Data和Tombstone seriesData则分别用于存储活跃和已删除的序列信息。TSI文件的复杂布局表明,基于倒排索引的时序数据库中,索引模块是核心关键。

8、在InfluxDB的数据存储体系中,还有一个特别的目录"series",它包含所有系列ID和系列键的映射信息。"series"目录被分为8个分区,每个分区包含多个segment文件和一个index文件。分区化设计旨在降低锁定粒度,提升并发性能。segment文件按ID排序,最小4MB,最大256MB。当segment达到阈值时,会生成新的segment。整个"series"目录结构支持高效的数据访问和管理。

9、为了加速查找id和key,InfluxDB采用内存索引和文件索引。在segment数量较少时,使用内存索引;当segment数量较多时,采用文件索引以节约内存。内存和文件索引结构分别用于快速定位id和key,确保高效的数据访问。

10、最后,InfluxDB通过查询流程展示了TSM和TSI文件以及series文件如何协同工作,最终实现指标数据的查询。查询过程包括使用倒排索引过滤tag条件、通过series id到_series目录查询series key,以及在TSM文件中获取指标数据。

11、在数据压缩方面,InfluxDB采取了多种策略以实现低成本存储。时间戳、整数、浮点数和字符串类型的数据分别通过delta编码、zigzag编码、Gorilla XOR编码和snappy算法进行压缩。这些压缩算法在减少存储空间的同时,确保了查询性能。

12、本文深入分析了InfluxDB的磁盘文件结构、存储引擎查询机制以及数据压缩策略。通过对存储引擎底层数据组织的细致解析,有助于我们更深入理解InfluxDB的设计哲学和工作原理,对数据库的使用和内核优化提供重要指导。