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

Grafana Mimir 存储桶索引

存储桶索引是每个租户的文件,包含存储中的块列表和块删除标记。存储桶索引存储在后端对象存储中,由 compactor 定期更新,并供 querier、store-gateway 和 ruler(在内部操作模式下)用于发现存储中的块。

优势

querierstore-gatewayruler 必须具有近乎1 最新的存储桶视图,以便在查询时(querier)找到要查找的正确块,并加载块的二进制索引头(store-gateway)。因此,它们需要定期扫描存储桶,以查找由 ingester 或 compactor 上传的新块,以及由 compactor 删除(或标记为删除)的块。

启用存储桶索引后,querier、store-gateway 和 ruler 会定期查找每个租户的存储桶索引,而不是通过 list objects 操作扫描存储桶。

这提供了以下优势

  1. 减少 querier 和 store-gateway 对对象存储的 API 调用次数
  2. querier 和 store-gateway 不执行“list objects”存储 API 调用
  3. querier 在启动后立即运行,因此无需执行初始存储桶扫描

索引结构

bucket-index.json.gz 文件包含


  • 租户的完整块列表,包括标记为删除的块。不包括部分块。
  • 块删除标记
    块删除标记列表。
  • updated_at
    一个 Unix 时间戳,精度以秒为单位,显示索引最后一次更新并写入存储的时间。

如何更新

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

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

Querier 如何使用它

在查询时,querierruler 会确定租户的存储桶索引是否已加载到内存中。如果未加载,querier 和 ruler 会从存储中下载并缓存它。

由于存储桶索引是一个小文件,延迟下载对首次查询性能影响不大,但确实允许 querier 在不预先下载每个租户的存储桶索引的情况下启动并运行。此外,如果元数据缓存已启用,存储桶索引会在共享缓存中短期缓存,这减少了延迟,并降低了在多个 querier 和 ruler 在短时间内获取同一租户的存储桶索引时对对象存储的 API 调用次数。

Querier - Bucket index

在内存中时,后台进程会定期更新存储桶索引,以便同一租户对同一 querier 实例的后续查询使用缓存的(并定期更新的)存储桶索引。

以下配置选项决定存储桶索引更新间隔

  • -blocks-storage.bucket-store.sync-interval
    此选项配置缓存的存储桶索引的刷新频率。
  • -blocks-storage.bucket-store.bucket-index.update-on-error-interval
    如果下载存储桶索引失败,失败状态会短期缓存,以避免后端存储遭受大量存储请求。此选项配置存储桶存储尝试加载失败的存储桶索引的频率。

如果存储桶索引在通过 -blocks-storage.bucket-store.bucket-index.idle-timeout 配置的时间内未使用(例如,如果 querier 实例未收到来自租户的任何查询),则 querier 会将其从内存中移除,并停止定期更新。当启用shuffle sharding 时,这对于重分片到不同 querier 的租户很有用。

在查询时,querier 和 ruler 根据其 updated_at 字段确定存储桶索引的年龄。如果存储桶索引的年龄超过通过 -blocks-storage.bucket-store.bucket-index.max-stale-period 配置的时长,查询将失败。此断路器确保 querier 和 ruler 不会因对长期存储的视图过时而返回任何部分查询结果。

Store-gateway 如何使用它

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


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