Documentation

InfluxDB 存储引擎

InfluxDB 存储引擎确保

  • 数据安全地写入磁盘
  • 查询的数据完整且正确地返回
  • 数据准确(第一)且性能良好(第二)

本文档概述了存储引擎的内部工作原理。提供这些信息既是为了参考,也是为了帮助那些希望最大化性能的人。

存储引擎包括以下组件

将数据从 API 写入磁盘

存储引擎处理数据,从接收到 API 写入请求开始,到将数据写入物理磁盘为止。数据使用 行协议 写入 InfluxDB,该协议通过 HTTP POST 请求发送到 /api/v2/write 端点或 /write 1.x 兼容性端点。批量的数据点被发送到 InfluxDB、压缩并写入 WAL 以实现即时持久性。数据点也写入内存缓存并立即变为可查询。内存缓存会定期以 TSM 文件形式写入磁盘。随着 TSM 文件的累积,存储引擎会将累积的文件合并和压缩为更高级别的 TSM 文件。

虽然数据点可以单独发送,但为了提高效率,大多数应用程序以批量方式发送数据点。POST 正文中的数据点可以来自任意数量的序列、测量和标签集。批次中的数据点不必来自相同的测量或标签集。

预写日志 (WAL)

预写日志 (WAL) 在存储引擎重启时保留 InfluxDB 数据。WAL 确保在发生意外故障时数据持久耐用。

当存储引擎收到写入请求时,会发生以下步骤

  1. 写入请求被追加到 WAL 文件的末尾。
  2. 数据使用 fsync() 写入磁盘。
  3. 内存缓存已更新。
  4. 当数据成功写入磁盘后,响应确认写入请求成功。

fsync() 获取文件并将待处理的写入全部推送到磁盘。作为系统调用,fsync() 具有内核上下文切换,这在计算上是昂贵的,但保证了数据在磁盘上的安全。

当存储引擎重启时,WAL 文件被读回内存数据库。然后,InfluxDB 回答对 /read 端点的请求。

缓存

缓存是当前存储在 WAL 中的数据点的内存副本。WAL 和缓存是独立的实体,彼此不交互。存储引擎协调对两者的写入。

缓存

  • 按键(测量、标签集和唯一字段)组织数据点。每个字段都存储在其自己的按时间排序的范围内。
  • 存储未压缩的数据。
  • 每次存储引擎重启时,都会从 WAL 获取更新。缓存在运行时被查询,并与存储在 TSM 文件中的数据合并。
  • 使用最大 maxSize 字节的内存。

缓存快照是当前正在写入 TSM 文件的缓存对象。它们在刷新时保存在内存中,以便可以与缓存一起查询。对存储引擎的查询将来自缓存的数据与来自 TSM 文件的数据合并。查询在查询处理时从缓存副本生成的数据副本上执行。这样,在查询运行时传入的写入不会影响结果。发送到缓存的删除操作会清除指定键或指定键的时间范围。

时间结构合并树 (TSM)

为了高效地压缩和存储数据,存储引擎按序列键对字段值进行分组,然后按时间顺序排列这些字段值。(序列键由测量、标签键和值以及字段键定义。)

存储引擎使用 时间结构合并树 (TSM) 数据格式。TSM 文件以列式格式存储压缩的序列数据。为了提高效率,存储引擎仅存储序列中值之间的差异(或增量)。面向列的存储使引擎能够按序列键读取并省略无关数据。

在字段安全地存储在 TSM 文件中后,WAL 将被截断,缓存将被清除。压缩过程创建读取优化的 TSM 文件。TSM 压缩代码非常复杂。但是,高级目标非常简单:将一个序列的值组织在一起形成长运行,以最好地优化压缩和扫描查询。

有关 TSM 引擎的更多信息,请观看以下视频

时间序列索引 (TSI)

随着数据基数(序列的数量)的增长,查询读取的序列键越多,速度就越慢。时间序列索引确保查询在数据基数增长时仍能保持快速。TSI 存储按测量、标签和字段分组的序列键。这使数据库能够很好地回答两个问题

  • 存在哪些测量、标签、字段?(这发生在元查询中。)
  • 给定测量、标签和字段,存在哪些序列键?

此页内容是否对您有帮助?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续像当前一样使用它,而无需对代码进行任何更改。

阅读更多

现已全面上市

InfluxDB 3 Core 和 Enterprise

快速启动。更快扩展。

获取更新

InfluxDB 3 Core 是一个开源、高速、最近数据引擎,可实时收集和处理数据,并将其持久化到本地磁盘或对象存储。InfluxDB 3 Enterprise 构建在 Core 的基础上,增加了高可用性、读取副本、增强的安全性以及数据压缩,从而实现更快的查询和优化的存储。InfluxDB 3 Enterprise 的免费层可供非商业家庭或业余爱好者使用。

有关更多信息,请查看