什么是 InfluxDB
介绍 InfluxDB 之前,先介绍一下时序数据。时序数据是按照时间顺序记录系统或设备状态变化的数据,比如 CPU 使用率、磁盘读写速率等。时序数据以时间作为主要的查询维度,通常会将连续的多个时序数据绘制成线,制作成基于时间的多维度报表,用于揭示数据背后的趋势、规律、异常,进行实时在线预测和报警。时序数据主要有以下特点:
时间是一个主坐标轴
数据通过按照时间顺序抵达
数据几乎总是作为新条目被记录,无更新操作
时序数据库是存放时序数据的专用型数据库,并且支持时序数据的快速写入、持久化、多维度的实时聚合运算等功能。InfluxDB 是一个有 InfluxData 公司开发的开源时序型数据库,专注于海量时序数据的高性能读、高性能写、高效存储和实时分析,在 DB_Engines Ranking 时序型数据库上位列榜首,广泛应用于 Devops 监控、IoT 监控、实时分析等场景。InfluxDB 具有以下特性:
部署简单、使用方便,充分利用了 GO 语言特性
类似于 SQL 的查询语言,学习成本低,上手快
丰富的聚合运算和采样能力
灵活的数据保留策略设置数据保留时间和副本数
灵活的连续查询实现对海量数据的采样
支持多种通信协议,如:HTTP、UDP、OpenTSDB、Prometheus、CollectD、Graphite 等
基本概念
InfluxDB 的名词解释:
database:数据库
measurement:表
tag:标签,类似于 MySQL 的索引列
field:字段,类似于 MySQL 的非索引列
point:数据行,由 time、tag、field 组成
series:时间线,由 retention policy、measurement、tag sets 组成
retention policy:保留策略,指定数据的保留时间
InfluxDB 与常见关系型数据库的对比:
| 概念 | MySQL | InfluxDB |
|---|---|---|
| 数据库 | database | database |
| 表 | table | measurement |
| 列 | column | time、tag、field |
注意,在 InfluxDB 中,一条数据至少包括 measurement、0 个或多个 K-V 结构的 tag、至少一个 K-V 结构的 field、timestamp。measurement 无需提前定义,会在数据写入时自动创建表结构。
数据类型
InfluxDB 支持以下数据类型,具体的数据类型和字段关系如下表:
| 类型 | 使用该类型的对象 | 描述 |
|---|---|---|
| 浮点型 | 字段值 | 数值型指标默认为浮点型 |
| 整型 | 字段值 | 使用时,需要在数值型指标后面加小写字母 i,否则会当做浮点型 |
| 字符串 | 表名、标签键/值、字段键/值 | 双引号字符串字段 |
| 布尔型 | 字段值 | 以下值为 true:t、true、false、TRUE、True。以下值为 false:f、F、false、False、FALSE |
| 纳秒级精度 UNIX 时间 | 时间戳 | UNIX 纳秒级时间戳 |
行协议
InfluxDB 支持行协议,行协议是一种基于文本格式的协议。行协议的单行文本表示一条时序数据,由表、标签集、字段集和时间戳组成。行协议基本语法如下:
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]行协议的格式比较严格的,要求 measurement 和 0 个或多个 tag 之间必须是紧挨着的,中间不能有空格;同时多个 filed 之间也是不能有空格,tag 和 field 的 key,tag 的 value 都是字符串类型;时间戳不是必须的,如果为空则使用服务端的本地时间作为时间戳。相同时间戳的数据第二次写入会覆盖第一次写入的数据,相当于更新操作。
行协议中的一些字段对某些特殊符号较敏感,当需要使用这些敏感符号时,需要进行转义处理,特殊符号如下:
| 字段 | 特殊符号 |
|---|---|
| 表 | 逗号 空格 |
| 标签键/值、字段键 | 逗号 等号 空格 |
| 字符串类型的指标值 | 双引号 反斜杠 |
除了行协议,InfluxDB 还支持 CollectD、Graphite、OpenTSDB、Promethus、UDP 等第三方协议。




