compact主要是对对象存储里面大时间查询的优化,因为对象存储当中数据可以存放很久,时间范围可以拉的很长,可以查几个月前的数据,这样拉取的数据量就非常大了,通常就会超时或者非常长的时间才能查询出来。
compact其实就是读取对象存储当中的数据,对它做些压缩,降采样(它有一份原始的数据,他还会增加采样间隔更长的数据,原始数据可能10s,15s间隔一次的采集,它可能就降低为5m一次,或者1h一次,这样数据量就小很多,在查询大时间范围的时候就选择采样时间更长的数据,这样拉出来的数据就会小很多)(因为是看历史趋势,不是查看细节,所以不需要那么密集的数据点),
现在历史监控数据已经上传到对象存储中去了,但是由于监控数据量非常庞大,所以一般情况下我们会去安装一个 Thanos 的 Compactor 组件,用来将对象存储中的数据进行压缩。
Compactor 组件只与对象存储交互,是唯一拥有删除对象存储数据权限的组件,主要有两个作用:压缩 block(将多个 block 合并成一个)、降采样(可禁用,5m/1h 采样数据)。可设置数据保留时长,原始数据、5m/1h 降采样数据可分别设置保留时长。
降采样
Compactor 用于定时对远端对象存储中的历史数据块进行下采样,Compactor 会将小的存储块合并为大的存储块,提升在做大时间跨度查询时的速度。
下采样有三个主要的配置参数:(可以配置保留多少天)
--retention.resolution-raw
(单位:d,默认 0d)--retention.resolution-5m
(单位:d,默认 0d)--retention.resolution-1h
(单位:d,默认 0d)
当开启 raw
之后,原有的历史数据会以该项所配置的时间长度保留于远端对象存储中,超过该时间的数据会被清理。
5m
开启后会为每个存储时长大于 40 小时的块中开辟新的存储区域,将历史数据以 5 分钟为精度进行下采样,以该项所配置的时间长度存储于远端对象存储中。
1h
开启后会为每个存储时长大于 10 天的块中开辟新的存储区域,将历史数据以 1 小时为间隔进行下采样,以该项所配置的时间长度存储于远端对象存储中。
下采样的实现方式是以外部标签为分组,以数据块为单位,以采样精度为取值区间在原有的数据块中取指标值保存到新建的下采样数据块中。
这三种采样的数据都是独立存储,相当于存了三份数据,因此并不能起到压缩存储空间的作用。
默认情况下值为 0d 表示永久保留下采样数据。如果需要关闭下采样,也可以在启动时附加 --debug.disable-downsampling
参数。
安装
由于 Compactor 的设计是非并发安全的,因此只能单例部署,一个 Bucket 也只允许运行一个 Compactor,每一个 Store Gateway 都需要配置一个 Bucket 桶,而一个 Bucket 只允许一个 Compactor,可以根据以下维度去划分 Bucket:
- 结算方式
- 所在区域
- 所属业务
- 基础设施层级
- 单指标的横向拆分
Compactor 组件的部署和 Store 非常类似,指定对象存储的配置文件即可(只和对象存储做对接的),如下所示的资源清单文件:
# thanos-compactor.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: thanos-compactor
namespace: kube-mon
labels:
app: thanos-compactor
spec:
replicas: 1
selector:
matchLabels:
app: thanos-compactor
serviceName: thanos-compactor
template:
metadata:
labels:
app: thanos-compactor
spec:
containers:
- name: thanos
image: thanosio/thanos:v0.25.1
args:
- "compact"
- "--log.level=debug"
- "--data-dir=/data"
- "--objstore.config-file=/etc/secret/thanos.yaml"
- "--wait"
ports:
- name: http
containerPort: 10902
livenessProbe:
httpGet:
port: 10902
path: /-/healthy
initialDelaySeconds: 10
readinessProbe:
httpGet:
port: 10902
path: /-/ready
initialDelaySeconds: 15
volumeMounts:
- name: object-storage-config
mountPath: /etc/secret
readOnly: false
volumes:
- name: object-storage-config
secret:
secretName: thanos-objectstorage
---
apiVersion: v1
kind: Service
metadata:
name: thanos-compactor
namespace: kube-mon
labels:
app: thanos-compactor
spec:
ports:
- port: 10902
targetPort: http
name: http
selector:
app: thanos-compactor
type: NodePort
最重要的还是提供对象存储的配置文件,然后直接创建上面的资源清单文件:
☸ ➜ kubectl apply -f https://p8s.io/docs/thanos/manifests/thanos-compactor.yaml
☸ ➜ kubectl get pods -n kube-mon -l app=thanos-compactor
NAME READY STATUS RESTARTS AGE
thanos-compactor-0 1/1 Running 0 68s
☸ ➜ kubectl get svc -n kube-mon -l app=thanos-compactor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
thanos-compactor NodePort 10.97.151.170 <none> 10902:32051/TCP 71s
Compactor 同样也提供了一个 Web 界面,这里我们可以通过 NodePort 进行访问:
在页面中还可以对存储块进行管理,在右下角,我们可以标记删除一个存储块,也可以选择不对其进行降采样。