在之前的实践中我们已经实现了prometheus的多租户读写:Prometheus和Thanos Receiver的“写多租户”实现_洒满阳光的午后的博客-CSDN博客
新的需求是要为不同的租户配置不同的数据保留时长。目前compactor组件天然是不具备多租户能力的,但是它有一个参数
--selector.relabel-config=<content>
Alternative to 'selector.relabel-config-file'
flag (mutually exclusive). Content of YAML file
that contains relabeling configuration that
allows selecting blocks. It follows native
Prometheus relabel-config syntax. See format
details:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#
可以让compactor在同步对象存储中的block时根据定义的规则进行筛选,利用这个特性,我们就可以实现多租户的概念。
通过配置hashring,不同的租户在不同的receive上会形成不同的block流(可以从compactor组件或bucketweb组件的UI界面查看),这些block流拥有类似如下的标签:
replica: thanos-prod-receive-1
tenant_id: tenant-a
因此我们可以通过为每个租户创建一个compactor,通过selector.relabel-config指定该compactor只处理该租户的block流:
# 租户tenant-a的compactor配置
- |
--selector.relabel-config=
- action: keep
source_labels: ["tenant_id"]
regex: "tenant-a"
- --retention.resolution-raw=180d
- --retention.resolution-5m=180d
- --retention.resolution-1h=180d
# 租户tenant-b的compactor配置
- |
--selector.relabel-config=
- action: keep
source_labels: ["tenant_id"]
regex: "tenant-b"
- --retention.resolution-raw=60d
- --retention.resolution-5m=60d
- --retention.resolution-1h=60d
上述配置可以实现tenant-a数据保留180d,tenant-b数据保留60d。
compactor仍然遵守要单例原则,每个租户仅能配置一个compactor。