外观
TiDB 监控告警最佳实践
监控系统架构
1. 监控组件介绍
- Prometheus:负责收集和存储监控指标
- Grafana:负责可视化展示监控数据
- Alertmanager:负责处理和发送告警
- Pushgateway:负责接收短生命周期任务的指标
- Node Exporter:负责收集主机级别的指标
- Blackbox Exporter:负责监控网络端点的可用性
2. 监控架构设计
bash
# 推荐的监控架构
Prometheus (主) <---> Prometheus (备) # 高可用配置
|
|---> Grafana # 可视化
|---> Alertmanager # 告警处理
| |
| |---> Email/SMS/Webhook # 告警通知
|
|---> Node Exporter # 主机监控
|---> Blackbox Exporter # 网络监控
|---> TiDB/TiKV/PD Exporters # 组件监控3. 监控数据流向
- 各组件的监控指标通过 HTTP 暴露
- Prometheus 定期拉取这些指标
- 指标存储在 Prometheus 的时序数据库中
- Grafana 从 Prometheus 读取数据并展示
- 当指标超过告警阈值时,Prometheus 发送告警到 Alertmanager
- Alertmanager 处理告警并发送通知
监控指标选择
1. 核心指标
TiDB 核心指标
| 指标名称 | 描述 | 推荐告警阈值 |
|---|---|---|
tidb_server_query_total | TiDB 接收的查询总数 | - |
tidb_server_query_duration_seconds | 查询执行时间分布 | P95 > 1s |
tidb_session_total | 活跃会话数 | > 80% 最大连接数 |
tidb_txn_restarts_total | 事务重试次数 | 增长率 > 100%/min |
tidb_mem_usage_bytes | 内存使用量 | > 80% 内存总量 |
TiKV 核心指标
| 指标名称 | 描述 | 推荐告警阈值 |
|---|---|---|
tikv_store_region_count | Region 数量 | - |
tikv_engine_size_bytes | 存储引擎大小 | - |
tikv_raftstore_propose_wait_duration_seconds | Raft propose 等待时间 | P99 > 0.1s |
tikv_kv_read_latency_seconds | KV 读取延迟 | P99 > 0.05s |
tikv_kv_write_latency_seconds | KV 写入延迟 | P99 > 0.1s |
PD 核心指标
| 指标名称 | 描述 | 推荐告警阈值 |
|---|---|---|
pd_cluster_status | 集群状态 | 不等于 1 |
pd_server_is_leader | 是否为 Leader | - |
pd_scheduler_operator_count | 调度操作数 | - |
pd_region_health_score | Region 健康分数 | < 0.8 |
2. 关键业务指标
- 吞吐量:每秒处理的查询数或事务数
- 延迟:查询或事务的响应时间
- 错误率:失败查询或事务的比例
- 资源利用率:CPU、内存、磁盘 I/O、网络等
3. 监控指标最佳实践
- 选择与业务相关的指标
- 关注指标的变化趋势,而不仅仅是绝对值
- 设置合理的告警阈值,避免误报
- 定期审查和优化指标
告警规则配置
1. 告警规则设计原则
- 准确性:告警规则应该准确反映系统状态
- 及时性:告警应该在问题发生后及时触发
- 可操作性:告警应该提供足够的信息,方便运维人员处理
- 分级管理:根据问题的严重程度进行分级
- 避免噪声:减少误报和重复告警
2. 告警级别定义
| 级别 | 描述 | 响应时间要求 |
|---|---|---|
| Critical | 严重问题,可能导致系统不可用 | 立即响应(< 5分钟) |
| Warning | 警告问题,可能影响系统性能或稳定性 | 尽快响应(< 30分钟) |
| Info | 信息性提示,不影响系统运行 | 定期查看 |
3. 告警规则示例
yaml
# 示例 Prometheus 告警规则
groups:
- name: tidb-alerts
rules:
# TiDB 高CPU利用率告警
- alert: TiDBHighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{job="tidb", mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is above 80% for 5 minutes"
# TiDB 连接数过高告警
- alert: TiDBTooManyConnections
expr: tidb_server_session_total > 0.8 * tidb_server_max_connections
for: 5m
labels:
severity: warning
annotations:
summary: "Too many connections on {{ $labels.instance }}"
description: "Connection count is above 80% of max connections for 5 minutes"
# TiKV 存储容量不足告警
- alert: TiKVStorageAlmostFull
expr: (tikv_engine_size_bytes / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Storage almost full on {{ $labels.instance }}"
description: "Storage usage is above 80% for 5 minutes"
# PD 集群状态异常告警
- alert: PDClusterUnhealthy
expr: pd_cluster_status != 1
for: 1m
labels:
severity: critical
annotations:
summary: "PD cluster is unhealthy"
description: "PD cluster status is not healthy for 1 minute"4. 告警规则管理
bash
# 推荐的告警规则管理方式
1. 使用版本控制系统管理告警规则
2. 定期审查和更新告警规则
3. 在测试环境验证新的告警规则
4. 记录告警规则的变更历史
5. 建立告警规则的文档告警分级与处理流程
1. 告警分级处理
Critical 级告警处理
- 立即响应:接到告警后立即处理
- 快速定位:使用监控和日志快速定位问题
- 紧急修复:采取紧急措施恢复系统
- 通知相关人员:通知团队领导和相关业务人员
- 记录和复盘:记录问题和解决方案,进行复盘
Warning 级告警处理
- 尽快响应:在30分钟内响应
- 分析问题:分析告警原因,评估影响范围
- 计划修复:制定修复计划,安排合适的时间实施
- 监控跟进:持续监控,确保问题不会升级
Info 级告警处理
- 定期查看:定期查看信息性告警
- 趋势分析:分析告警趋势,识别潜在问题
- 优化调整:根据需要调整系统配置或告警规则
2. 告警处理流程
bash
# 推荐的告警处理流程
1. 接收告警 → 2. 告警确认 → 3. 问题定位 → 4. 问题修复 → 5. 验证恢复 → 6. 告警关闭 → 7. 记录复盘3. 告警通知渠道
| 通知渠道 | 适用场景 | 优缺点 |
|---|---|---|
| 所有级别的告警 | 优点:详细、可追溯;缺点:延迟较高 | |
| SMS | Critical/Warning 告警 | 优点:及时、可达性高;缺点:内容简洁 |
| Webhook | 所有级别的告警 | 优点:灵活、可集成;缺点:需要开发 |
| ChatOps | 所有级别的告警 | 优点:实时、可协作;缺点:可能被忽略 |
| PagerDuty | Critical 告警 | 优点:专业、可靠;缺点:成本较高 |
4. 告警抑制与聚合
yaml
# Alertmanager 配置示例 - 告警抑制
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s # 告警分组等待时间
group_interval: 5m # 告警分组间隔
repeat_interval: 4h # 重复告警间隔
receiver: 'email'
inhibit_rules:
# 当集群不可用时,抑制该集群的其他告警
- source_match:
alertname: 'ClusterUnavailable'
severity: 'critical'
target_match:
severity: 'warning'
equal: ['cluster']监控数据存储与管理
1. 数据保留策略
yaml
# Prometheus 数据保留配置
storage:
tsdb:
retention: 30d # 数据保留30天
retention_size: 100GB # 数据大小限制2. 数据备份
bash
# 备份 Prometheus 数据
cp -r /path/to/prometheus/data /path/to/backup/$(date +%Y%m%d)
# 恢复 Prometheus 数据
cp -r /path/to/backup/20230101 /path/to/prometheus/data3. 数据压缩
- Prometheus 内置了数据压缩功能
- 可以调整
storage.tsdb.retention和storage.tsdb.retention_size参数来控制数据量 - 对于长期存储,可以考虑使用 Thanos 或 Cortex 等解决方案
监控最佳实践
1. 监控系统高可用
bash
# Prometheus 高可用配置
# prometheus-primary.yaml
global:
scrape_interval: 15s
rule_files:
- "alerts/*.yaml"
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
scrape_configs:
- job_name: "tidb"
static_configs:
- targets: ["tidb:10080"]
# prometheus-secondary.yaml
# 与 primary 配置相同,但添加远程写入到 primary
remote_write:
- url: "http://prometheus-primary:9090/api/v1/write"2. 监控仪表盘设计
- 核心仪表盘:展示关键指标,如吞吐量、延迟、资源利用率
- 组件仪表盘:针对每个组件的详细监控
- 业务仪表盘:展示与业务相关的指标
- 告警仪表盘:展示当前告警状态
3. 监控系统性能优化
- 调整采样间隔:根据监控需求调整 scrape_interval
- 减少指标基数:避免生成过多的时间序列
- 使用 relabeling:过滤不必要的指标
- 水平扩展:当单个 Prometheus 实例无法处理时,考虑分片
4. 监控与告警的持续改进
- 定期审查:每周或每月审查监控指标和告警规则
- 告警分析:分析告警的准确性和有效性
- 优化调整:根据实际情况调整监控指标和告警规则
- 自动化:尽可能实现监控和告警的自动化
常见问题(FAQ)
Q1: 如何避免告警风暴?
A1: 可以通过以下方法避免告警风暴:
- 设置合理的告警分组和抑制规则
- 调整告警阈值和持续时间
- 使用告警聚合,将多个相关告警合并为一个
- 实施告警静默,在维护期间暂停告警
- 定期审查和优化告警规则
Q2: 如何选择合适的告警阈值?
A2: 选择告警阈值的建议:
- 基于历史数据进行分析,了解正常范围
- 考虑业务需求和 SLA 要求
- 从保守的阈值开始,逐步调整
- 参考行业最佳实践
- 结合实际运维经验
Q3: 如何监控 TiDB 集群的整体健康状态?
A3: 监控集群整体健康状态的方法:
- 使用 TiDB Dashboard 的集群概览页面
- 监控核心指标,如 PD 集群状态、Region 健康分数、TiKV 存储状态
- 配置集群级别的告警规则
- 定期运行健康检查脚本
- 结合业务指标进行综合评估
Q4: 如何处理大量的 Info 级告警?
A4: 处理大量 Info 级告警的建议:
- 减少 Info 级告警的数量,只保留有价值的
- 使用不同的通知渠道,将 Info 级告警与其他级别区分开
- 定期批量处理 Info 级告警
- 分析 Info 级告警的趋势,识别潜在问题
- 考虑使用告警聚合工具
Q5: 如何优化 Prometheus 的性能?
A5: 优化 Prometheus 性能的方法:
- 调整 scrape_interval,减少采样频率
- 使用 relabeling 过滤不必要的指标
- 增加 Prometheus 实例的资源配置
- 实现 Prometheus 高可用
- 考虑使用 Thanos 或 Cortex 进行水平扩展
Q6: 如何监控 TiDB 集群的网络性能?
A6: 监控网络性能的方法:
- 使用 Blackbox Exporter 监控网络连通性
- 监控组件间的通信延迟
- 监控网络带宽使用率
- 监控网络丢包率
- 配置网络相关的告警规则
Q7: 如何实现监控数据的长期存储?
A7: 实现长期存储的方法:
- 使用 Prometheus 的远程写入功能,将数据写入长期存储系统
- 考虑使用 Thanos、Cortex 或 InfluxDB 等解决方案
- 定期备份 Prometheus 数据
- 实现数据归档策略,将旧数据迁移到低成本存储
Q8: 如何集成监控系统与其他运维工具?
A8: 集成监控系统的方法:
- 使用 Webhook 将告警发送到工单系统
- 集成到 ChatOps 工具,如 Slack 或钉钉
- 与自动化运维工具集成,实现自动修复
- 与日志系统集成,便于问题定位
- 与性能分析工具集成,深入分析性能问题
Q9: 如何监控 TiDB 集群的备份状态?
A9: 监控备份状态的方法:
- 监控备份作业的执行状态
- 监控备份存储的使用情况
- 配置备份失败的告警规则
- 定期验证备份的完整性
- 监控备份恢复的成功率
Q10: 如何评估监控系统的有效性?
A10: 评估监控系统有效性的方法:
- 检查是否所有关键指标都被监控
- 分析告警的准确性和及时性
- 评估告警的处理效率
- 检查是否有漏报或误报
- 收集用户反馈,持续改进
Q11: 如何监控 TiDB 集群的安全性?
A11: 监控安全性的方法:
- 监控异常登录尝试
- 监控权限变更
- 监控加密连接状态
- 监控审计日志
- 配置安全相关的告警规则
Q12: 如何实现监控系统的自动化?
A12: 实现自动化的方法:
- 使用配置管理工具管理监控配置
- 实现监控规则的自动生成
- 实现告警的自动处理和修复
- 实现监控系统的自动扩展
- 实现监控数据的自动分析
Q13: 如何监控 TiDB 集群的容量?
A13: 监控容量的方法:
- 监控存储容量使用率
- 监控 Region 数量增长趋势
- 监控连接数和查询数增长趋势
- 进行容量预测,提前规划扩容
- 配置容量相关的告警规则
Q14: 如何选择合适的监控指标?
A14: 选择监控指标的建议:
- 基于业务需求和 SLA 要求
- 选择与系统性能和可用性相关的指标
- 选择可操作的指标,能够反映实际问题
- 避免选择过多的指标,只保留关键的
- 定期审查和优化指标
Q15: 如何处理监控系统的故障?
A15: 处理监控系统故障的方法:
- 建立监控系统的监控(元监控)
- 实现监控系统的高可用
- 定期备份监控配置和数据
- 建立监控系统的恢复计划
- 定期进行监控系统的故障演练
