Skip to content

TiDB 容量监控

关键容量指标

存储容量指标

TiKV 存储容量

指标名描述单位告警阈值建议
tikv_store_size_bytesTiKV 存储总容量字节使用率 > 80% 警告,> 90% 严重
tikv_store_available_bytesTiKV 可用存储容量字节剩余空间 `< 20% 警告,< 10% 严重
tikv_store_utilizationTiKV 存储使用率%>` 80% 警告,> 90% 严重
tikv_region_countTiKV 节点上的 Region 数量> 100000 警告,> 200000 严重
tikv_region_size_bytesRegion 平均大小字节< 64MB 或 > 192MB 警告

TiFlash 存储容量

指标名描述单位告警阈值建议
tiflash_storage_size_bytesTiFlash 存储总容量字节使用率 > 80% 警告,> 90% 严重
tiflash_storage_available_bytesTiFlash 可用存储容量字节剩余空间 `< 20% 警告,< 10% 严重
tiflash_storage_utilizationTiFlash 存储使用率%>` 80% 警告,> 90% 严重
tiflash_segment_countTiFlash 段数量根据实际情况调整

PD 存储容量

指标名描述单位告警阈值建议
pd_storage_size_bytesPD 存储总容量字节使用率 > 80% 警告,> 90% 严重
pd_storage_available_bytesPD 可用存储容量字节剩余空间 `< 20% 警告,< 10% 严重

计算资源指标

CPU 使用率

指标名描述单位告警阈值建议
process_cpu_seconds_totalCPU 总使用时间使用率 >` 80% 警告,> 95% 严重
tikv_thread_cpu_seconds_totalTiKV 线程 CPU 使用率单个线程使用率 > 90% 警告
tidb_server_cpu_seconds_totalTiDB Server CPU 使用率使用率 > 80% 警告,> 95% 严重

内存使用率

指标名描述单位告警阈值建议
process_resident_memory_bytes进程内存使用量字节使用率 > 80% 警告,> 90% 严重
tikv_memory_usage_bytesTiKV 内存使用量字节使用率 > 80% 警告,> 90% 严重
tidb_server_memory_bytesTiDB Server 内存使用量字节使用率 > 80% 警告,> 90% 严重

磁盘 I/O 指标

指标名描述单位告警阈值建议
disk_read_bytes_total磁盘读取字节数字节根据磁盘性能调整
disk_write_bytes_total磁盘写入字节数字节根据磁盘性能调整
disk_read_iops磁盘读取 IOPS次/秒根据磁盘性能调整
disk_write_iops磁盘写入 IOPS次/秒根据磁盘性能调整
disk_io_time_seconds_total磁盘 I/O 耗时使用率 > 80% 警告,> 90% 严重

网络容量指标

指标名描述单位告警阈值建议
network_receive_bytes_total网络接收字节数字节根据网络带宽调整
network_transmit_bytes_total网络发送字节数字节根据网络带宽调整
network_receive_packets_dropped_total网络接收丢包数> 0 警告
network_transmit_packets_dropped_total网络发送丢包数> 0 警告
tikv_grpc_message_sent_bytes_totalTiKV gRPC 发送字节数字节根据实际情况调整
tikv_grpc_message_received_bytes_totalTiKV gRPC 接收字节数字节根据实际情况调整

集群规模指标

指标名描述单位告警阈值建议
tidb_cluster_total_region_count集群总 Region 数量根据集群规模调整
tidb_server_connection_countTiDB Server 连接数> 最大连接数的 80% 警告
tikv_store_countTiKV 存储节点数量根据集群规模调整
tidb_server_countTiDB Server 节点数量根据集群规模调整
pd_server_countPD Server 节点数量< 3 警告(生产环境)

容量监控工具

Prometheus + Grafana

Prometheus 和 Grafana 是 TiDB 官方推荐的监控解决方案,可以监控 TiDB 集群的各种指标,包括容量指标。

配置 Prometheus

  1. 确保 Prometheus 已正确配置 TiDB 集群的数据源
  2. 配置 Prometheus 抓取 TiDB、TiKV、PD 等组件的指标
  3. 设置合理的抓取间隔和数据保留时间

示例 Prometheus 配置

yaml
scrape_configs:
  - job_name: 'tidb'
    static_configs:
      - targets: ['10.0.0.1:10080', '10.0.0.2:10080']
    scrape_interval: 15s
  
  - job_name: 'tikv'
    static_configs:
      - targets: ['10.0.0.3:20180', '10.0.0.4:20180', '10.0.0.5:20180']
    scrape_interval: 15s
  
  - job_name: 'pd'
    static_configs:
      - targets: ['10.0.0.6:2379', '10.0.0.7:2379', '10.0.0.8:2379']
    scrape_interval: 15s

使用 Grafana 监控容量

  1. 导入 TiDB 官方提供的 Grafana 仪表盘
  2. 关注容量相关的面板,如:
    • TiKV 存储容量使用情况
    • TiFlash 存储容量使用情况
    • 集群 Region 数量趋势
    • 计算资源使用率
    • 网络带宽使用情况

推荐的 Grafana 仪表盘

  • TiDB-Overview:集群概览,包含容量相关指标
  • TiKV-Details:TiKV 详细指标,包含存储容量
  • TiFlash-Details:TiFlash 详细指标,包含存储容量
  • PD-Details:PD 详细指标,包含集群规模

TiDB Dashboard

TiDB Dashboard 提供了可视化的容量监控功能,包括:

集群信息

  • 显示集群的节点数量、Region 数量等基本信息
  • 展示集群的拓扑结构
  • 显示各组件的版本信息

存储容量监控

  • 展示各 TiKV 节点的存储使用情况
  • 显示存储容量的变化趋势
  • 提供存储容量的详细统计

性能监控

  • 显示 CPU、内存、磁盘 I/O 等资源的使用情况
  • 展示网络带宽的使用情况
  • 提供资源使用的历史趋势

访问 TiDB Dashboard

通过浏览器访问 TiDB Dashboard:

http://<tidb-ip>:2379/dashboard

tiup cluster display

使用 tiup cluster display 命令查看集群的基本信息和状态:

bash
tiup cluster display <cluster-name>

输出示例

Starting /home/tidb/.tiup/components/cluster/v1.13.1/cluster display <cluster-name>
TiDB Cluster: <cluster-name>
TiDB Version: v7.1.0
Deploy user: root
SSH type: builtin
Dashboard URL: http://10.0.0.6:2379/dashboard
Grafana URL: http://10.0.0.9:3000
ID                  Role          Host          Ports        Status    Data Dir                           Deploy Dir
--                  ----          ----          -----        ------    --------                           ----------
10.0.0.1:9090       prometheus    10.0.0.1      9090/9093    Up        /tidb-data/prometheus-9090          /tidb-deploy/prometheus-9090
10.0.0.1:3000       grafana       10.0.0.1      3000         Up        -                                  /tidb-deploy/grafana-3000
10.0.0.6:2379       pd            10.0.0.6      2379/2380    Up|L|UI   /tidb-data/pd-2379                 /tidb-deploy/pd-2379
10.0.0.7:2379       pd            10.0.0.7      2379/2380    Up        /tidb-data/pd-2379                 /tidb-deploy/pd-2379
10.0.0.8:2379       pd            10.0.0.8      2379/2380    Up        /tidb-data/pd-2379                 /tidb-deploy/pd-2379
10.0.0.3:4000       tidb          10.0.0.3      4000/10080   Up        -                                  /tidb-deploy/tidb-4000
10.0.0.4:4000       tidb          10.0.0.4      4000/10080   Up        -                                  /tidb-deploy/tidb-4000
10.0.0.5:4000       tidb          10.0.0.5      4000/10080   Up        -                                  /tidb-deploy/tidb-4000
10.0.0.9:20160      tikv          10.0.0.9      20160/20180   Up        /tidb-data/tikv-20160              /tidb-deploy/tikv-20160
10.0.0.10:20160     tikv          10.0.0.10     20160/20180   Up        /tidb-data/tikv-20160              /tidb-deploy/tikv-20160
10.0.0.11:20160     tikv          10.0.0.11     20160/20180   Up        /tidb-data/tikv-20160              /tidb-deploy/tikv-20160

自定义监控脚本

可以编写自定义脚本监控 TiDB 集群的容量情况,例如:

监控存储容量的脚本

bash
#!/bin/bash

# 监控 TiKV 存储容量
for tikv_ip in 10.0.0.9 10.0.0.10 10.0.0.11; do
    store_size=$(curl -s http://${tikv_ip}:20180/metrics | grep tikv_store_size_bytes | awk '{print $2}')
    available_size=$(curl -s http://${tikv_ip}:20180/metrics | grep tikv_store_available_bytes | awk '{print $2}')
    utilization=$(echo "scale=2; (${store_size} - ${available_size}) / ${store_size} * 100" | bc)
    echo "TiKV ${tikv_ip} storage utilization: ${utilization}%"
done

监控集群规模的脚本

bash
#!/bin/bash

# 监控集群 Region 数量
region_count=$(curl -s http://10.0.0.6:2379/pd/api/v1/regions/count)
echo "Cluster region count: ${region_count}"

# 监控 TiDB 连接数
tidb_connections=$(curl -s http://10.0.0.3:10080/metrics | grep tidb_server_connection_count | awk '{print $2}')
echo "TiDB connections: ${tidb_connections}"

容量预测方法

基于历史数据的预测

使用历史容量数据预测未来的容量需求,常用的方法包括:

线性回归

假设容量增长是线性的,根据历史数据拟合线性模型,预测未来的容量需求。

指数平滑

考虑时间序列的趋势和季节性,使用指数平滑方法预测未来的容量需求。

机器学习方法

使用机器学习算法(如 ARIMA、LSTM 等)分析历史数据,预测未来的容量需求。

基于业务增长的预测

根据业务增长情况预测容量需求:

  • 了解业务的用户增长趋势
  • 分析业务的数据增长速度
  • 考虑新功能对容量的影响
  • 结合市场预测和业务规划

容量预测工具

Prometheus 表达式

使用 Prometheus 表达式进行简单的容量预测:

# 预测 TiKV 存储容量在 30 天后的使用情况
tikv_store_size_bytes + (rate(tikv_store_size_bytes[7d]) * 30 * 24 * 3600)

Grafana 预测功能

Grafana 提供了预测功能,可以基于历史数据预测未来的容量需求:

  1. 在 Grafana 面板中编辑图表
  2. 开启 "Predictions" 功能
  3. 设置预测参数,如预测时间范围、置信区间等
  4. 查看预测结果

第三方工具

  • InfluxDB Kapacitor:支持时间序列预测
  • Elasticsearch ML:提供机器学习预测功能
  • Prophet:Facebook 开源的时间序列预测工具

容量告警配置

告警规则设置

Prometheus 告警规则

在 Prometheus 中配置容量告警规则:

示例告警规则文件

yaml
groups:
- name: tidb-capacity-alerts
  rules:
  # TiKV 存储容量告警
  - alert: TiKVStorageUtilizationHigh
    expr: (tikv_store_size_bytes - tikv_store_available_bytes) / tikv_store_size_bytes > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiKV storage utilization is high"
      description: "TiKV instance {{ $labels.instance }} has high storage utilization ({{ $value | humanizePercentage }})"
  
  - alert: TiKVStorageUtilizationCritical
    expr: (tikv_store_size_bytes - tikv_store_available_bytes) / tikv_store_size_bytes > 0.9
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "TiKV storage utilization is critical"
      description: "TiKV instance {{ $labels.instance }} has critical storage utilization ({{ $value | humanizePercentage }})"
  
  # TiDB 连接数告警
  - alert: TiDBConnectionCountHigh
    expr: tidb_server_connection_count > 0.8 * tidb_server_max_connections
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "TiDB connection count is high"
      description: "TiDB instance {{ $labels.instance }} has high connection count ({{ $value }}/{{ $value | withMetric "tidb_server_max_connections" }})"
  
  # 集群 Region 数量告警
  - alert: ClusterRegionCountHigh
    expr: sum(tikv_region_count) > 100000
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Cluster region count is high"
      description: "Cluster has high region count ({{ $value }})"

告警级别划分

根据告警的严重程度划分告警级别:

级别描述处理时间要求
严重(critical)容量即将耗尽,可能导致业务中断立即处理(30 分钟内)
警告(warning)容量使用超过阈值,需要关注24 小时内处理
信息(info)容量使用正常,但需要监控定期关注

告警通知方式

配置多种告警通知方式,确保告警能够及时送达:

  • 邮件通知:发送告警邮件给相关人员
  • 短信通知:发送告警短信给相关人员
  • 即时通讯工具:通过 Slack、钉钉、企业微信等发送告警
  • 电话通知:对于严重告警,触发电话通知
  • 告警平台集成:集成到企业的告警平台

容量优化策略

存储优化

数据压缩

  • 启用 TiKV 的数据压缩功能
  • 选择合适的压缩算法(如 zstd、snappy 等)
  • 根据数据类型调整压缩级别

配置示例

yaml
tikv_servers:
  - host: 10.0.0.9
    config:
      storage:
        block-cache:
          capacity: "4GB"
        compressor:
          default: "zstd"
          level: 3

数据清理

  • 定期清理过期数据
  • 归档历史数据
  • 删除无用的数据表和索引

分区表优化

  • 使用分区表存储时间序列数据
  • 定期删除旧分区
  • 优化分区策略

计算资源优化

资源隔离

  • 使用 TiDB 的资源组功能隔离不同业务的资源
  • 为关键业务分配更多资源
  • 限制非关键业务的资源使用

配置示例

sql
-- 创建资源组
CREATE RESOURCE GROUP critical_business WITH RU_PER_SEC = 10000;
CREATE RESOURCE GROUP normal_business WITH RU_PER_SEC = 5000;

-- 将用户分配到资源组
ALTER USER 'critical_user'@'%' RESOURCE GROUP critical_business;
ALTER USER 'normal_user'@'%' RESOURCE GROUP normal_business;

查询优化

  • 优化慢查询,减少资源消耗
  • 合理使用索引,提高查询效率
  • 避免全表扫描和大表连接

连接池优化

  • 配置合适的连接池大小
  • 减少不必要的数据库连接
  • 及时关闭空闲连接

网络优化

网络拓扑优化

  • 优化集群的网络拓扑
  • 确保节点之间的网络延迟较低
  • 使用高速网络设备

流量控制

  • 限制单个查询的网络流量
  • 优化数据传输方式
  • 使用压缩传输

集群规模优化

水平扩展

  • 根据容量需求添加新节点
  • 平衡集群的负载
  • 扩展 TiKV、TiDB、PD 等组件

垂直扩展

  • 升级节点的硬件配置
  • 增加 CPU、内存、磁盘等资源
  • 优化硬件配置

Region 合并

  • 合并过小的 Region,减少集群的 Region 数量
  • 调整 Region 分裂阈值
  • 优化 PD 调度策略

配置示例

yaml
pd_servers:
  - host: 10.0.0.6
    config:
      replication:
        split-size: "64MB"
      schedule:
        max-merge-region-size: "20MB"
        max-merge-region-keys: 200000

容量监控最佳实践

监控频率设置

  • 实时监控:对于关键指标(如存储容量、CPU 使用率),监控频率设置为 15-30 秒
  • 定期监控:对于非关键指标,监控频率设置为 5-15 分钟
  • 历史数据:保留足够的历史数据,便于趋势分析和容量预测

数据保留策略

  • 短期数据:最近 7 天的数据,保留原始采样频率
  • 中期数据:最近 30 天的数据,降低采样频率
  • 长期数据:超过 30 天的数据,进一步降低采样频率或汇总存储

定期容量评估

  • 每日评估:查看当日的容量使用情况,处理告警
  • 每周评估:分析周容量变化趋势,调整告警规则
  • 每月评估:进行全面的容量评估,制定容量规划
  • 季度评估:结合业务规划,制定长期容量规划

容量规划流程

  1. 收集数据:收集当前的容量使用数据
  2. 分析趋势:分析容量的变化趋势
  3. 预测需求:预测未来的容量需求
  4. 制定计划:制定容量扩展或优化计划
  5. 执行计划:执行容量扩展或优化操作
  6. 验证效果:验证容量扩展或优化的效果
  7. 调整计划:根据实际情况调整容量规划

文档化容量监控

  • 记录容量监控的配置和规则
  • 记录容量评估的结果和结论
  • 记录容量扩展和优化的操作
  • 建立容量监控的知识库

常见问题(FAQ)

Q1: 如何确定 TiKV 存储容量的告警阈值?

A1: 告警阈值的设置应考虑以下因素:

  • 磁盘的实际容量
  • 数据增长速度
  • 扩容所需的时间
  • 业务的重要程度

建议设置两级告警:

  • 警告阈值:80%,用于提醒关注容量变化
  • 严重阈值:90%,需要立即处理

Q2: 如何监控 TiFlash 的容量?

A2: 可以通过以下方式监控 TiFlash 容量:

  • 使用 Prometheus 监控 tiflash_storage_size_bytes 指标
  • 通过 TiDB Dashboard 查看 TiFlash 容量
  • 使用 tiup cluster display 命令查看 TiFlash 节点状态

Q3: 如何预测集群的容量需求?

A3: 容量预测可以结合以下方法:

  • 基于历史数据的趋势分析
  • 基于业务增长的预测
  • 使用机器学习方法进行预测
  • 结合市场预测和业务规划

Q4: 如何处理 TiKV 存储容量不足的问题?

A4: 处理 TiKV 存储容量不足的步骤:

  1. 确认存储容量告警的准确性
  2. 分析存储容量增长的原因
  3. 考虑数据清理和归档
  4. 进行 TiKV 节点扩容
  5. 调整告警阈值(如果需要)

Q5: 如何优化集群的 Region 数量?

A5: 优化 Region 数量的方法:

  • 调整 Region 分裂阈值,增加单个 Region 的大小
  • 合并过小的 Region
  • 优化 PD 调度策略,减少 Region 数量
  • 考虑使用 TiDB 4.0+ 的 Region 合并功能

Q6: 如何监控 TiDB 的连接数?

A6: 可以通过以下方式监控 TiDB 连接数:

  • 监控 tidb_server_connection_count 指标
  • 通过 TiDB Dashboard 查看连接数
  • 使用 SHOW PROCESSLIST 命令查看当前连接

Q7: 如何设置合理的容量告警通知方式?

A7: 建议设置多种告警通知方式:

  • 邮件通知:用于所有告警
  • 即时通讯工具:用于警告和严重告警
  • 电话通知:仅用于严重告警
  • 告警平台集成:便于统一管理

Q8: 如何评估容量扩展的效果?

A8: 评估容量扩展效果的指标:

  • 存储容量使用率是否下降
  • 计算资源使用率是否下降
  • 业务性能是否提升
  • 告警数量是否减少

Q9: 如何处理突发的容量增长?

A9: 处理突发容量增长的步骤:

  1. 确认容量增长的原因
  2. 评估是否为正常业务增长
  3. 考虑临时扩容方案
  4. 制定长期容量规划
  5. 调整监控和告警策略

Q10: 如何建立完善的容量监控体系?

A10: 建立容量监控体系的步骤:

  1. 确定需要监控的容量指标
  2. 选择合适的监控工具
  3. 配置监控和告警规则
  4. 建立容量预测机制
  5. 制定容量规划流程
  6. 定期评估和优化
  7. 文档化和知识共享