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

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

Thanos 介绍

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

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

通过 Thanos Query 聚合监控数据

配置 Thanos Query

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

    示例如下:

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

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

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

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

    3. 执行 kubectl apply 命令部署:

      1. 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

  1. 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 组件。

  1. spec:
  2. containers:
  3. - args:
  4. - query
  5. - --grpc-address=0.0.0.0:10901
  6. - --http-address=0.0.0.0:9090
  7. - --log.level=debug
  8. - --log.format=logfmt
  9. - --query.replica-label=prometheus_replica
  10. - --query.replica-label=rule_replica
  11. - --store=<TidbMonitorName1>-prometheus.<TidbMonitorNs1>:10901
  12. - --store=<TidbMonitorName2>-prometheus.<TidbMonitorNs2>:10901

配置 Thanos Sidecar 归档存储

聚合多个 TiDB 集群的监控数据 - 图1注意

为确保配置成功,必须先创建 S3 bucket。如果你选择 AWS S3,请参考 AWS S3 创建 bucketAWS S3 endpoint 列表

Thanos Sidecar 支持将监控数据同步到 S3 远端存储,配置如下:

TidbMonitor CR 配置如下:

  1. spec:
  2. thanos:
  3. baseImage: thanosio/thanos
  4. version: v0.17.2
  5. objectStorageConfig:
  6. key: objectstorage.yaml
  7. name: thanos-objectstorage

同时需要创建一个 Secret,示例如下:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: thanos-objectstorage
  5. type: Opaque
  6. stringData:
  7. objectstorage.yaml: |
  8. type: S3
  9. config:
  10. bucket: "xxxxxx"
  11. endpoint: "xxxx"
  12. region: ""
  13. access_key: "xxxx"
  14. insecure: true
  15. signature_version2: true
  16. secret_key: "xxxx"
  17. put_user_metadata: {}
  18. http_config:
  19. idle_conn_timeout: 90s
  20. response_header_timeout: 2m
  21. trace:
  22. enable: true
  23. part_size: 41943040

RemoteWrite 模式

除了 Thanos Query 监控聚合模式,也可以通过 Prometheus RemoteWrite 推送监控数据到 Thanos。

在启动 TiDBMonitor 时可以指定 Prometheus RemoteWrite 配置,示例如下:

  1. apiVersion: pingcap.com/v1alpha1
  2. kind: TidbMonitor
  3. metadata:
  4. name: basic
  5. spec:
  6. clusters:
  7. - name: basic
  8. prometheus:
  9. baseImage: prom/prometheus
  10. version: v2.27.1
  11. remoteWrite:
  12. - url: "http://thanos-receiver:19291/api/v1/receive"
  13. grafana:
  14. baseImage: grafana/grafana
  15. version: 7.5.11
  16. initializer:
  17. baseImage: registry.cn-beijing.aliyuncs.com/tidb/tidb-monitor-initializer
  18. version: v5.4.0
  19. reloader:
  20. baseImage: registry.cn-beijing.aliyuncs.com/tidb/tidb-monitor-reloader
  21. version: v1.0.1
  22. prometheusReloader:
  23. baseImage: quay.io/prometheus-operator/prometheus-config-reloader
  24. version: v0.49.0
  25. imagePullPolicy: IfNotPresent

Prometheus 将会把数据推送到 Thanos Receiver 服务,详情可以参考 Receiver 架构设计

部署方案可以参考 Example