容量规划 #

一、容量规划概述 #

1.1 为什么需要容量规划 #

text
容量规划的重要性:

┌─────────────────────────────────────────────┐
│ 1. 避免资源不足                             │
├─────────────────────────────────────────────┤
│ • 存储空间耗尽                              │
│ • 内存溢出                                  │
│ • 性能下降                                  │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 2. 控制成本                                 │
├─────────────────────────────────────────────┤
│ • 避免过度配置                              │
│ • 合理分配资源                              │
│ • 优化成本                                  │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 3. 提前规划                                 │
├─────────────────────────────────────────────┤
│ • 预测增长趋势                              │
│ • 提前扩容                                  │
│ • 避免服务中断                              │
└─────────────────────────────────────────────┘

二、存储容量规划 #

2.1 存储计算公式 #

text
存储容量计算:

┌─────────────────────────────────────────────┐
│ 存储需求 = 时间序列数 × 样本大小 × 保留天数 │
└─────────────────────────────────────────────┘

详细计算:

时间序列数 = 采集目标数 × 每目标指标数 × 标签组合数

样本大小 ≈ 1-2 字节/样本(压缩后)

日存储量 = 时间序列数 × 采集频率(次/秒) × 86400秒 × 1.5字节

总存储量 = 日存储量 × 保留天数 × 1.5(安全系数)

2.2 计算示例 #

text
示例计算:

假设:
• 采集目标数:100个
• 每目标指标数:1000个
• 标签组合数:平均2个
• 采集频率:15秒一次
• 保留天数:30天

计算:
时间序列数 = 100 × 1000 × 2 = 200,000

每秒样本数 = 200,000 / 15 = 13,333

日样本数 = 13,333 × 86,400 = 1,152,000,000

日存储量 = 1,152,000,000 × 1.5字节 ≈ 1.6GB

总存储量 = 1.6GB × 30 × 1.5 ≈ 72GB

建议配置:100GB SSD存储

2.3 存储监控 #

promql
# 当前存储使用
prometheus_tsdb_storage_blocks_bytes

# 存储增长速率
deriv(prometheus_tsdb_storage_blocks_bytes[1d])

# 预测存储使用
predict_linear(prometheus_tsdb_storage_blocks_bytes[1d], 30*24*3600)

# 磁盘使用率
node_filesystem_avail_bytes{mountpoint="/prometheus"} 
/ 
node_filesystem_size_bytes{mountpoint="/prometheus"} * 100

三、内存容量规划 #

3.1 内存计算公式 #

text
内存需求计算:

┌─────────────────────────────────────────────┐
│ 内存需求 = 基础内存 + 数据内存 + 查询内存  │
└─────────────────────────────────────────────┘

详细计算:

基础内存 ≈ 500MB

数据内存 = 时间序列数 × 3KB(Head Block)

查询内存 = 并发查询数 × 每查询内存

总内存 = 基础内存 + 数据内存 + 查询内存

3.2 计算示例 #

text
示例计算:

假设:
• 时间序列数:200,000
• 并发查询数:20
• 每查询内存:100MB

计算:
基础内存 = 500MB

数据内存 = 200,000 × 3KB = 600MB

查询内存 = 20 × 100MB = 2GB

总内存 = 500MB + 600MB + 2GB ≈ 3.1GB

建议配置:8GB内存(考虑峰值和安全系数)

3.3 内存监控 #

promql
# 进程内存使用
process_resident_memory_bytes

# Go堆内存
go_memstats_heap_inuse_bytes

# Head Block内存
prometheus_tsdb_head_series

# 内存使用率
process_resident_memory_bytes / node_memory_MemTotal_bytes * 100

四、CPU容量规划 #

4.1 CPU计算 #

text
CPU需求计算:

┌─────────────────────────────────────────────┐
│ CPU需求 = 采集CPU + 查询CPU + 压缩CPU      │
└─────────────────────────────────────────────┘

经验值:
• 每10,000个时间序列需要约0.1 CPU核心
• 查询密集型需要更多CPU
• 压缩期间CPU使用会升高

建议:
• 最少2核
• 推荐4核以上
• 生产环境8核以上

4.2 CPU监控 #

promql
# 进程CPU使用
rate(process_cpu_seconds_total[5m])

# 系统CPU使用
rate(node_cpu_seconds_total[5m])

# CPU使用率
rate(process_cpu_seconds_total[5m]) * 100

五、网络容量规划 #

5.1 网络带宽计算 #

text
网络带宽计算:

┌─────────────────────────────────────────────┐
│ 带宽需求 = 采集数据量 + 查询数据量          │
└─────────────────────────────────────────────┘

采集数据量:
每秒样本数 × 样本大小 × 标签大小

示例:
• 每秒样本数:13,333
• 样本大小:8字节
• 标签大小:约100字节

每秒数据量 = 13,333 × 108 ≈ 1.4MB/s

建议:千兆网络

六、扩容策略 #

6.1 垂直扩容 #

text
垂直扩容(Scale Up):

┌─────────────────────────────────────────────┐
│ 增加单机资源                                │
├─────────────────────────────────────────────┤
│ • 增加CPU核心数                             │
│ • 增加内存                                  │
│ • 增加存储                                  │
│ • 使用更快的存储                            │
└─────────────────────────────────────────────┘

适用场景:
• 时间序列数 < 100万
• 单机资源充足
• 简单快速

6.2 水平扩容 #

text
水平扩容(Scale Out):

┌─────────────────────────────────────────────┐
│ 增加实例数量                                │
├─────────────────────────────────────────────┤
│ • 分片采集                                  │
│ • 联邦架构                                  │
│ • 远程存储                                  │
└─────────────────────────────────────────────┘

适用场景:
• 时间序列数 > 100万
• 需要高可用
• 长期存储需求

6.3 扩容指标 #

promql
# 时间序列数量
prometheus_tsdb_head_series

# 采集目标数量
count(up)

# 查询QPS
rate(prometheus_http_requests_total{handler=~"/api/v1/.*"}[5m])

# 存储使用率
prometheus_tsdb_storage_blocks_bytes

# 内存使用率
process_resident_memory_bytes / node_memory_MemTotal_bytes

七、容量规划模板 #

7.1 小型部署 #

text
小型部署(<10万时间序列):

┌─────────────────────────────────────────────┐
│ 配置建议                                    │
├─────────────────────────────────────────────┤
│ CPU: 2核                                   │
│ 内存: 4GB                                  │
│ 存储: 50GB SSD                             │
│ 网络: 百兆                                 │
│ 保留时间: 15天                             │
└─────────────────────────────────────────────┘

7.2 中型部署 #

text
中型部署(10-100万时间序列):

┌─────────────────────────────────────────────┐
│ 配置建议                                    │
├─────────────────────────────────────────────┤
│ CPU: 4-8核                                 │
│ 内存: 8-16GB                               │
│ 存储: 200GB-1TB SSD                        │
│ 网络: 千兆                                 │
│ 保留时间: 30天                             │
└─────────────────────────────────────────────┘

7.3 大型部署 #

text
大型部署(>100万时间序列):

┌─────────────────────────────────────────────┐
│ 配置建议                                    │
├─────────────────────────────────────────────┤
│ 架构: 分片+联邦+远程存储                    │
│ CPU: 每实例8核以上                          │
│ 内存: 每实例16GB以上                        │
│ 存储: 远程存储(对象存储)                    │
│ 网络: 万兆                                  │
│ 保留时间: 根据需求                          │
└─────────────────────────────────────────────┘

八、总结 #

容量规划要点:

资源 计算公式
存储 时间序列数 × 样本大小 × 保留天数
内存 基础内存 + 数据内存 + 查询内存
CPU 采集 + 查询 + 压缩
网络 采集数据量 + 查询数据量

监控指标:

指标 说明
prometheus_tsdb_head_series 时间序列数
process_resident_memory_bytes 内存使用
prometheus_tsdb_storage_blocks_bytes 存储使用

下一步,让我们学习安全配置!

最后更新:2026-03-27