外观
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_connections | Gauge | TiDB 当前连接数 | 超过最大连接数的 80% |
tidb_server_connection_error_total | Counter | TiDB 连接错误总数 | 每分钟增加超过 10 个 |
tidb_server_aborted_clients_total | Counter | 被终止的客户端连接数 | 每分钟增加超过 10 个 |
查询性能指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
tidb_server_qps | Gauge | TiDB 每秒查询数 | 根据业务需求调整 |
tidb_server_tps | Gauge | TiDB 每秒事务数 | 根据业务需求调整 |
tidb_server_query_duration_seconds | Histogram | 查询执行时间分布 | P95 超过 1 秒 |
tidb_server_slow_queries_total | Counter | 慢查询总数 | 每分钟增加超过 5 个 |
内存和 CPU 指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
tidb_server_memory_usage_bytes | Gauge | TiDB 内存使用量 | 超过总内存的 80% |
process_cpu_seconds_total | Counter | TiDB CPU 使用时间 | CPU 使用率超过 80% |
2. TiKV 服务器指标
存储指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
tikv_engine_size_bytes | Gauge | TiKV 存储引擎大小 | 根据磁盘容量调整 |
tikv_engine_write_bytes_total | Counter | TiKV 写入字节总数 | 根据业务需求调整 |
tikv_engine_read_bytes_total | Counter | TiKV 读取字节总数 | 根据业务需求调整 |
tikv_engine_sst_files | Gauge | TiKV SST 文件数量 | 超过 1000 个 |
性能指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
tikv_server_thread_cpu_seconds_total | Counter | TiKV 线程 CPU 使用时间 | CPU 使用率超过 80% |
tikv_server_thread_io_wait_seconds_total | Counter | TiKV 线程 IO 等待时间 | IO 等待时间超过 CPU 时间的 50% |
tikv_raftstore_propose_wait_duration_seconds | Histogram | Raft 提案等待时间 | P95 超过 100ms |
tikv_raftstore_apply_wait_duration_seconds | Histogram | Raft 应用等待时间 | P95 超过 100ms |
Region 指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
tikv_raftstore_region_count | Gauge | TiKV 节点上的 Region 数量 | 超过 10000 个 |
tikv_raftstore_region_leader_count | Gauge | TiKV 节点上的 Region Leader 数量 | 超过 Region 总数的 40% |
tikv_raftstore_pending_snapshots | Gauge | 待处理的快照数量 | 超过 10 个 |
3. PD 服务器指标
集群状态指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
pd_cluster_status | Gauge | PD 集群状态,1 表示正常,0 表示异常 | 等于 0 |
pd_cluster_region_count | Gauge | 集群中 Region 的总数量 | 根据集群规模调整 |
pd_cluster_store_count | Gauge | 集群中 TiKV 节点的数量 | 小于预期数量 |
调度指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
pd_scheduler_operator_create_total | Counter | 创建的调度操作总数 | 根据集群规模调整 |
pd_scheduler_operator_finish_total | Counter | 完成的调度操作总数 | 远小于创建的调度操作数 |
pd_scheduler_operator_failed_total | Counter | 失败的调度操作总数 | 每分钟增加超过 10 个 |
4. 主机指标
CPU 和内存指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
node_cpu_seconds_total | Counter | 主机 CPU 使用时间 | CPU 使用率超过 80% |
node_memory_MemTotal_bytes | Gauge | 主机总内存 | - |
node_memory_MemAvailable_bytes | Gauge | 主机可用内存 | 可用内存不足总内存的 20% |
node_memory_SwapFree_bytes | Gauge | 主机可用 swap 空间 | 可用 swap 空间不足总 swap 的 20% |
磁盘指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
node_filesystem_size_bytes | Gauge | 文件系统总大小 | - |
node_filesystem_avail_bytes | Gauge | 文件系统可用空间 | 可用空间不足总大小的 20% |
node_disk_read_bytes_total | Counter | 磁盘读取字节总数 | 根据磁盘性能调整 |
node_disk_written_bytes_total | Counter | 磁盘写入字节总数 | 根据磁盘性能调整 |
node_disk_io_time_seconds_total | Counter | 磁盘 IO 时间 | 磁盘 IO 使用率超过 80% |
网络指标
| 指标名称 | 指标类型 | 描述 | 告警阈值 |
|---|---|---|---|
node_network_receive_bytes_total | Counter | 网络接收字节总数 | 根据网络带宽调整 |
node_network_transmit_bytes_total | Counter | 网络发送字节总数 | 根据网络带宽调整 |
node_network_receive_errs_total | Counter | 网络接收错误总数 | 每分钟增加超过 10 个 |
node_network_transmit_errs_total | Counter | 网络发送错误总数 | 每分钟增加超过 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.yml2. 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-server2. 配置 Prometheus 数据源
- 登录 Grafana 管理界面(默认地址:http://localhost:3000,默认用户名/密码:admin/admin)
- 点击左侧菜单的 "Configuration" → "Data Sources"
- 点击 "Add data source"
- 选择 "Prometheus"
- 在 "HTTP" 部分,设置 URL 为 Prometheus 服务器地址(如 http://localhost:9090)
- 点击 "Save & Test",验证数据源是否配置成功
3. 导入 TiDB 监控面板
TiDB 提供了官方的 Grafana 监控面板,可以直接导入使用:
- 点击左侧菜单的 "Create" → "Import"
- 输入 TiDB 监控面板 ID(如 12900 用于 TiDB 集群监控)
- 选择已配置的 Prometheus 数据源
- 点击 "Import",导入监控面板
4. 自定义监控面板
除了使用官方提供的监控面板,还可以根据业务需求自定义监控面板:
- 点击左侧菜单的 "Create" → "Dashboard"
- 点击 "Add a new panel"
- 在 "Query" 标签页,选择 Prometheus 数据源,输入查询语句
- 在 "Visualization" 标签页,选择合适的图表类型
- 在 "General" 标签页,设置面板标题和描述
- 点击 "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.ymlAlertmanager 配置文件
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. 告警处理流程
- 告警触发:当监控指标超过阈值时,Prometheus 触发告警
- 告警分组:Alertmanager 将相关告警分组
- 告警通知:Alertmanager 通过配置的方式发送告警通知
- 告警确认:运维人员确认收到告警
- 问题排查:运维人员根据告警信息排查问题
- 问题解决:解决排查出的问题
- 告警恢复:当监控指标恢复正常时,Prometheus 发送告警恢复通知
- 告警关闭:运维人员确认问题已解决,关闭告警
监控最佳实践
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 监控告警的步骤如下:
- 在 Prometheus 中配置告警规则
- 安装和配置 Alertmanager
- 在 Alertmanager 中配置告警通知方式
- 测试告警是否正常工作
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 服务发现监控目标
