在上一节,我们详细介绍了thanos组件中的receiver和store。这一节我们将带来querier和compact的讲解。
querier
在thanos中,querier是一个聚合查询的指标数据、并对指标数据进行去重等操作的一个组件。
在querier的上游可以是例如Grafana图形展示的工具等。而querier的存在让这些展示指标的前端页面无需关注数据的来源有哪些,只需要要将查询的条件告知querier,由querier去prometheus、sidecar、receive、对象存储等多个数据源去获取数据。
我们首先看下querier的启动参赛:
query--query.auto-downsampling--grpc-address=0.0.0.0:10901--http-address=0.0.0.0:9090--query.partial-response--query.replica-label=receive_replica--store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local --store=dnssrv+_grpc._tcp.thanos-receive.thanos.svc.cluster.local
复制
参数详解
query.auto-downsampling - 查询数据的最大分辨率 0则按照采样的数据分辨率。
grpc-address - grpc服务的端口
http-address - http服务的端口
query.partial-response - 该值默认为true则通过该querier不再查询到数据
query.replica-label - 查询时忽略的label,返回的指标数据不再包含以上label
store - 查询的数据源
query.replica-label
大家可以回忆一下上一节启动receive时有指定一个label参数:
--label=receive_replica="$(NAME)"
复制
其含义是通过该receive副本收集到的指标都会增加一个label标签,例如 receiver-0 副本采集到的一条指标如下:
node_disk_io{instance="10.11.2.72:39100", replica-label="receiver-0"}
复制
而通过 receiver-1 副本采集到的一条指标如下:
node_disk_io_total{instance="10.11.2.72:39100", replica-label="receiver-1"}
复制
这样通过公式查询到的指标再进行运算是无法计算出结果的,因为通过querier获取到的指标认为是不同的指标。
node_disk_io{instance=~"$instance"} / node_disk_io_total{instance=~"$instance"}
复制
当通过 quey 启动的时候指定 query.replica-label=receive_replica 时,从 query 获取到的指标自动会去掉receive_replica标签
node_disk_io{instance="10.11.2.72:39100"}node_disk_io_total{instance="10.11.2.72:39100"}
复制
这样就可以进行指标的运算了。
在 kubernetes 中启动query的yaml模版如下:
apiVersion: v1kind: Servicemetadata: name: thanos-query namespace: thanos labels: app.kubernetes.io/name: thanos-queryspec: type: NodePort ports: - name: grpc port: 10901 targetPort: grpc - name: http port: 9090 targetPort: http nodePort: 30911 selector: app.kubernetes.io/name: thanos-query---apiVersion: apps/v1kind: Deploymentmetadata: name: thanos-query namespace: thanos labels: app.kubernetes.io/name: thanos-queryspec: replicas: 3 selector: matchLabels: app.kubernetes.io/name: thanos-query template: metadata: labels: app.kubernetes.io/name: thanos-query spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app.kubernetes.io/name operator: In values: - thanos-query topologyKey: kubernetes.io/hostname weight: 100 containers: - args: - query - --log.level=debug - --query.auto-downsampling - --grpc-address=0.0.0.0:10901 - --http-address=0.0.0.0:9090 - --query.partial-response - --query.replica-label=receive_replica - --store=10.6.118.110:32766 # sidecar - --store=10.6.209.32:31574 # sidecar - --store=10.6.118.121:32766 # sidecar - --store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local # store - --store=dnssrv+_grpc._tcp.thanos-receive.thanos.svc.cluster.local image: thanos.io/thanos:v0.22.0 livenessProbe: failureThreshold: 4 httpGet: path: /-/healthy port: 9090 scheme: HTTP periodSeconds: 30 name: thanos-query ports: - containerPort: 10901 name: grpc - containerPort: 9090 name: http readinessProbe: failureThreshold: 20 httpGet: path: /-/ready port: 9090 scheme: HTTP periodSeconds: 5 terminationMessagePolicy: FallbackToLogsOnError terminationGracePeriodSeconds: 120
复制
其中我们可以看到制定的store和receive参数如下:
--store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local--store=dnssrv+_grpc._tcp.thanos-receive.thanos.svc.cluster.local
复制
这个与之前定义 store 和 receive 定义的 service 是相对应的,通过该定义可以获取到该 service 所有对应的 endpoint
dnssrv+_{protocal}._tcp.{service}.thanos.svc.cluster.local
复制
compact
compact是thanos中相对对立的一个组件,仅与对象存储存在交互。对对象存储中的指标数据进行压缩。
compact的启动参数如下:
compact--wait--wait-interval=5m--objstore.config-file=/etc/thanos/objectstorage.yaml--data-dir=/var/thanos/compact--retention.resolution-raw=90d--retention.resolution-5m=180d--retention.resolution-1h=360d
复制
参数详解
wait - 表示持续运行,类似cronjob,同时还可以指定运行的周期时间
wait-interval - 指定运行的周期时间,默认5分钟
objstore.config-file - 对象存储的配置文件路径
data-dir - 缓存文件路径
retention.resolution-raw - 保留原始样本数据的最长时间
retention.resolution-5m - 采样为5分钟数据保留的最长时间
retention.resolution-1h - 采样为1小时数据保留的最长时间
通过 compact 的启动参数可以大概知道 compact 的运行机制。根据设置的 wait-interval时间为周期,去对象存储里面清理数据,而清理数据的条件则是清理多长时间之前的数据,而且根据采样保留配置(retention.resolution-5m、retention.resolution-1h)来清理对象存储中的指标数据。
我们来看一下compact在k8s中运行的yaml文件:
apiVersion: apps/v1kind: StatefulSetmetadata: labels: app.kubernetes.io/name: thanos-compact name: thanos-compact namespace: thanosspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: thanos-compact serviceName: thanos-compact template: metadata: labels: app.kubernetes.io/name: thanos-compact spec: containers: - args: - compact - --wait - --objstore.config-file=/etc/thanos/objectstorage.yaml - --data-dir=/var/thanos/compact - --retention.resolution-raw=90d - --retention.resolution-5m=180d - --retention.resolution-1h=360d image: thanos.io/thanos:v0.22.0 livenessProbe: failureThreshold: 4 httpGet: path: /-/healthy port: 10902 scheme: HTTP periodSeconds: 30 name: thanos-compact ports: - containerPort: 10902 name: http readinessProbe: failureThreshold: 20 httpGet: path: /-/ready port: 10902 scheme: HTTP periodSeconds: 5 terminationMessagePolicy: FallbackToLogsOnError volumeMounts: - mountPath: /var/thanos/compact name: data readOnly: false - name: thanos-objectstorage subPath: objectstorage.yaml mountPath: /etc/thanos/objectstorage.yaml terminationGracePeriodSeconds: 120 volumes: - name: thanos-objectstorage secret: secretName: thanos-objectstorage volumeClaimTemplates: - metadata: labels: app.kubernetes.io/name: thanos-compact name: data spec: storageClassName: thanos-data-db accessModes: - ReadWriteOnce resources: requests: storage: 20Gi
复制
同时也可以指定compact的service:
apiVersion: v1kind: Servicemetadata: labels: app.kubernetes.io/name: thanos-compact name: thanos-compact namespace: thanosspec: ports: - name: http port: 10902 targetPort: http selector: app.kubernetes.io/name: thanos-compact
复制
query与compact的介绍就到这里了,下节将继续带来thanos的组件sidecar的介绍
本系列近期回顾:
Prometheus系列6 - thanos组件详解之storer&receiver
Prometheus系列5 - Alertmanager源码阅读