Grafana Pyroscope 桶索引
桶索引是一个按租户划分的文件,包含存储中的 block 列表和 block 删除标记。桶索引存储在后端对象存储中,由 compactor 定期更新,并由 store-gateway 用于发现存储中的 block。
优势
store-gateway 必须拥有存储桶的几乎最新视图1,以便在查询时找到要查找的正确 block 并加载 block。
因此,它们需要定期扫描存储桶,以查找 ingester 或 compactor 上传的新 block,以及 compactor 删除(或标记为删除)的 block。
启用桶索引后,store-gateway 会定期查找按租户划分的桶索引,而不是通过 list objects
操作扫描存储桶。
这带来了以下优势
- Store-gateway 对对象存储的 API 调用次数减少
- 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 的需要。
Ingester 在将数据卸载到长期存储时会定期向存储桶添加新 block,compactor 随后会压缩这些 block 并标记原始 block 以供删除。实际删除发生在与参数
-compactor.deletion-delay
相关联的延迟值之后。尝试获取已删除的 block 将导致查询失败。因此,在这种情况下,几乎最新的视图是指更新延迟小于-compactor.deletion-delay
值的视图。 ↩︎