Grafana Mimir 存储桶索引
存储桶索引是每个租户的文件,包含存储中的块列表和块删除标记。存储桶索引存储在后端对象存储中,由 compactor 定期更新,并供 querier、store-gateway 和 ruler(在内部操作模式下)用于发现存储中的块。
优势
querier、store-gateway 和 ruler 必须具有近乎1 最新的存储桶视图,以便在查询时(querier)找到要查找的正确块,并加载块的二进制索引头(store-gateway)。因此,它们需要定期扫描存储桶,以查找由 ingester 或 compactor 上传的新块,以及由 compactor 删除(或标记为删除)的块。
启用存储桶索引后,querier、store-gateway 和 ruler 会定期查找每个租户的存储桶索引,而不是通过 list objects
操作扫描存储桶。
这提供了以下优势
- 减少 querier 和 store-gateway 对对象存储的 API 调用次数
- querier 和 store-gateway 不执行“list objects”存储 API 调用
- querier 在启动后立即运行,因此无需执行初始存储桶扫描
索引结构
bucket-index.json.gz
文件包含
块
租户的完整块列表,包括标记为删除的块。不包括部分块。块删除标记
块删除标记列表。updated_at
一个 Unix 时间戳,精度以秒为单位,显示索引最后一次更新并写入存储的时间。
如何更新
compactor 定期扫描存储桶并上传更新后的存储桶索引到存储中。您可以通过 -compactor.cleanup-interval
配置存储桶索引的更新频率。
存储桶索引的使用是可选的,但即使 -blocks-storage.bucket-store.bucket-index.enabled=false
,索引也会由 compactor 构建和更新。这种行为确保任何租户的存储桶索引都存在,并且如果在运行中的 Grafana Mimir 集群中启用存储桶索引,可以保证查询结果的一致性。保持存储桶索引更新引入的开销并不显著。
Querier 如何使用它
在查询时,querier 和 ruler 会确定租户的存储桶索引是否已加载到内存中。如果未加载,querier 和 ruler 会从存储中下载并缓存它。
由于存储桶索引是一个小文件,延迟下载对首次查询性能影响不大,但确实允许 querier 在不预先下载每个租户的存储桶索引的情况下启动并运行。此外,如果元数据缓存已启用,存储桶索引会在共享缓存中短期缓存,这减少了延迟,并降低了在多个 querier 和 ruler 在短时间内获取同一租户的存储桶索引时对对象存储的 API 调用次数。
在内存中时,后台进程会定期更新存储桶索引,以便同一租户对同一 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 在启动时和定期地获取属于其分片的每个租户的存储桶索引,并将其用作存储中块和删除标记的真实来源。这消除了定期扫描存储桶以发现属于其分片的块的需要。
ingester 在将数据卸载到长期存储时会定期向存储桶添加新块,然后 compactor 会压缩这些块并标记原始块以供删除。实际删除发生在与参数
-compactor.deletion-delay
相关联的延迟值之后。尝试获取已删除的块将导致查询失败。因此,在此上下文中,近乎↩︎ 最新的视图是指过期时间少于-compactor.deletion-delay
值的视图。