外观
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.yml2. 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.yml2. 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: trueGrafana 配置
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-server2. Grafana 数据源配置
Grafana 需要配置 Prometheus 作为数据源,才能展示 TiDB 集群的监控指标。
配置步骤
- 登录 Grafana 控制台(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
- 点击左侧导航栏的 "Configuration" -> "Data sources"
- 点击 "Add data source" 按钮
- 选择 "Prometheus" 作为数据源类型
- 在 "URL" 输入框中填写 Prometheus 服务器的地址(如:http://prometheus:9090)
- 点击 "Save & Test" 按钮,验证数据源配置是否正确
3. Grafana 监控面板导入
TiDB 提供了默认的 Grafana 监控面板,位于 TiUP 部署目录下的 grafana-dashboards 目录中。这些面板包括:
- TiDB:TiDB 服务器的监控面板
- TiKV:TiKV 服务器的监控面板
- PD:PD 服务器的监控面板
- TiFlash:TiFlash 服务器的监控面板
- Node:节点服务器的监控面板
- Cluster:集群级别的监控面板
导入步骤
- 登录 Grafana 控制台
- 点击左侧导航栏的 "+" -> "Import"
- 点击 "Upload JSON file" 按钮,选择要导入的监控面板 JSON 文件
- 选择已配置的 Prometheus 数据源
- 点击 "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_bytes和node_filesystem_size_bytes指标 - 配置磁盘空间告警规则,当磁盘使用率超过阈值时触发告警
Q8: 如何监控 TiDB 集群的网络流量?
A8: 可以通过以下方式监控 TiDB 集群的网络流量:
- 在 Grafana 中查看 Node 监控面板的 "Network Traffic" 部分
- 在 Prometheus 中查询
node_network_transmit_bytes_total和node_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 中是否存在相应的监控指标
