Skip to content

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. 监控数据流向

  1. 各组件的监控指标通过 HTTP 暴露
  2. Prometheus 定期拉取这些指标
  3. 指标存储在 Prometheus 的时序数据库中
  4. Grafana 从 Prometheus 读取数据并展示
  5. 当指标超过告警阈值时,Prometheus 发送告警到 Alertmanager
  6. Alertmanager 处理告警并发送通知

监控指标选择

1. 核心指标

TiDB 核心指标

指标名称描述推荐告警阈值
tidb_server_query_totalTiDB 接收的查询总数-
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_countRegion 数量-
tikv_engine_size_bytes存储引擎大小-
tikv_raftstore_propose_wait_duration_secondsRaft propose 等待时间P99 > 0.1s
tikv_kv_read_latency_secondsKV 读取延迟P99 > 0.05s
tikv_kv_write_latency_secondsKV 写入延迟P99 > 0.1s

PD 核心指标

指标名称描述推荐告警阈值
pd_cluster_status集群状态不等于 1
pd_server_is_leader是否为 Leader-
pd_scheduler_operator_count调度操作数-
pd_region_health_scoreRegion 健康分数< 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 级告警处理

  1. 立即响应:接到告警后立即处理
  2. 快速定位:使用监控和日志快速定位问题
  3. 紧急修复:采取紧急措施恢复系统
  4. 通知相关人员:通知团队领导和相关业务人员
  5. 记录和复盘:记录问题和解决方案,进行复盘

Warning 级告警处理

  1. 尽快响应:在30分钟内响应
  2. 分析问题:分析告警原因,评估影响范围
  3. 计划修复:制定修复计划,安排合适的时间实施
  4. 监控跟进:持续监控,确保问题不会升级

Info 级告警处理

  1. 定期查看:定期查看信息性告警
  2. 趋势分析:分析告警趋势,识别潜在问题
  3. 优化调整:根据需要调整系统配置或告警规则

2. 告警处理流程

bash
# 推荐的告警处理流程
1. 接收告警 2. 告警确认 3. 问题定位 4. 问题修复 5. 验证恢复 6. 告警关闭 7. 记录复盘

3. 告警通知渠道

通知渠道适用场景优缺点
Email所有级别的告警优点:详细、可追溯;缺点:延迟较高
SMSCritical/Warning 告警优点:及时、可达性高;缺点:内容简洁
Webhook所有级别的告警优点:灵活、可集成;缺点:需要开发
ChatOps所有级别的告警优点:实时、可协作;缺点:可能被忽略
PagerDutyCritical 告警优点:专业、可靠;缺点:成本较高

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/data

3. 数据压缩

  • Prometheus 内置了数据压缩功能
  • 可以调整 storage.tsdb.retentionstorage.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: 可以通过以下方法避免告警风暴:

  1. 设置合理的告警分组和抑制规则
  2. 调整告警阈值和持续时间
  3. 使用告警聚合,将多个相关告警合并为一个
  4. 实施告警静默,在维护期间暂停告警
  5. 定期审查和优化告警规则

Q2: 如何选择合适的告警阈值?

A2: 选择告警阈值的建议:

  1. 基于历史数据进行分析,了解正常范围
  2. 考虑业务需求和 SLA 要求
  3. 从保守的阈值开始,逐步调整
  4. 参考行业最佳实践
  5. 结合实际运维经验

Q3: 如何监控 TiDB 集群的整体健康状态?

A3: 监控集群整体健康状态的方法:

  1. 使用 TiDB Dashboard 的集群概览页面
  2. 监控核心指标,如 PD 集群状态、Region 健康分数、TiKV 存储状态
  3. 配置集群级别的告警规则
  4. 定期运行健康检查脚本
  5. 结合业务指标进行综合评估

Q4: 如何处理大量的 Info 级告警?

A4: 处理大量 Info 级告警的建议:

  1. 减少 Info 级告警的数量,只保留有价值的
  2. 使用不同的通知渠道,将 Info 级告警与其他级别区分开
  3. 定期批量处理 Info 级告警
  4. 分析 Info 级告警的趋势,识别潜在问题
  5. 考虑使用告警聚合工具

Q5: 如何优化 Prometheus 的性能?

A5: 优化 Prometheus 性能的方法:

  1. 调整 scrape_interval,减少采样频率
  2. 使用 relabeling 过滤不必要的指标
  3. 增加 Prometheus 实例的资源配置
  4. 实现 Prometheus 高可用
  5. 考虑使用 Thanos 或 Cortex 进行水平扩展

Q6: 如何监控 TiDB 集群的网络性能?

A6: 监控网络性能的方法:

  1. 使用 Blackbox Exporter 监控网络连通性
  2. 监控组件间的通信延迟
  3. 监控网络带宽使用率
  4. 监控网络丢包率
  5. 配置网络相关的告警规则

Q7: 如何实现监控数据的长期存储?

A7: 实现长期存储的方法:

  1. 使用 Prometheus 的远程写入功能,将数据写入长期存储系统
  2. 考虑使用 Thanos、Cortex 或 InfluxDB 等解决方案
  3. 定期备份 Prometheus 数据
  4. 实现数据归档策略,将旧数据迁移到低成本存储

Q8: 如何集成监控系统与其他运维工具?

A8: 集成监控系统的方法:

  1. 使用 Webhook 将告警发送到工单系统
  2. 集成到 ChatOps 工具,如 Slack 或钉钉
  3. 与自动化运维工具集成,实现自动修复
  4. 与日志系统集成,便于问题定位
  5. 与性能分析工具集成,深入分析性能问题

Q9: 如何监控 TiDB 集群的备份状态?

A9: 监控备份状态的方法:

  1. 监控备份作业的执行状态
  2. 监控备份存储的使用情况
  3. 配置备份失败的告警规则
  4. 定期验证备份的完整性
  5. 监控备份恢复的成功率

Q10: 如何评估监控系统的有效性?

A10: 评估监控系统有效性的方法:

  1. 检查是否所有关键指标都被监控
  2. 分析告警的准确性和及时性
  3. 评估告警的处理效率
  4. 检查是否有漏报或误报
  5. 收集用户反馈,持续改进

Q11: 如何监控 TiDB 集群的安全性?

A11: 监控安全性的方法:

  1. 监控异常登录尝试
  2. 监控权限变更
  3. 监控加密连接状态
  4. 监控审计日志
  5. 配置安全相关的告警规则

Q12: 如何实现监控系统的自动化?

A12: 实现自动化的方法:

  1. 使用配置管理工具管理监控配置
  2. 实现监控规则的自动生成
  3. 实现告警的自动处理和修复
  4. 实现监控系统的自动扩展
  5. 实现监控数据的自动分析

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

A13: 监控容量的方法:

  1. 监控存储容量使用率
  2. 监控 Region 数量增长趋势
  3. 监控连接数和查询数增长趋势
  4. 进行容量预测,提前规划扩容
  5. 配置容量相关的告警规则

Q14: 如何选择合适的监控指标?

A14: 选择监控指标的建议:

  1. 基于业务需求和 SLA 要求
  2. 选择与系统性能和可用性相关的指标
  3. 选择可操作的指标,能够反映实际问题
  4. 避免选择过多的指标,只保留关键的
  5. 定期审查和优化指标

Q15: 如何处理监控系统的故障?

A15: 处理监控系统故障的方法:

  1. 建立监控系统的监控(元监控)
  2. 实现监控系统的高可用
  3. 定期备份监控配置和数据
  4. 建立监控系统的恢复计划
  5. 定期进行监控系统的故障演练