Skip to content

TiDB 关键指标监控

监控是数据库运维的重要组成部分,通过监控可以实时了解数据库的运行状态,及时发现和解决问题。TiDB 提供了丰富的监控指标,可以通过 Prometheus 和 Grafana 进行可视化监控。

监控架构

1. 监控组件

TiDB 监控系统由以下组件组成:

  • Prometheus:开源的监控和告警工具,用于收集和存储监控指标
  • Grafana:开源的数据可视化工具,用于展示 Prometheus 收集的监控指标
  • TiDB Exporter:TiDB 提供的监控指标导出器,用于导出 TiDB、TiKV、PD 等组件的监控指标
  • Node Exporter:用于导出主机层面的监控指标,如 CPU、内存、磁盘等
  • Blackbox Exporter:用于监控网络连通性和 HTTP 服务

2. 监控数据流向

[TiDB 集群组件]  →  [TiDB Exporter]  →  [Prometheus]  →  [Grafana]
    │                                  ↑
    │                                  │
    └───→  [Node Exporter]  ──────────┘
    │                                  ↑
    │                                  │
    └───→  [Blackbox Exporter]  ───────┘

关键监控指标

1. TiDB 服务器指标

连接指标

指标名称指标类型描述告警阈值
tidb_server_connectionsGaugeTiDB 当前连接数超过最大连接数的 80%
tidb_server_connection_error_totalCounterTiDB 连接错误总数每分钟增加超过 10 个
tidb_server_aborted_clients_totalCounter被终止的客户端连接数每分钟增加超过 10 个

查询性能指标

指标名称指标类型描述告警阈值
tidb_server_qpsGaugeTiDB 每秒查询数根据业务需求调整
tidb_server_tpsGaugeTiDB 每秒事务数根据业务需求调整
tidb_server_query_duration_secondsHistogram查询执行时间分布P95 超过 1 秒
tidb_server_slow_queries_totalCounter慢查询总数每分钟增加超过 5 个

内存和 CPU 指标

指标名称指标类型描述告警阈值
tidb_server_memory_usage_bytesGaugeTiDB 内存使用量超过总内存的 80%
process_cpu_seconds_totalCounterTiDB CPU 使用时间CPU 使用率超过 80%

2. TiKV 服务器指标

存储指标

指标名称指标类型描述告警阈值
tikv_engine_size_bytesGaugeTiKV 存储引擎大小根据磁盘容量调整
tikv_engine_write_bytes_totalCounterTiKV 写入字节总数根据业务需求调整
tikv_engine_read_bytes_totalCounterTiKV 读取字节总数根据业务需求调整
tikv_engine_sst_filesGaugeTiKV SST 文件数量超过 1000 个

性能指标

指标名称指标类型描述告警阈值
tikv_server_thread_cpu_seconds_totalCounterTiKV 线程 CPU 使用时间CPU 使用率超过 80%
tikv_server_thread_io_wait_seconds_totalCounterTiKV 线程 IO 等待时间IO 等待时间超过 CPU 时间的 50%
tikv_raftstore_propose_wait_duration_secondsHistogramRaft 提案等待时间P95 超过 100ms
tikv_raftstore_apply_wait_duration_secondsHistogramRaft 应用等待时间P95 超过 100ms

Region 指标

指标名称指标类型描述告警阈值
tikv_raftstore_region_countGaugeTiKV 节点上的 Region 数量超过 10000 个
tikv_raftstore_region_leader_countGaugeTiKV 节点上的 Region Leader 数量超过 Region 总数的 40%
tikv_raftstore_pending_snapshotsGauge待处理的快照数量超过 10 个

3. PD 服务器指标

集群状态指标

指标名称指标类型描述告警阈值
pd_cluster_statusGaugePD 集群状态,1 表示正常,0 表示异常等于 0
pd_cluster_region_countGauge集群中 Region 的总数量根据集群规模调整
pd_cluster_store_countGauge集群中 TiKV 节点的数量小于预期数量

调度指标

指标名称指标类型描述告警阈值
pd_scheduler_operator_create_totalCounter创建的调度操作总数根据集群规模调整
pd_scheduler_operator_finish_totalCounter完成的调度操作总数远小于创建的调度操作数
pd_scheduler_operator_failed_totalCounter失败的调度操作总数每分钟增加超过 10 个

4. 主机指标

CPU 和内存指标

指标名称指标类型描述告警阈值
node_cpu_seconds_totalCounter主机 CPU 使用时间CPU 使用率超过 80%
node_memory_MemTotal_bytesGauge主机总内存-
node_memory_MemAvailable_bytesGauge主机可用内存可用内存不足总内存的 20%
node_memory_SwapFree_bytesGauge主机可用 swap 空间可用 swap 空间不足总 swap 的 20%

磁盘指标

指标名称指标类型描述告警阈值
node_filesystem_size_bytesGauge文件系统总大小-
node_filesystem_avail_bytesGauge文件系统可用空间可用空间不足总大小的 20%
node_disk_read_bytes_totalCounter磁盘读取字节总数根据磁盘性能调整
node_disk_written_bytes_totalCounter磁盘写入字节总数根据磁盘性能调整
node_disk_io_time_seconds_totalCounter磁盘 IO 时间磁盘 IO 使用率超过 80%

网络指标

指标名称指标类型描述告警阈值
node_network_receive_bytes_totalCounter网络接收字节总数根据网络带宽调整
node_network_transmit_bytes_totalCounter网络发送字节总数根据网络带宽调整
node_network_receive_errs_totalCounter网络接收错误总数每分钟增加超过 10 个
node_network_transmit_errs_totalCounter网络发送错误总数每分钟增加超过 10 个

Prometheus 配置

1. Prometheus 安装

bash
# 下载 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

# 解压 Prometheus
tar xvfz prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64

# 启动 Prometheus
./prometheus --config.file=prometheus.yml

2. Prometheus 配置文件

基本配置

yaml
global:
  scrape_interval:     15s # 抓取间隔
  evaluation_interval: 15s # 评估间隔

# Alertmanager 配置
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093']

# 告警规则配置
rule_files:
  - "rules/*.yml"

# 抓取配置
scrape_configs:
  # 监控 Prometheus 自身
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

  # 监控 TiDB 集群
  - job_name: 'tidb'
    static_configs:
    - targets: ['<tidb-host>:10080']

  # 监控 TiKV 集群
  - job_name: 'tikv'
    static_configs:
    - targets: ['<tikv-host>:20180']

  # 监控 PD 集群
  - job_name: 'pd'
    static_configs:
    - targets: ['<pd-host>:2379']

  # 监控主机
  - job_name: 'node'
    static_configs:
    - targets: ['<host>:9100']

服务发现配置

对于动态变化的集群,可以使用服务发现功能:

yaml
# 使用文件服务发现
- job_name: 'tidb'
  file_sd_configs:
  - files: ['tidb-targets.yml']
    refresh_interval: 5m

# 使用 DNS 服务发现
- job_name: 'tidb'
  dns_sd_configs:
  - names:
    - 'tidb.service.consul'
    type: 'A'
    port: 10080

# 使用 Kubernetes 服务发现
- job_name: 'tidb'
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
    action: keep
    regex: tidb
  - source_labels: [__address__]
    action: replace
    regex: ([^:]+):\d+
    replacement: $1:10080
    target_label: __address__

3. 告警规则配置

TiDB 告警规则示例

yaml
groups:
- name: tidb-alerts
  rules:
  # TiDB 连接数过高告警
  - alert: TiDBConnectionHigh
    expr: tidb_server_connections / tidb_server_max_connections > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB 连接数过高 ({{ $labels.instance }})"
      description: "TiDB 连接数已超过最大连接数的 80%,当前连接数: {{ $value }}"

  # TiDB 慢查询过多告警
  - alert: TiDBSlowQueriesHigh
    expr: rate(tidb_server_slow_queries_total[5m]) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB 慢查询过多 ({{ $labels.instance }})"
      description: "TiDB 慢查询率已超过 10 QPS,当前速率: {{ $value }} QPS"

  # TiDB 内存使用过高告警
  - alert: TiDBMemoryHigh
    expr: tidb_server_memory_usage_bytes / (node_memory_MemTotal_bytes * 0.8) > 0.8
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiDB 内存使用过高 ({{ $labels.instance }})"
      description: "TiDB 内存使用已超过可用内存的 80%,当前使用: {{ $value }} bytes"

Grafana 配置

1. Grafana 安装

bash
# 下载 Grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.0.3.linux-amd64.tar.gz

# 解压 Grafana
tar xvfz grafana-enterprise-10.0.3.linux-amd64.tar.gz
cd grafana-10.0.3

# 启动 Grafana
./bin/grafana-server

2. 配置 Prometheus 数据源

  1. 登录 Grafana 管理界面(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
  2. 点击左侧菜单的 "Configuration" → "Data Sources"
  3. 点击 "Add data source"
  4. 选择 "Prometheus"
  5. 在 "HTTP" 部分,设置 URL 为 Prometheus 服务器地址(如 http://localhost:9090
  6. 点击 "Save & Test",验证数据源是否配置成功

3. 导入 TiDB 监控面板

TiDB 提供了官方的 Grafana 监控面板,可以直接导入使用:

  1. 点击左侧菜单的 "Create" → "Import"
  2. 输入 TiDB 监控面板 ID(如 12900 用于 TiDB 集群监控)
  3. 选择已配置的 Prometheus 数据源
  4. 点击 "Import",导入监控面板

4. 自定义监控面板

除了使用官方提供的监控面板,还可以根据业务需求自定义监控面板:

  1. 点击左侧菜单的 "Create" → "Dashboard"
  2. 点击 "Add a new panel"
  3. 在 "Query" 标签页,选择 Prometheus 数据源,输入查询语句
  4. 在 "Visualization" 标签页,选择合适的图表类型
  5. 在 "General" 标签页,设置面板标题和描述
  6. 点击 "Apply",保存面板

监控告警

1. Alertmanager 配置

Alertmanager 用于处理 Prometheus 发送的告警,可以通过邮件、Slack、微信等方式发送告警通知。

Alertmanager 安装

bash
# 下载 Alertmanagernwget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz

# 解压 Alertmanager
tar xvfz alertmanager-0.25.0.linux-amd64.tar.gz
cd alertmanager-0.25.0.linux-amd64

# 启动 Alertmanager
./alertmanager --config.file=alertmanager.yml

Alertmanager 配置文件

yaml
global:
  resolve_timeout: 5m
  # 邮件配置
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager'
  smtp_auth_password: 'password'
  smtp_require_tls: true

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email'

receivers:
- name: 'email'
  email_configs:
  - to: 'admin@example.com'
    send_resolved: true

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'cluster', 'service']

2. 告警分级

根据告警的严重程度,可以将告警分为不同的级别:

  • Critical(严重):需要立即处理的问题,如数据库不可用、数据丢失等
  • Warning(警告):需要关注的问题,如性能下降、资源使用率过高等
  • Info(信息):一般信息,如配置变更、服务重启等

3. 告警处理流程

  1. 告警触发:当监控指标超过阈值时,Prometheus 触发告警
  2. 告警分组:Alertmanager 将相关告警分组
  3. 告警通知:Alertmanager 通过配置的方式发送告警通知
  4. 告警确认:运维人员确认收到告警
  5. 问题排查:运维人员根据告警信息排查问题
  6. 问题解决:解决排查出的问题
  7. 告警恢复:当监控指标恢复正常时,Prometheus 发送告警恢复通知
  8. 告警关闭:运维人员确认问题已解决,关闭告警

监控最佳实践

1. 监控覆盖范围

  • 全栈监控:监控从应用层到基础设施层的所有组件
  • 关键指标监控:重点监控与业务相关的关键指标
  • 端到端监控:监控从客户端到数据库的完整链路
  • 日志与监控结合:将监控指标与日志结合,便于问题排查

2. 告警策略

  • 合理设置阈值:根据业务需求和历史数据,设置合理的告警阈值
  • 避免告警风暴:通过告警分组、抑制规则等方式,避免告警风暴
  • 告警分级:根据告警的严重程度,设置不同的告警级别
  • 告警通知方式:根据告警级别,选择合适的通知方式

3. 性能优化

  • 调整抓取间隔:根据指标的变化频率,调整 Prometheus 的抓取间隔
  • 合理设置保留时间:根据存储容量和业务需求,设置合理的指标保留时间
  • 使用 downsampling:对历史数据进行降采样,减少存储开销
  • 优化查询语句:优化 Grafana 面板中的查询语句,提高查询性能

4. 自动化运维

  • 自动扩缩容:根据监控指标,自动调整集群规模
  • 自动故障恢复:当检测到故障时,自动进行故障恢复
  • 自动备份:根据监控指标,自动调整备份策略
  • 自动优化:根据监控指标,自动优化数据库配置

常见问题处理

1. Prometheus 抓取失败

  • 问题:Prometheus 无法抓取 TiDB 监控指标 解决方法
    • 检查 TiDB 监控端口(默认 10080)是否开放
    • 检查 TiDB 配置,确保监控功能已启用
    • 检查网络连接,确保 Prometheus 可以访问 TiDB 节点
    • 检查 Prometheus 配置文件,确保抓取配置正确

2. Grafana 面板无数据

  • 问题:Grafana 面板显示无数据 解决方法
    • 检查 Prometheus 数据源是否配置正确
    • 检查查询语句是否正确
    • 检查时间范围是否设置正确
    • 检查 Prometheus 是否有数据

3. 告警通知未收到

  • 问题:告警触发但未收到通知 解决方法
    • 检查 Alertmanager 配置是否正确
    • 检查 Alertmanager 是否正常运行
    • 检查通知渠道是否配置正确
    • 检查网络连接,确保 Alertmanager 可以访问通知渠道

4. 监控指标不准确

  • 问题:监控指标与实际情况不符 解决方法
    • 检查指标定义是否正确
    • 检查指标采集频率是否合理
    • 检查指标计算方式是否正确
    • 检查是否存在指标重复采集

常见问题(FAQ)

Q1: TiDB 监控指标的默认采集端口是什么?

A1: TiDB 各组件的默认监控端口如下:

  • TiDB:10080
  • TiKV:20180
  • PD:2379
  • Node Exporter:9100

Q2: 如何查看 TiDB 集群的实时监控数据?

A2: 可以通过以下方式查看 TiDB 集群的实时监控数据:

  • 使用 TiDB Dashboard,直接查看集群监控
  • 使用 Grafana,查看导入的 TiDB 监控面板
  • 直接访问 Prometheus UI,执行查询语句

Q3: 如何配置 TiDB 监控告警?

A3: 配置 TiDB 监控告警的步骤如下:

  1. 在 Prometheus 中配置告警规则
  2. 安装和配置 Alertmanager
  3. 在 Alertmanager 中配置告警通知方式
  4. 测试告警是否正常工作

Q4: 如何优化 TiDB 监控性能?

A4: 优化 TiDB 监控性能的方法如下:

  • 调整 Prometheus 的抓取间隔
  • 减少不必要的监控指标
  • 合理设置指标保留时间
  • 使用 downsampling 对历史数据进行降采样
  • 优化 Grafana 面板中的查询语句

Q5: 如何监控 TiDB 慢查询?

A5: 监控 TiDB 慢查询的方法如下:

  • 使用 TiDB Dashboard 的慢查询页面
  • 使用 Prometheus 监控 tidb_server_slow_queries_total 指标
  • 配置慢查询日志,使用 ELK 或其他日志系统进行分析

Q6: 如何监控 TiDB 集群的容量?

A6: 监控 TiDB 集群容量的方法如下:

  • 监控 TiKV 存储引擎大小 tikv_engine_size_bytes 指标
  • 监控主机磁盘空间 node_filesystem_avail_bytes 指标
  • 使用 TiDB Dashboard 的容量规划页面

Q7: 如何监控 TiDB 集群的高可用性?

A7: 监控 TiDB 集群高可用性的方法如下:

  • 监控 TiDB 节点数量 tidb_cluster_tidb_count 指标
  • 监控 TiKV 节点数量 pd_cluster_store_count 指标
  • 监控 PD 集群状态 pd_cluster_status 指标
  • 监控 Region 副本状态 tikv_raftstore_region_healthy 指标

Q8: 如何使用服务发现功能监控动态变化的 TiDB 集群?

A8: 可以使用以下服务发现方式监控动态变化的 TiDB 集群:

  • 文件服务发现:通过更新配置文件来添加或删除监控目标
  • DNS 服务发现:通过 DNS 记录自动发现监控目标
  • Kubernetes 服务发现:在 Kubernetes 环境中自动发现监控目标
  • Consul 服务发现:通过 Consul 服务发现监控目标