InfluxDB 是一个由 InfluxData 开发的开源时序型数据库,具有跨 OSS,云和企业产品的通用 API 的可编程性和高性能,可为您提供高粒度,高规模和高可用性。
InfluxDB 由 Go 写成,着力于高性能地查询与存储时序型数据,被广泛应用于存储系统的监控数据,IoT 行业的实时数据等场景。
1. 安装
1.1. 通过 go 自行 make 安装
如果自己构建,需要 Go 1.11 和 Go 模块支持,influxd 是 InfluxDB 服务。 influx 是 CLI 管理工具。
|
|
启动服务。默认情况下记录到 stdout:
|
|
1.2. 通过 docker 安装
类似 mysql、mongo,本地开发环境,将 influxdb 数据存储在/var/lib/influxdb 中
|
|
由 InfluxDB 使用的相关端口:
- 8086 HTTP API 端口
- 8083 管理员界面端口,如果可用 (管理员界面自 1.1.0 起不推荐使用,将在 1.3.0 中删除,同时要使用管理员界面,必须将HTTP API和管理员界面 API转发到同一端口。)
- 2003 Graphite 支持,如果可用
与 InfluxDB 环境相关变量配置,通过环境变量指定配置(INFLUXDB_$SECTION_$NAME
):
- INFLUXDB_REPORTING_DISABLED=true
- INFLUXDB_META_DIR=/path/to/metadir
- INFLUXDB_DATA_QUERY_LOG_ENABLED=false
- INFLUXDB_ADMIN_ENABLED=true
- INFLUXDB_GRAPHITE_ENABLED=true
|
|
2. influxdb 初始化和简单操作
2.1. InfluxDB 权限初始化
InfluxDB 映像包含一些用于初始化数据库的额外功能。这些选项不建议用于生产,但在运行独立实例进行测试时非常有用。
- INFLUXDB_DB : 自动初始化指定名称的数据库
- INFLUXDB_HTTP_AUTH_ENABLED : 身份验证相关,必须设置
- INFLUXDB_ADMIN_USER : 要创建的 admin 用户的名称。如果未设置,则不会创建管理员用户。
- INFLUXDB_ADMIN_PASSWORD : 如果未设置,则生成随机密码并打印到标准输出。
- INFLUXDB_USER : 要创建的没有权限的用户的名称,如果 INFLUXDB_DB 设置,则将授予此用户对该数据库的读写权限。
- INFLUXDB_USER_PASSWORD: 没有设置,则随机生成
- INFLUXDB_READ_USER : 只读用户
- INFLUXDB_READ_USER_PASSWORD : 没有设置,则随机生成
- INFLUXDB_WRITE_USER : 写用户
- INFLUXDB_WRITE_USER_PASSWORD : 没有设置,则随机生成
创建 InfluxDB - db0,同时开启管理员面板:INFLUXDB_ADMIN_ENABLED
,设置管理员账号和密码,以及数据库访问的用户,指定数据库文件共享目录,以及通过一个.sh 脚本手动初始化数据库:
|
|
2.2. 操作 InfluxDB 数据库
2.2.1. 基于 HTTP API REST 操作
创建名为 mydb 的数据库:
|
|
插入数据库:
|
|
2.2.2. 基于 influx CLI 管理工具
|
|
influx 客户端命令说明:
|
|
3. InfluxDB 的关键概念
在深入了解 InfluxDB 之前,熟悉数据库的一些关键概念是很好的,文档简要介绍了这些概念和通用的 InfluxDB 术语
3.1. measurement - 样本度量
- database: 样本数据库
- point: 指代样本集中的点
- measurement: 指代样本度量
- series: 样本系列
- tag-set、tag-key、tag-val:样本集,样本标签 key,样本标签 val
- field-set、field-key、field-val:选项领域集、领域 key,定于 val
- timestamp: 时间
- retention: 保留政策
思考一个样本统计的问题:在 2015 年某个时间段,科学家 A、B,针对区域 1、2 两个位置,进行蝴蝶和蜜蜂的数量统计汇总
time(timestamp) | butterflies(field-key) | honeybees(field-key) | location(tag-key) | scientist(tag-key) |
---|---|---|---|---|
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 |
以上数据中:
- point: 基于单条时间记录,作为样本集的一个点
- time: 样本记录时间,所有的 InfluxDB 都有该字段
- fields: butterflies、honeybees
- field 值可以为:strings, floats, integers, or Booleans,
- field 总是与字段值相关关联,field 字段键和字段值对的集合构成字段集(field set)
- Field 是 InfluxDB 数据结构的必需部分,如果没有字段,则不能在 InfluxDB 中拥有数据。
- Field 字段是未编入索引的,使用字段值作为过滤器的查询必须扫描与查询中的其他条件匹配的所有值,因此,这些查询相对于标记上的查询不具有高性能,通常,字段不应包含常用查询元数据。
- tags: location、scientist
- 样本数据中的最后两列(称为位置和科学家)是标记。
- 标签由标签键和标签值组成,标记键和标记值都存储为字符串和记录元数据。
- field set:
- butterflies = 12 honeybees = 23
- butterflies = 1 honeybees = 30
- butterflies = 11 honeybees = 28
- butterflies = 3 honeybees = 28
- butterflies = 2 honeybees = 11
- butterflies = 1 honeybees = 10
- butterflies = 8 honeybees = 23
- butterflies = 7 honeybees = 22
- tag set:
- location = 1, scientist = langstroth
- location = 2, scientist = langstroth
- location = 1, scientist = perpetua
- location = 2, scientist = perpetua
- measurement:比如我们定为
census
(统计调查),测量名称是字符串,对于任何 SQL 用户,测量在概念上类似于表- 用作标记 tags,字段 fields 和时间 time 的容器,度量名称是存储在关联字段中的数据的描述。
标签是可选的,虽然不需要在数据结构中包含标记,但通常最好使用它们,因为与字段不同,标记是索引的,这意味着标签上的查询更快,并且该标签非常适合存储常用查询元数据。考虑查询:
- SELECT * FROM “census” WHERE “butterflies” = 1
- SELECT * FROM “census” WHERE “honeybees” = 23
由于 butterflies、honeybees 之前都是 field,则查询需要扫表,若重新调整 tag 与 field,将 butterflies、honeybees 设置为 tag,location、scientist 设置为 field,则 influx 查询会更快(无需扫表)
3.2. retention policy- 数据保留策略
一份测量数据,measurement 我们可以以不同的保留策略,保留策略描述了如何保存(数据持久化)以及多少备份存在在集群中(数据复制)
3.3. series - 样本测量、数据保存策略、tag set 的集合
在 InfluxDB 中,系列是保留策略(retention policy),度量(measurement)和标记集(tag set)的数据集合。在设计模式和在 InfluxDB 中处理数据时,理解系列的概念至关重要。
Arbitrary series number | Retention policy | Measurement | Tag set |
---|---|---|---|
series 1 | autogen | census | location = 1,scientist = langstroth |
series 2 | autogen | census | location = 2,scientist = langstroth |
series 3 | autogen | census | location = 1,scientist = perpetua |
series 4 | autogen | census | location = 2,scientist = perpetua |
3.4. 数据库存储格式说明
格式参考:
|
|
InfluxDB 是一个无模式数据库,您可以随时添加新的测量,标签和字段。请注意,如果尝试使用与以前使用的类型不同的类型编写数据(例如,将字符串写入先前接受整数的字段),InfluxDB 将拒绝这些数据。
相关内容查看,注意需要先进入到指定 DB(use test_db):
|
|
3.5. InfluxDB 和 SQL 数据库的一些区别
相关区别点 | InfluxDB | SQL 数据库 |
---|---|---|
数据库特点 | InfluxDB 旨在处理时间序列数据,InfluxDB 可以存储大量的时间序列数据,并快速对这些数据进行实时分析 | SQL 数据库通常不单为此而实现 |
数据库 DDL | InfluxDB 不必预先定义模式(DDL) | SQL 数据库需要提前做 DDL 定义数据存储结构信息 |
基本 SQL | 支持类似 SQL 的操作简单语法,诸如 SHOW、CREATE DATABASE、SELECT、DELETE、GRANT、GROUP BY、LIIMIT 等 | SQL 语法支持 |
JOIN 支持 | 不支持 JOIN | SQL 语法支持 |
性能提升 | continuous queries 和retention policies | 存储过程 |
用户权限管控 | 支持数据库、用户创建、授权 | SQL 语法支持 |
聚合、数学函数支持 | 支持:https://docs.influxdata.com/influxdb/v1.7/query_language/functions/ | SQL 语法支持 |
CRUD 说明 | 更像 CR-ud,弱化更新和删除 | 强 CRUD |
3.6. InfluxDB 设计见解和权衡
- 针对重复数据,简化的冲突解决方案可提高写入性能。
- 限制 point 删除,提高查询和写入性能。
- 限制 point 更新,提高查询和写入性能。
- 按时间升序添加数据的性能要高得多
- 能够处理大容量的读取和写入。
- 如果数据库负载很重,查询返回可能不包括最近的点
- 擅长管理不连续数据,没有表 JOIN 连接。
- point 没有传统意义上的 ID,们按时间戳和系列区分。
3.7. InfluxDB 存储引擎
InfluxDB 存储引擎这块涉及较多的数据结构和概念,诸如 LSM Tree、B+Tree、TSM Tree(Time Structured Merge Tree)、Write Ahead Log (WAL)(日志预写)等概念,这块需要深入了解参见1
4. influx 客户端命令操作示例
4.1. 客户端连接
|
|
4.2. 帮助文档
|
|
4.3. 数据库创建和删除
|
|
4.4. 数据库插入
|
|
4.5. 数据库查询、分组和排序,以及正则查询
InfluxQL 是一种类似 SQL 的查询语言,用于与 InfluxDB 中的数据进行交互。
InfluxQL 的 SELECT 查询语法:
|
|
4.6. 数据库子查询
|
|
4.7. 数据库函数操作
|
|
5. 通过 http 操作 InfluxDB 数据库示例
5.1. 支持基于 HTTP 的数据传输协议
现代 Web API 已经确定了 REST,因为它解决了常见的需求。随着端点数量的增加,对组织系统的需求变得迫切。REST 是用于组织大量端点的行业认可的样式。这种一致性对于开发和使用 API 的人来说是好的:所涉及的每个人都知道会发生什么。
然而,REST 是一种惯例。InfluxDB 使用三个 API 端点。这个简单易懂的系统使用 HTTP 作为 InfluxQL 的传输方法。InfluxDB API 不会尝试 RESTful。
5.2. HTTP 响应部分说明
- 2xx:如果收到您的写请求
HTTP 204 No Content
,则表示成功! - 4xx:InfluxDB 无法理解请求。(比如往一个 bool 中插入了浮点,则会响应 400;往不存在的数据库中插入数据,则会引起 404 错误!)
- 5xx:系统过载或严重受损。
涉及相关参数:
- GET:SELECT、SHOW 操作
- POST:ALTER、CREATE、DELETE、DROP、GRANT、KILL、REVOKE 等操作
5.3. 数据库创建
|
|
5.4. 数据库插入
|
|
5.5. 从文件导入数据到数据库
|
|
5.6. 数据库查询
|
|
6. 认证和授权
不应依赖身份验证和授权来阻止访问并保护数据免受恶意攻击者的攻击。如果需要其他安全性或合规性功能,InfluxDB 应该在第三方服务后面运行。
6.1. 认证
InfluxDB 的 HTTP API 和命令行界面(CLI)使用 API 连接到数据库,包括基于用户凭据的简单内置身份验证。
6.1.1. 设置身份验证
- 创建至少一个管理员用户
- 开启配置认证,默认情况下,配置文件中禁用身份验证:
auth-enabled = true
- 重启服务
- 验证请求
6.1.2. http 验证(两种选择)
|
|
HTTP 认证错误:
- 401:无账号或密码错误,没有身份验证凭据或凭据不正确的请求会产生HTTP 401 Unauthorized响应。
- 403:未经授权,未经授权用户的请求会产生HTTP 403 Forbidden响应。
6.1.3. cli 验证(三种选择)
|
|
6.2. 授权2
只有在启用身份验证(auth-enabled = true
)后才会强制执行授权,默认情况下,禁用身份验证,静默忽略所有凭据,并且所有用户都具有所有权限。
6.2.1. 用户类型和权限
管理员用户,拥有所有库的读写权限:
- CREATE DATABASE, DROP DATABASE
- DROP SERIES,DROP MEASUREMENT
- CREATE RETENTION POLICY, ALTER RETENTION POLICY, DROP RETENTION POLICY
- CREATE CONTINUOUS QUERY, DROP CONTINUOUS QUERY
- 用户管理权限
- 管理员管理:CREATE USER, GRANT ALL PRIVILEGES, REVOKE ALL PRIVILEGES, and SHOW USERS
- 非管理员管理:CREATE USER, GRANT [READ,WRITE,ALL], REVOKE [READ,WRITE,ALL], and SHOW GRANTS
- 普通用户管理:SET PASSWORD and DROP USER
非管理员用户,针对每个库有 3 类权限,可以通过 SHOW 命令查看:
- 读权限
- 写权限
- 读写权限
6.2.2. 用户管理命令
创建用户以及认证的一些限制:
- 用户名,如果已数字或者包含特殊字符,需要以双引号包裹!
- 密码,必须以单引号包裹!
- 认证的时候,不需要单引号;
- 重复的用户名创建,是幂等的,不然直接报错;
|
|
7. 配置文件
7.1. 存储位置
- Linux: /etc/influxdb/influxdb.conf
- macOS: /usr/local/etc/influxdb.conf
|
|
7.2. 基本单位
- ns nanoseconds
- us or µs microseconds
- ms milliseconds
- s seconds
- m minutes
- h hours
- d days
- w weeks
7.3. 配置环境变量
INFLUXDB_*
开始的变量,比如INFLUXDB_CONFIG_PATH
GOMAXPROCS
,go 语言中的处理器设定,与处理器核心绑定一致
7.4. 配置应用服务变量
比如数据存储位置、分片策略、监控策略、HTTP 端点、查询管理等,更多参见参考部分3
8. 小结
文章内容简单介绍了 InfluxDB 的特点以及其关键的概念,以科学家统计昆虫的样本测量,解释了什么是测量读、标签集、字段集,以及保存策略和 series 系列;
随后,类似于 Mysql 的操作,进行数据的基本用户的授权和认证管控,以及从 HTTP 和 CLI 两个方面,对 InfluxDB 进行简单的 SQL 查询和管理操作;
最后,针对 InfluxDB 的配置简要过了下,希望整体对 InfluxDB 有个初步的了解!
9. 参考
- influxdb,身份认证和授权管理:https://docs.influxdata.com/influxdb/v1.7/administration/authentication_and_authorization/
- influxdb,API 文档:https://docs.influxdata.com/influxdb/v1.7/tools/api/
- influxdb,查询语言:https://docs.influxdata.com/influxdb/latest/query_language/spec/
- influxdb,
- influxdb,术语:https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/#series
InfluxDB 存储引擎:https://docs.influxdata.com/influxdb/v1.7/concepts/storage_engine/ ↩︎
数据库管理: https://docs.influxdata.com/influxdb/v1.7/query_language/database_management/ ↩︎
配置 inflduxdb: https://docs.influxdata.com/influxdb/v1.7/administration/config/ ↩︎