InfluxDB 存储引擎
InfluxDB 存储引擎确保
- 数据安全地写入磁盘
- 查询的数据完整且正确地返回
- 数据准确(第一)且性能良好(第二)
本文档概述了存储引擎的内部工作原理。提供这些信息既是为了参考,也是为了帮助那些希望最大化性能的人。
存储引擎包括以下组件
将数据从 API 写入磁盘
存储引擎处理数据,从接收到 API 写入请求开始,到将数据写入物理磁盘为止。数据使用 行协议 写入 InfluxDB,该协议通过 HTTP POST 请求发送到 /api/v2/write
端点或 /write
1.x 兼容性端点。批量的数据点被发送到 InfluxDB、压缩并写入 WAL 以实现即时持久性。数据点也写入内存缓存并立即变为可查询。内存缓存会定期以 TSM 文件形式写入磁盘。随着 TSM 文件的累积,存储引擎会将累积的文件合并和压缩为更高级别的 TSM 文件。
虽然数据点可以单独发送,但为了提高效率,大多数应用程序以批量方式发送数据点。POST 正文中的数据点可以来自任意数量的序列、测量和标签集。批次中的数据点不必来自相同的测量或标签集。
预写日志 (WAL)
预写日志 (WAL) 在存储引擎重启时保留 InfluxDB 数据。WAL 确保在发生意外故障时数据持久耐用。
当存储引擎收到写入请求时,会发生以下步骤
- 写入请求被追加到 WAL 文件的末尾。
- 数据使用
fsync()
写入磁盘。 - 内存缓存已更新。
- 当数据成功写入磁盘后,响应确认写入请求成功。
fsync()
获取文件并将待处理的写入全部推送到磁盘。作为系统调用,fsync()
具有内核上下文切换,这在计算上是昂贵的,但保证了数据在磁盘上的安全。
当存储引擎重启时,WAL 文件被读回内存数据库。然后,InfluxDB 回答对 /read
端点的请求。
缓存
缓存是当前存储在 WAL 中的数据点的内存副本。WAL 和缓存是独立的实体,彼此不交互。存储引擎协调对两者的写入。
缓存
- 按键(测量、标签集和唯一字段)组织数据点。每个字段都存储在其自己的按时间排序的范围内。
- 存储未压缩的数据。
- 每次存储引擎重启时,都会从 WAL 获取更新。缓存在运行时被查询,并与存储在 TSM 文件中的数据合并。
- 使用最大
maxSize
字节的内存。
缓存快照是当前正在写入 TSM 文件的缓存对象。它们在刷新时保存在内存中,以便可以与缓存一起查询。对存储引擎的查询将来自缓存的数据与来自 TSM 文件的数据合并。查询在查询处理时从缓存副本生成的数据副本上执行。这样,在查询运行时传入的写入不会影响结果。发送到缓存的删除操作会清除指定键或指定键的时间范围。
时间结构合并树 (TSM)
为了高效地压缩和存储数据,存储引擎按序列键对字段值进行分组,然后按时间顺序排列这些字段值。(序列键由测量、标签键和值以及字段键定义。)
存储引擎使用 时间结构合并树 (TSM) 数据格式。TSM 文件以列式格式存储压缩的序列数据。为了提高效率,存储引擎仅存储序列中值之间的差异(或增量)。面向列的存储使引擎能够按序列键读取并省略无关数据。
在字段安全地存储在 TSM 文件中后,WAL 将被截断,缓存将被清除。压缩过程创建读取优化的 TSM 文件。TSM 压缩代码非常复杂。但是,高级目标非常简单:将一个序列的值组织在一起形成长运行,以最好地优化压缩和扫描查询。
有关 TSM 引擎的更多信息,请观看以下视频
时间序列索引 (TSI)
随着数据基数(序列的数量)的增长,查询读取的序列键越多,速度就越慢。时间序列索引确保查询在数据基数增长时仍能保持快速。TSI 存储按测量、标签和字段分组的序列键。这使数据库能够很好地回答两个问题
- 存在哪些测量、标签、字段?(这发生在元查询中。)
- 给定测量、标签和字段,存在哪些序列键?
此页内容是否对您有帮助?
感谢您的反馈!