聚合多个 TiDB 集群的监控数据

本文档介绍如何通过 Thanos 聚合多个 TiDB 集群的监控数据,解决多集群下监控数据的中心化问题。

Thanos 介绍

Thanos 是 Prometheus 高可用的解决方案,用于简化 Prometheus 的可用性保证。详细内容请参考 Thanos 官方文档

Thanos 提供了跨 Prometheus 的统一查询方案 Thanos Query 组件,可以利用这个功能解决 TiDB 多集群监控数据聚合的问题。

通过 Thanos Query 聚合监控数据

配置 Thanos Query

  1. 为每个 TidbMonitor 配置一个 Thanos Sidecar 容器。

    示例如下:

    kubectl -n ${namespace} apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.10/examples/monitor-with-thanos/tidb-monitor.yaml
  2. 部署 Thanos Query 组件。

    1. 下载 Thanos Query 的部署文件 thanos-query.yaml

      curl -sl -O https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.10/examples/monitor-with-thanos/thanos-query.yaml
    2. 手动修改 thanos-query.yaml 文件中的 --store 参数,将 basic-prometheus:10901 改为 basic-prometheus.${namespace}:10901

      其中,${namespace} 表示 TidbMonitor 部署的命名空间。

    3. 执行 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 的监控数据,请进行以下操作:

  1. 登陆 Grafana。
  2. 在左侧导航栏中,选择 Configuration > Data Sources
  3. 添加或修改一个 Prometheus 类型的 DataSource。
  4. 将 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: v6.1.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

文档内容是否有帮助?