聚合多个 TiDB 集群的监控数据
本文档介绍如何通过 Thanos 聚合多个 TiDB 集群的监控数据,解决多集群下监控数据的中心化问题。
Thanos 介绍
Thanos 是 Prometheus 高可用的解决方案,用于简化 Prometheus 的可用性保证。详细内容请参考 Thanos 官方文档。
Thanos 提供了跨 Prometheus 的统一查询方案 Thanos Query 组件,可以利用这个功能解决 TiDB 多集群监控数据聚合的问题。
通过 Thanos Query 聚合监控数据
配置 Thanos Query
为每个 TidbMonitor 配置一个 Thanos Sidecar 容器。
示例如下:
kubectl -n ${namespace} apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.4.7/examples/monitor-with-thanos/tidb-monitor.yaml部署 Thanos Query 组件。
下载 Thanos Query 的部署文件
thanos-query.yaml
:curl -sl -O https://raw.githubusercontent.com/pingcap/tidb-operator/v1.4.7/examples/monitor-with-thanos/thanos-query.yaml手动修改
thanos-query.yaml
文件中的--store
参数,将basic-prometheus:10901
改为basic-prometheus.${namespace}:10901
。其中,
${namespace}
表示 TidbMonitor 部署的命名空间。执行
kubectl apply
命令部署:kubectl -n ${thanos_namespace} apply -f thanos-query.yaml其中,
${thanos_namespace}
表示 Thanos Query 组件部署的命名空间。
在 Thanos Query 中,一个 Prometheus 对应一个 Store,也就对应一个 TidbMonitor。部署完 Thanos Query,就可以通过 Thanos Query 的 API 提供监控数据的统一查询接口。
访问 Thanos Query 面板
要访问 Thanos Query 面板,请执行以下命令,然后通过浏览器访问 http://127.0.0.1:9090
kubectl port-forward -n ${thanos_namespace} svc/thanos-query 9090
如果你想通过 NodePort 或 LoadBalancer 访问,请参考:
配置 Grafana
部署 Thanos Query 之后,要查询多个 TidbMonitor 的监控数据,请进行以下操作:
- 登陆 Grafana。
- 在左侧导航栏中,选择
Configuration
>Data Sources
。 - 添加或修改一个 Prometheus 类型的 DataSource。
- 将 HTTP 下面的 URL 设置为
http://thanos-query.${thanos_namespace}:9090
增加或者减少 TidbMonitor
在 Thanos Query 中,一个 Prometheus 对应一个 Monitor Store,也就对应一个 TidbMonitor。当需要从 Thanos Query 增加、更新或者下线 Monitor Store 时,需要更新 Thanos Query 组件的命令参数 --store
,滚动更新 Thanos Query 组件。
spec:
containers:
- args:
- query
- --grpc-address=0.0.0.0:10901
- --http-address=0.0.0.0:9090
- --log.level=debug
- --log.format=logfmt
- --query.replica-label=prometheus_replica
- --query.replica-label=rule_replica
- --store=<TidbMonitorName1>-prometheus.<TidbMonitorNs1>:10901
- --store=<TidbMonitorName2>-prometheus.<TidbMonitorNs2>:10901
配置 Thanos Sidecar 归档存储
Thanos Sidecar 支持将监控数据同步到 S3 远端存储,配置如下:
TidbMonitor CR 配置如下:
spec:
thanos:
baseImage: thanosio/thanos
version: v0.17.2
objectStorageConfig:
key: objectstorage.yaml
name: thanos-objectstorage
同时需要创建一个 Secret,示例如下:
apiVersion: v1
kind: Secret
metadata:
name: thanos-objectstorage
type: Opaque
stringData:
objectstorage.yaml: |
type: S3
config:
bucket: "xxxxxx"
endpoint: "xxxx"
region: ""
access_key: "xxxx"
insecure: true
signature_version2: true
secret_key: "xxxx"
put_user_metadata: {}
http_config:
idle_conn_timeout: 90s
response_header_timeout: 2m
trace:
enable: true
part_size: 41943040
RemoteWrite 模式
除了 Thanos Query 监控聚合模式,也可以通过 Prometheus RemoteWrite 推送监控数据到 Thanos。
在启动 TiDBMonitor 时可以指定 Prometheus RemoteWrite 配置,示例如下:
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
name: basic
spec:
clusters:
- name: basic
prometheus:
baseImage: prom/prometheus
version: v2.27.1
remoteWrite:
- url: "http://thanos-receiver:19291/api/v1/receive"
grafana:
baseImage: grafana/grafana
version: 7.5.11
initializer:
baseImage: registry.cn-beijing.aliyuncs.com/tidb/tidb-monitor-initializer
version: v7.5.0
reloader:
baseImage: registry.cn-beijing.aliyuncs.com/tidb/tidb-monitor-reloader
version: v1.0.1
prometheusReloader:
baseImage: quay.io/prometheus-operator/prometheus-config-reloader
version: v0.49.0
imagePullPolicy: IfNotPresent
Prometheus 将会把数据推送到 Thanos Receiver 服务,详情可以参考 Receiver 架构设计。
部署方案可以参考 Example。