VictoriaMetrics 中文教程(08)VictoriaMetrics 的存储

快猫运营团队 2024-10-22 16:41:00

VictoriaMetrics

VictoriaMetrics 中文教程系列文章:

VictoriaMetrics 的存储

VictoriaMetrics 将摄取的数据在内存中缓冲长达一秒钟。然后将缓冲的数据写入内存 parts,可以在查询期间搜索。内存中的 parts 会定期保存到磁盘,因此它们可以承受非正常关机,例如内存不足崩溃、硬件电源丢失或 SIGKILL 信号。可以使用 -inmemoryDataFlushInterval 命令行标志配置将内存数据刷新到磁盘的间隔(请注意,刷新间隔太短可能会显著增加磁盘 IO)。

内存中的 parts 被持久化到 <-storageDataPath>/data/Small/YYYY_MM/ 文件夹下,其中 YYYY_MM 是存储数据的月份分区。例如,2022_11 是从 2022 年 11 月开始的带有原始样本的 parts 的分区。每个分区目录都包含 parts.json 文件,改文件中存储了所有的 parts 目录。

每个 part 目录都包含具有以下字段的 metadata.json 文件:

  • RowsCount - 该 part 中存储的原始样本数量
  • BlocksCount - 存储在该 part 中的块数(请参阅下面有关块的详细信息)
  • MinTimestamp 和 MaxTimestamp - 存储在该 part 中的原始样本的最小和最大时间戳
  • MinDedupInterval - 应用于给定 part 的重复数据删除间隔

每个 part 由按 time series ID(又称 TSID)排序的块组成。每个块包含最多 8K 个原始样本,这些样本属于单个时间序列。每个块中的原始样本按时间戳排序。同一时间序列的块按第一个样本的时间戳排序。所有块的 imestamps 和值都以压缩形式存储在 part 目录下的单独文件中 - timestamps.bin 和 values.bin。

part 目录还包含 index.bin 和 metaindex.bin 文件 - 这些文件包含用于快速块查找的索引,属于给定的 TSID 并覆盖给定的时间范围。

part 会定期在后台合并为更大的 part。后台合并具有以下优势:

  • 控制数据文件数量,使其不超过打开文件的限制
  • 提高数据压缩率,因为较大的 part 通常比较小的 part 压缩得更好
  • 提高查询速度,因为对较少数量的 part 的查询执行速度更快
  • 合并期间会执行各种后台维护任务,例如重复数据删除、降采样以及为已删除的时间序列释放磁盘空间

新添加的 part 有可能会成功出现在存储中,有可能会失败。新添加的 part 在完全写入并 fsync 到存储后,将原子地注册到相应分区下的 parts.json 文件中。由于这种算法,存储永远不会包含部分创建的 part,即使在将 part 写入磁盘的过程中发生硬件断电 - 这些未完整写入的 part 会在下次 VictoriaMetrics 启动时自动删除。

合并过程也是如此 - part 要么完全合并成一个新 part,要么合并失败,源部分保持不变。然而,由于硬件问题,无论 VictoriaMetrics 流程如何,磁盘上的数据都可能损坏。VictoriaMetrics 可以在数据块解压缩、解码或健全性检查期间检测损坏情况。但它无法修复损坏的数据。启动时无法加载的数据部分需要删除或从备份中恢复。这就是为什么建议定期进行备份。

VictoriaMetrics 不对存储的数据块使用校验和。原因参考这里

如果各部分的摘要大小超出可用磁盘空间,VictoriaMetrics 不会合并这些部分。这可以防止合并过程中出现潜在的磁盘空间不足错误。在可用磁盘空间不足的情况下,part 数量可能会随着时间的推移而显着增加。这会增加数据查询期间的开销,因为 VictoriaMetrics 每次请求都需要从更多 part 读取数据。这就是为什么建议在 -storageDataPath 命令行标志指向的目录下至少有 20% 的可用磁盘空间。

可以从下面两个仪表盘中查看存储的 merge 过程的信息:

索引库

VictoriaMetrics 通过 TSID(时间序列 ID)识别时间序列,并按 TSID 排序存储原始样本(参见存储)。因此,TSID 是主索引,可用于搜索和检索原始样本。但是,TSID 永远不会暴露给客户端,即仅供内部使用。

相反,VictoriaMetrics 维护一个倒排索引,通过将这些值映射到相应的 TSID,可以按指标名称、标签名称和标签值搜索原始样本。

VictoriaMetrics 使用两种类型的倒排索引:

  • 全局索引。使用此索引的搜索将在整个保留期内执行。
  • 按日索引。此索引存储与全局索引类似的映射,但每个映射中还包括日期。这加快了较短时间范围内查询(通常只是最后一天)的数据检索速度。

当执行搜索查询时,VictoriaMetrics 会根据查询的时间范围决定使用哪个索引:

  • 如果搜索时间范围为 40 天或更短,则使用每日索引。
  • 全局索引用于时间范围大于 40 天的搜索查询。

在数据摄取期间将映射添加到索引:

  • 在全局索引中,每个映射每个保留期仅创建一次。
  • 按天的索引,则是每天创建一次。只要对应的某个日期里出现了相关的时序数据,这些时序数据的索引就会被添加到这个日期的索引中。

IndexDB 尊重保留期,一旦保留期结束,索引就会被删除。对于新的保留期,随着新样本的到来,索引会逐渐再次填充。

VictoriaMetrics 的数据保留

保留期使用 -retentionPeriod 命令行标志配置,该标志采用数字后跟时间单位字符 - h(小时)、d(天)、w(周)、y(年)。如果未指定时间单位,则假定为一个月(31 天)。例如,-retentionPeriod=3 表示数据将存储 3 个月(93 天),然后删除。默认保留期为一个月。最短保留期为 24 小时或 1 天。

数据按月划分在 <-storageDataPath>/data/{small,big} 文件夹内。配置保留期之外的数据分区将在新月的第一天删除。每个分区由一个或多个数据 part 组成。配置的保留期之外的数据 part 最终会在后台合并期间被删除。数据 part 所涵盖的时间范围不受保留期单位限制。一个数据 part 可以涵盖数小时或数天的数据。因此,只有完全超出配置的保留期时,才能删除数据 part

给定 -retentionPeriod 的最大磁盘空间使用量为 (-retentionPeriod + 1) 个月。例如,如果 -retentionPeriod 设置为 1,则 1 月份的数据将在 3 月 1 日删除。延长现有数据的 -retentionPeriod 是安全的。如果将 -retentionPeriod 设置为比以前更低的值,则配置期限之外的数据最终将被删除。

VictoriaMetrics 不支持无限期保留,但您可以指定任意长的保留期限,例如 -retentionPeriod=100y

如果我想让不同的数据不同的保留期,该怎么办?有两个办法:

  • 使用商业版,商业版支持在一个实例上配置不同的时序数据不同的保留期。
  • 开源版的话,使用多个 VictoriaMetrics 实例,每个实例配置不同的保留期。然后在前面使用 vmauth 做代理。

总结

本文介绍了 VictoriaMetrics 的存储机制,包括内存中的 parts、磁盘上的 parts、块、索引库、数据保留等。这些都是 VictoriaMetrics 的核心功能,对于用户来说,了解这些机制有助于更好地使用 VictoriaMetrics。

联系我们交流

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat
Flashduty
Flashduty