菜单
开源 此页面内容适用于开源版本。

Grafana Pyroscope 桶索引

桶索引是一个按租户划分的文件,包含存储中的 block 列表和 block 删除标记。桶索引存储在后端对象存储中,由 compactor 定期更新,并由 store-gateway 用于发现存储中的 block。

优势

store-gateway 必须拥有存储桶的几乎最新视图1,以便在查询时找到要查找的正确 block 并加载 block。

因此,它们需要定期扫描存储桶,以查找 ingester 或 compactor 上传的新 block,以及 compactor 删除(或标记为删除)的 block。

启用桶索引后,store-gateway 会定期查找按租户划分的桶索引,而不是通过 list objects 操作扫描存储桶。

这带来了以下优势

  1. Store-gateway 对对象存储的 API 调用次数减少
  2. Store-gateway 不会执行“list objects”存储 API 调用

索引结构

bucket-index.json.gz 包含

  • blocks
    租户的完整 block 列表,包括标记为删除的 block。部分 block 被排除在索引之外。
  • block_deletion_marks
    block 删除标记列表。
  • updated_at
    一个 Unix 时间戳,精度为秒,显示索引最后一次更新并写入存储的时间。

如何更新

compactor 定期扫描存储桶,并将更新后的桶索引上传到存储。您可以通过 -compactor.cleanup-interval 配置桶索引更新的频率。

桶索引的使用是可选的,但即使 -blocks-storage.bucket-store.bucket-index.enabled=false,该索引也会由 compactor 构建和更新。此行为确保了任何租户的桶索引都存在,并且如果在运行中的 Grafana Pyroscope 集群中启用桶索引,查询结果一致性会得到保证。保持桶索引更新带来的开销并不显著。

Store-gateway 如何使用它

store-gateway 在启动时和定期获取属于其分片的每个租户的桶索引,并将其用作存储中 block 和删除标记的真实来源。这消除了定期扫描存储桶来发现属于其分片的 block 的需要。


  1. Ingester 在将数据卸载到长期存储时会定期向存储桶添加新 block,compactor 随后会压缩这些 block 并标记原始 block 以供删除。实际删除发生在与参数 -compactor.deletion-delay 相关联的延迟值之后。尝试获取已删除的 block 将导致查询失败。因此,在这种情况下,几乎最新的视图是指更新延迟小于 -compactor.deletion-delay 值的视图。 ↩︎