InfluxDB时序数据库
前言本文章基于InfluxDB2.x版本进行讲述。在写本文章时InfluxBD3.x版本已经发布。且InfluxBD3.x版本对于2.x版本来说是一次变革性升级。在文章末尾比较2.x版本和3.x的主要区别。在进入正式内容之前先记录一下在InfluxBD学习过程中一些零散的又有用的知识点。OSS版本:Open Source Software免费开源版本。无论什么软件在官网看到OSS后缀的就是开源版的。Enterpise企业版需付费Beta版本:公测版本测试版本。release版本:发布版本可上线版本。CLI工具:即命令行工具。通过输入对应软件的命令与软件进行交互的工具。例如mysql中有专门的mysql client cli工具influxdb也有cli工具。他们都需要单独安装安装好后就可以输入特定的命令与软件的服务端进行交互了。InfluxDB总概InfluxDB2.x开发文档在InfluxBD2.x版本的OSS版本中不支持集群版本只支持单机版本。国内程序员开发了免费的集群版本influxdbclusterInfluxDB数据库特点冷热数据分离: 时间近的数据存在内容或者固态硬盘上。时间远的数据进行压缩存储或者直接删除。时间不可倒流数据只存不改: 不允许修改历史数据。大部分时序数据库不支持事务也不支持删除。为了提升性能。时序数据库的使用模式大批量插入时序数据–应用程序定时查询时序数据–报警–可视化展示。几乎所有的时序数据库都是上面这种使用模式。针对这四个步骤专门有四个组件来完成以上四个步骤:Telegraf: 数据采集组件收集发送数据到influxdb。Influxdb: 存储数据发送数据到ChronografChronograf 总的用户界面起到管理功能Kapacitor: 后台处理报警信息。Influxdb2.0版本把Chronograf和Kapacitor组件的功能都集成了只要安装一个influxdb就可以了。Telegraf简介这里重点介绍一下Telegraf的相关知识Telegraf是一个插件驱动的数据收集代理它可以从各种来源如操作系统、数据库、网络设备等采集指标数据并将其发送到InfluxDB进行存储和分析。Telegraf具有丰富的插件生态系统可以轻松地扩展和定制数据采集过程。用户可以根据自己的需求选择和配置适当的插件以收集特定的指标数据。Telegraf 是由 InfluxData 开发的一个开源的、插件驱动的服务器代理用于收集、处理和写入时间序列数据。它最初是为与 InfluxDB 配合使用而设计的但现在已经扩展支持多种输出目标包括其他时间序列数据库如 Prometheus、Graphite、OpenTSDB 等、消息队列和服务如 Kafka、StatsD等。Telegraf 的一大优势在于其庞大的插件库涵盖了几乎所有的常见数据源和技术栈。用户可以根据自己的需求轻松添加或移除插件无需修改核心代码。我们要采集什么环境的数据(如docker环境服务器环境等)就安装对应环境的插件然后启动telegraf插件就可以自动采集该环境的数据了。工作机理由上图可知InfluxDB服务主要通过提供HTTP API供外部客户调用来完成各种对于时序数据库增、删、改、查等等操作。调用HTTP API的方式可以有多种包括influx cli命令行工具、Web UI界面、以及各种编程语言开发的应用程序交互等方式。本文主要通过Web UI的操作来讲解InfluxDB的相关知识。InfluxDB数据模型基础概念桶(Bucket)类似于mysql数据库中的库的概念。测量名称(measurement):可以理解成mysql数据库中表的概念。但是influxdb中其实并没有表。插入数据时指定桶就可以插入数据。测量名称可以理解成表名。标签集(Tag Set):类似于数据的索引。定义标签集时必须以逗号(,)与测量名称链接如果是空格就是定义成了字段集。可以省略不定义标签集。Field Set(字段集):不能省略至少一个字段。Timestamp(时间戳)可省略。默认是当前插入时间。支持秒毫秒纳秒等级别。之所以测量名称与标签集直接用逗号连接与字段集之间用空格分开是因为测量名称和标签集组成了共同索引。时间戳与字段集分开是因为时间戳也是一个索引。这就是双索引来检索这段字段集。表与表流influxdb中是没有表的概念的。但是influxdb具有兼容关系型数据库的野心。所以使用flux语言查询数据时显示的是关系型数据库的结果如下图所示:influxdb内部在使用influx查询数据时默认按照measurement、tag、field进行分组然后转成了关系型数据结构。分组之后会形成多个子表。也就是第一列的table字段0代表分组的一个结果即一个子表。1代表分组的另一个结果即另一个子表。0和1两张子表就是所谓的表流。开窗influxdb中存储着按时间序列排好的数据。可以按照微妙、纳秒级别进行存储。但是在我们查询展示的时候并不需要把这么精确时间的数据都查询出来。我们可能只查询每30s内数据的平均值最大值或者最小值等。这个30s就是开窗的意思。数据存储格式influxdb数据库底层以测量名称标签集进行分组形成不同的序列。在同一序列中按时间戳进行升序排列数据。在检索数据时先根据测量名称和标签找到对应的序列然后根据时间戳索引检索数据。这就是所谓的双重索引。如下两张图所示时间线膨胀问题(高基数问题)时间线膨胀是所有时序数据库都绕不开的问题。简单来说就是时序数据库中序列太多了。当序列过多时时序数据库的读取和写入性能下降明显所以对时序数据库进行压测时序列的多少是压测的一个因素。我们在选择标签字段时一般选择字典类型即数量值有限的字段作为标签字段。FLUX语言flux语言是influxData开发的一套脚本语言。flux语言是influxdb的专用查询语言在infuxdb2版本以后支持。在此之前用的是InfluxQL语言。但是flux语言较为复杂学习成本较高。在influxdb 3.x的版本中已经不再支持flux语言了。这里只做简单介绍。
