Skip to content

TiDB 监控告警配置

TiDB 提供了完整的监控告警体系,基于 Prometheus、Grafana 和 Alertmanager 构建。通过合理配置监控告警,可以及时发现和处理 TiDB 集群的异常情况,确保集群的高可用性和稳定性。本文档介绍 TiDB 监控告警的配置方法和最佳实践。

监控告警体系架构

TiDB 监控告警体系主要由以下组件组成:

  • Prometheus:负责收集和存储 TiDB 集群的监控指标
  • Grafana:负责展示 TiDB 集群的监控指标,提供可视化监控面板
  • Alertmanager:负责处理 Prometheus 发送的告警信息,包括告警分组、静默、抑制和通知
  • TiDB Exporter:负责暴露 TiDB 组件的监控指标,供 Prometheus 采集

Prometheus 配置

1. Prometheus 安装

TiDB 集群部署时,TiUP 会自动安装和配置 Prometheus。如果需要手动安装 Prometheus,可以参考以下步骤:

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

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

# 进入 Prometheus 目录
cd prometheus-2.45.0.linux-amd64

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

2. Prometheus 配置文件

Prometheus 的配置文件为 prometheus.yml,主要包括全局配置、告警规则配置和抓取目标配置。

全局配置

yaml
global:
  scrape_interval: 15s  # 抓取间隔,默认 15 秒
  evaluation_interval: 15s  # 告警规则评估间隔,默认 15 秒
  external_labels:
    cluster: tidb-cluster  # 集群标签

告警规则配置

yaml
rule_files:
  - "tidb.rules.yml"  # TiDB 告警规则文件路径
  - "tikv.rules.yml"  # TiKV 告警规则文件路径
  - "pd.rules.yml"  # PD 告警规则文件路径

抓取目标配置

yaml
scrape_configs:
  # TiDB 服务器
  - job_name: 'tidb'
    static_configs:
      - targets: ['tidb1:10080', 'tidb2:10080', 'tidb3:10080']
        labels:
          instance: tidb
          cluster: tidb-cluster

  # TiKV 服务器
  - job_name: 'tikv'
    static_configs:
      - targets: ['tikv1:20180', 'tikv2:20180', 'tikv3:20180']
        labels:
          instance: tikv
          cluster: tidb-cluster

  # PD 服务器
  - job_name: 'pd'
    static_configs:
      - targets: ['pd1:2379', 'pd2:2379', 'pd3:2379']
        labels:
          instance: pd
          cluster: tidb-cluster

  # TiFlash 服务器
  - job_name: 'tiflash'
    static_configs:
      - targets: ['tiflash1:20292', 'tiflash2:20292', 'tiflash3:20292']
        labels:
          instance: tiflash
          cluster: tidb-cluster

  # Node Exporter
  - job_name: 'node'
    static_configs:
      - targets: ['tidb1:9100', 'tidb2:9100', 'tidb3:9100', 'tikv1:9100', 'tikv2:9100', 'tikv3:9100', 'pd1:9100', 'pd2:9100', 'pd3:9100', 'tiflash1:9100', 'tiflash2:9100', 'tiflash3:9100']
        labels:
          instance: node
          cluster: tidb-cluster

告警规则配置

1. 告警规则文件

TiDB 提供了默认的告警规则文件,位于 TiUP 部署目录下的 prometheus-rules 目录中。这些规则文件包括:

  • tidb.rules.yml:TiDB 服务器的告警规则
  • tikv.rules.yml:TiKV 服务器的告警规则
  • pd.rules.yml:PD 服务器的告警规则
  • node.rules.yml:节点服务器的告警规则
  • cluster.rules.yml:集群级别的告警规则

2. 告警规则格式

告警规则的基本格式如下:

yaml
groups:
- name: tidb-alerts
  rules:
  - alert: TiDBDown
    expr: up{job="tidb"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiDB 服务器宕机"
      description: "TiDB 服务器 {{ $labels.instance }} 已宕机超过 5 分钟"
  • name:告警规则组名称
  • alert:告警名称
  • expr:告警规则表达式,基于 PromQL 编写
  • for:告警持续时间,超过该时间才会触发告警
  • labels:告警标签,用于告警分组和路由
  • annotations:告警注释,用于提供告警的详细信息

3. 常见告警规则

TiDB 服务器告警规则

yaml
groups:
- name: tidb-alerts
  rules:
  - alert: TiDBDown
    expr: up{job="tidb"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiDB 服务器宕机"
      description: "TiDB 服务器 {{ $labels.instance }} 已宕机超过 5 分钟"

  - alert: TiDBTooManyConnections
    expr: tidb_server_connections{job="tidb"} / tidb_server_max_connections{job="tidb"} > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB 连接数过高"
      description: "TiDB 服务器 {{ $labels.instance }} 连接数使用率超过 80%,当前连接数 {{ $value }}"

  - alert: TiDBSlowQuery
    expr: increase(tidb_server_slow_queries_total{job="tidb"}[5m]) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB 慢查询过多"
      description: "TiDB 服务器 {{ $labels.instance }} 过去 5 分钟慢查询数超过 10 个,当前值 {{ $value }}"

  - alert: TiDBMemoryUsageHigh
    expr: tidb_server_memory_usage_bytes{job="tidb"} / tidb_server_memory_limit_bytes{job="tidb"} > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB 内存使用率过高"
      description: "TiDB 服务器 {{ $labels.instance }} 内存使用率超过 80%,当前使用率 {{ $value | humanizePercentage }}"

TiKV 服务器告警规则

yaml
groups:
- name: tikv-alerts
  rules:
  - alert: TiKVDown
    expr: up{job="tikv"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiKV 服务器宕机"
      description: "TiKV 服务器 {{ $labels.instance }} 已宕机超过 5 分钟"

  - alert: TiKVUnavailableRegions
    expr: tikv_region_status_peer_state{state="Unavailable", job="tikv"} > 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiKV 不可用 Region 数量过多"
      description: "TiKV 服务器 {{ $labels.instance }} 不可用 Region 数量为 {{ $value }}"

  - alert: TiKVHighCPUUsage
    expr: sum(rate(process_cpu_seconds_total{job="tikv"}[5m])) by (instance) / sum(machine_cpu_cores{job="tikv"}) by (instance) > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiKV CPU 使用率过高"
      description: "TiKV 服务器 {{ $labels.instance }} CPU 使用率超过 80%,当前使用率 {{ $value | humanizePercentage }}"

  - alert: TiKVHighMemoryUsage
    expr: tikv_memory_total_bytes{job="tikv"} / (machine_memory_bytes{job="tikv"} * 0.8) > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiKV 内存使用率过高"
      description: "TiKV 服务器 {{ $labels.instance }} 内存使用率超过 80%,当前使用率 {{ $value | humanizePercentage }}"

PD 服务器告警规则

yaml
groups:
- name: pd-alerts
  rules:
  - alert: PDDown
    expr: up{job="pd"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "PD 服务器宕机"
      description: "PD 服务器 {{ $labels.instance }} 已宕机超过 5 分钟"

  - alert: PDLeaderChange
    expr: changes(pd_server_is_leader{job="pd"}[10m]) > 3
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "PD  Leader 频繁切换"
      description: "PD 服务器 {{ $labels.instance }} 在过去 10 分钟内 Leader 切换次数超过 3 次"

  - alert: PDDegreeOfImbalance
    expr: pd_cluster_status_regions_count_imbalance{job="pd"} > 0.1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "PD Region 分布不均衡"
      description: "PD 集群 Region 分布不均衡度超过 10%,当前值 {{ $value }}"

Alertmanager 配置

1. Alertmanager 安装

TiDB 集群部署时,TiUP 会自动安装和配置 Alertmanager。如果需要手动安装 Alertmanager,可以参考以下步骤:

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

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

# 进入 Alertmanager 目录
cd alertmanager-0.25.0.linux-amd64

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

2. Alertmanager 配置文件

Alertmanager 的配置文件为 alertmanager.yml,主要包括全局配置、路由配置、接收器配置和抑制规则配置。

全局配置

yaml
global:
  resolve_timeout: 5m  # 告警解决超时时间
  smtp_smarthost: 'smtp.example.com:587'  # SMTP 服务器地址和端口
  smtp_from: 'alertmanager@example.com'  # 发件人邮箱
  smtp_auth_username: 'alertmanager'  # SMTP 用户名
  smtp_auth_password: 'password'  # SMTP 密码
  smtp_require_tls: true  # 是否启用 TLS

路由配置

yaml
route:
  group_by: ['alertname', 'cluster', 'service']  # 告警分组依据
  group_wait: 30s  # 告警分组等待时间
  group_interval: 5m  # 告警分组间隔时间
  repeat_interval: 1h  # 告警重复通知间隔时间
  receiver: 'email'  # 默认接收器
  routes:
  - match:
      severity: critical
    receiver: 'email-critical'  # 严重级别为 critical 的告警使用 email-critical 接收器
  - match:
      severity: warning
    receiver: 'email-warning'  # 严重级别为 warning 的告警使用 email-warning 接收器

接收器配置

yaml
receivers:
- name: 'email'
  email_configs:
  - to: 'alerts@example.com'  # 收件人邮箱
    send_resolved: true  # 是否发送告警解决通知

- name: 'email-critical'
  email_configs:
  - to: 'critical-alerts@example.com'  # 严重告警收件人邮箱
    send_resolved: true

- name: 'email-warning'
  email_configs:
  - to: 'warning-alerts@example.com'  # 警告告警收件人邮箱
    send_resolved: true

抑制规则配置

yaml
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'cluster', 'service']  # 当存在严重级别为 critical 的告警时,抑制同组的 warning 级别告警

3. 告警通知方式

Alertmanager 支持多种告警通知方式,包括:

  • Email:通过电子邮件发送告警通知
  • Slack:通过 Slack 发送告警通知
  • Webhook:通过 HTTP Webhook 发送告警通知
  • PagerDuty:通过 PagerDuty 发送告警通知
  • OpsGenie:通过 OpsGenie 发送告警通知

Slack 通知配置

yaml
receivers:
- name: 'slack'
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'  # Slack Webhook URL
    channel: '#alerts'  # Slack 频道
    send_resolved: true
    username: 'Alertmanager'  # 发送者用户名
    icon_emoji: ':warning:'  # 发送者图标
    title: '{{ template "slack.default.title" . }}'  # 告警标题模板
    text: '{{ template "slack.default.text" . }}'  # 告警内容模板

Webhook 通知配置

yaml
receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://example.com/webhook'  # Webhook URL
    send_resolved: true

Grafana 配置

1. Grafana 安装

TiDB 集群部署时,TiUP 会自动安装和配置 Grafana。如果需要手动安装 Grafana,可以参考以下步骤:

bash
# 下载 Grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise_10.0.3_amd64.deb

# 安装 Grafana
dpkg -i grafana-enterprise_10.0.3_amd64.deb

# 启动 Grafana
systemctl start grafana-server

# 设置 Grafana 开机自启
systemctl enable grafana-server

2. Grafana 数据源配置

Grafana 需要配置 Prometheus 作为数据源,才能展示 TiDB 集群的监控指标。

配置步骤

  1. 登录 Grafana 控制台(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
  2. 点击左侧导航栏的 "Configuration" -> "Data sources"
  3. 点击 "Add data source" 按钮
  4. 选择 "Prometheus" 作为数据源类型
  5. 在 "URL" 输入框中填写 Prometheus 服务器的地址(如:http://prometheus:9090
  6. 点击 "Save & Test" 按钮,验证数据源配置是否正确

3. Grafana 监控面板导入

TiDB 提供了默认的 Grafana 监控面板,位于 TiUP 部署目录下的 grafana-dashboards 目录中。这些面板包括:

  • TiDB:TiDB 服务器的监控面板
  • TiKV:TiKV 服务器的监控面板
  • PD:PD 服务器的监控面板
  • TiFlash:TiFlash 服务器的监控面板
  • Node:节点服务器的监控面板
  • Cluster:集群级别的监控面板

导入步骤

  1. 登录 Grafana 控制台
  2. 点击左侧导航栏的 "+" -> "Import"
  3. 点击 "Upload JSON file" 按钮,选择要导入的监控面板 JSON 文件
  4. 选择已配置的 Prometheus 数据源
  5. 点击 "Import" 按钮,完成监控面板导入

监控告警最佳实践

1. 合理设置告警阈值

根据 TiDB 集群的规模和业务需求,合理设置告警阈值。告警阈值过高会导致漏报,过低会导致误报。建议根据集群的历史监控数据,设置合适的告警阈值。

2. 告警分级管理

根据告警的严重程度,将告警分为不同级别,如 critical、warning 和 info。不同级别的告警可以配置不同的通知方式和处理流程。

  • critical:严重告警,需要立即处理,如集群节点宕机、不可用 Region 数量过多等
  • warning:警告告警,需要及时关注和处理,如 CPU 使用率过高、内存使用率过高等
  • info:信息告警,主要用于监控和分析,如慢查询数量增加等

3. 告警分组和抑制

通过配置告警分组和抑制规则,可以减少告警噪音,提高告警的可读性和可处理性。

  • 告警分组:将相关的告警分组在一起,如按集群、服务或告警名称分组
  • 告警抑制:当存在高级别告警时,抑制同组的低级别告警,避免重复通知

4. 定期检查和优化告警规则

定期检查和优化告警规则,删除无效或冗余的告警规则,调整不合理的告警阈值,确保告警规则的有效性和准确性。

5. 告警通知渠道多元化

配置多种告警通知渠道,如电子邮件、Slack、Webhook 等,确保告警信息能够及时送达相关人员。

6. 建立告警处理流程

建立清晰的告警处理流程,包括告警接收、告警确认、故障定位、故障处理和告警关闭等环节,确保告警能够得到及时有效的处理。

常见问题(FAQ)

Q1: 如何查看当前的告警状态?

A1: 可以通过以下方式查看当前的告警状态:

  • Prometheus 控制台的 "Alerts" 页面
  • Alertmanager 控制台的 "Alerts" 页面
  • Grafana 监控面板中的告警状态

Q2: 如何静默某个告警?

A2: 可以通过 Alertmanager 控制台的 "Silences" 页面创建静默规则,静默指定的告警。静默规则可以根据告警标签进行匹配,设置静默的开始时间和结束时间。

Q3: 如何测试告警通知是否正常?

A3: 可以通过以下方式测试告警通知是否正常:

  • 修改 Prometheus 告警规则,将阈值设置为一个容易触发的值,触发告警后检查是否收到通知
  • 使用 curl 命令模拟发送告警到 Alertmanager

Q4: 如何调整告警的重复通知间隔?

A4: 可以修改 Alertmanager 配置文件中的 repeat_interval 参数,调整告警的重复通知间隔。

Q5: 如何添加自定义告警规则?

A5: 可以在 Prometheus 告警规则文件中添加自定义告警规则,然后重启 Prometheus 使其生效。

Q6: 如何监控 TiDB 集群的慢查询?

A6: 可以通过以下方式监控 TiDB 集群的慢查询:

  • 在 Grafana 中查看 TiDB 监控面板的 "Slow Queries" 部分
  • 在 Prometheus 中查询 tidb_server_slow_queries_total 指标
  • 配置慢查询告警规则,当慢查询数量超过阈值时触发告警

Q7: 如何监控 TiDB 集群的磁盘空间?

A7: 可以通过以下方式监控 TiDB 集群的磁盘空间:

  • 在 Grafana 中查看 Node 监控面板的 "Disk Usage" 部分
  • 在 Prometheus 中查询 node_filesystem_avail_bytesnode_filesystem_size_bytes 指标
  • 配置磁盘空间告警规则,当磁盘使用率超过阈值时触发告警

Q8: 如何监控 TiDB 集群的网络流量?

A8: 可以通过以下方式监控 TiDB 集群的网络流量:

  • 在 Grafana 中查看 Node 监控面板的 "Network Traffic" 部分
  • 在 Prometheus 中查询 node_network_transmit_bytes_totalnode_network_receive_bytes_total 指标
  • 配置网络流量告警规则,当网络流量超过阈值时触发告警

Q9: 如何备份和恢复监控告警配置?

A9: 可以通过以下方式备份和恢复监控告警配置:

  • 备份 Prometheus 配置文件和告警规则文件
  • 备份 Alertmanager 配置文件
  • 备份 Grafana 监控面板 JSON 文件
  • 恢复时,将备份的配置文件和监控面板 JSON 文件复制到相应的目录中,然后重启相关服务

Q10: 如何升级监控告警组件?

A10: 可以通过以下方式升级监控告警组件:

  • 使用 TiUP 升级 TiDB 集群,包括监控告警组件
  • 手动下载新版本的监控告警组件,替换旧版本的二进制文件,然后重启服务

监控告警故障排查

1. Prometheus 无法采集指标

可能原因

  • 目标实例不可达
  • 目标实例的指标端口未开放
  • Prometheus 配置文件中的抓取目标配置错误
  • 防火墙规则限制

解决方法

  • 检查目标实例是否正常运行
  • 检查目标实例的指标端口是否开放
  • 检查 Prometheus 配置文件中的抓取目标配置是否正确
  • 检查防火墙规则,确保 Prometheus 能够访问目标实例的指标端口

2. Alertmanager 无法发送告警通知

可能原因

  • SMTP 服务器配置错误
  • Webhook URL 错误
  • Slack Webhook URL 错误
  • 网络连接问题

解决方法

  • 检查 Alertmanager 配置文件中的 SMTP、Webhook 或 Slack 配置是否正确
  • 检查网络连接,确保 Alertmanager 能够访问外部服务
  • 查看 Alertmanager 日志,找出具体的错误原因

3. Grafana 无法展示监控数据

可能原因

  • Prometheus 数据源配置错误
  • 监控面板 JSON 文件格式错误
  • Prometheus 中没有相应的监控指标

解决方法

  • 检查 Grafana 中的 Prometheus 数据源配置是否正确
  • 检查监控面板 JSON 文件格式是否正确
  • 检查 Prometheus 中是否存在相应的监控指标