导语:容量是数据库"活得久"的基石
很多系统不是被写坏的,而是被慢慢涨满的:磁盘 95% 满了才发现、连接数峰值打爆、慢 SQL 在高峰期雪崩。数据库容量规划的价值,就是在问题发生前的几个季度预判趋势,把扩容变成例行操作而非救火。
一句话总结: 容量规划 = 测量当前 + 预测增长 + 设置水位 + 预埋扩展路径——目标是让扩容像"例行公事"而不是"抢救无效"。
1. 容量评估:测什么、怎么算
1.1 核心容量维度
| 维度 | 关注点 | 典型上限/风险 |
|---|---|---|
| 磁盘 | 数据 + 索引 + binlog + 日志 + 临时表 | 磁盘写满即宕机 |
| 内存 | buffer pool 命中率、排序/临时表 | OOM、性能骤降 |
| CPU | 查询/事务/链接开销 | 瓶颈、延迟升高 |
| 连接数 | max_connections、活跃连接 | 拒绝连接、雪崩 |
| 网络/ IO | 吞吐、排队 | 慢查询、复制延迟 |
1.2 测算估算方法
磁盘估算示例(单表):
行数据平均大小 200 B
行数(半年后) 5 亿
数据文件 5e8 × 200B ≈ 100 GB
索引按 20%~40% ≈ 20~40 GB
binlog(保留 3 天,峰值写入)≈ 若干 GB
+ 冗余(建议预留 30%~50%)→ 落盘需求 ≈ 200 GB+
连接数估算:
平均 QPS × 平均查询时长(秒) ≈ 需求连接数
例:QPS=2000,平均 50ms → 2000×0.05 = 100 连接
容量估算不是精确科学,而是「下限清晰、上限留余」的保险数学——宁多勿少。
2. 水位监控与预警
2.1 水位线与分级
分级预警(建议):
· 健康区 ≤ 60% 正常,无需动作
· 关注区 60%~80% 开始跟踪增速,纳入日报
· 预警区 80%~90% 触发容量评审,排期扩容
· 危险区 > 90% 立即动作(扩容/清理/降级)
磁盘尤其关键:建议 70% 就预警,因为 binlog + 临时表随时会瞬时顶到满。
2.2 关键监控指标集
# 磁盘
df -h /data # 空间
SHOW VARIABLES LIKE 'innodb_log_file_size';
# 连接与性能
SHOW STATUS LIKE 'Threads_connected%'; -- 当前连接
SHOW VARIABLES LIKE 'max_connections'; -- 上限
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
# 内存命中率
SHOW GLOBAL STATUS LIKE 'buffer_pool_read%'; -- 含 BufferPool 命中率
# 慢查询趋势(配合慢日志聚合)
一句话总结: 水位就是容量规划的"仪表盘"——红线 >90% 立即动作,60%~80% 就要排期,别等 100% 才想起扩容。
3. 资源治理:配额、限额与成本
3.1 连接数治理
连接数被耗尽是最典型的人祸型故障——通常是应用层连接池配置错误或泄漏引爆。
-- 查看连接来源 Top
SELECT user, host, COUNT(*) c
FROM information_schema.processlist
GROUP BY user, host ORDER BY c DESC;
-- 超时配置,防止"僵尸连接"
SET GLOBAL wait_timeout = 300; -- Session 空闲等待
SET GLOBAL interactive_timeout = 300;
3.2 慢查询与长事务治理
-- 找出运行过久的事务
SELECT * FROM information_schema.innodb_trx
WHERE trx_state = 'RUNNING'
AND TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 10;
-- 用 role/账号分层限制权限,避免单账号权限过大
3.3 成本治理
· 冷数据归档到低成本存储(OSS / 冷库)
· 闲置实例下线(无人访问的只读副本)
· 大表压缩 / 分区归档,控制膨胀
· 数据保留期策略(binlog、日志、备份)
一句话总结: 治理不是"等满了再清理",而是配额 + 监控 + 归档 + 收编四管齐下,让资源始终在安全水位内。
4. 扩展路径:纵向 vs 横向
4.1 纵向扩容(Scale Up)
升配 CPU/内存/磁盘,适合单实例仍有提升空间、业务相对简单:
# 云上简单、但对单机天花板敏感,硬件规格有限
ALTER ...扩规格 / 换大机型
优势:简单透明、SQL 不改。
劣势:有物理上限、成本线性上升、无法水平无穷。
4.2 横向扩展(Scale Out)
当单机无法承载,用读写分离 + 分库分表横向摊薄:
| 阶段 | 手段 | 代表作 |
|---|---|---|
| 读放大 | 一主多从 + 读写分离 | 读写分离 |
| 写放大 | 分库分表 / 分区 | 分库分表 |
| 分布式 | NewSQL 原生扩展 | TiDB |
一句话总结: 容量即将到顶时按「先垂直、后水平;先读写分离、再分库分表」的阶梯演进,每一步都可回退、有 buffer。
5. 容量规划落地框架
5.1 季度规划节奏
一次完整的容量规划(每季度一次):
① 盘点现状:存储/连接/CPU/内存 实测
② 算增速:过去 3 个月的月度复合增长率
③ 外推预测:按增速推未来 2~4 个季度的水位
④ 定水位线:设 60/80/90 分级阈值
⑤ 排期扩容:对 >80% 且增速快的项排期
⑥ 验证与复盘:上线后回看预测是否准
5.2 一份"容量健康检查"自查清单
| 检查项 | 建议动作 | 存在风险 |
|---|---|---|
| 磁盘水位 | <60% 绿色 / <90% 排期 | 写满宕机 |
| 连接数峰值/上限 | <80% | reset 避免峰值打爆 |
| InnoDB 缓冲命中率 | >99% | 内存不足,I/O 放大 |
| 慢查询占比 | 占用 <5% | 拖慢实例 |
| 活跃会话 | < max_connections 60% | 排队/锁 |
| 备份保留/归档 | 按规定 | 空间/恢复 |
6. 避坑清单
| 坑 | 后果 | 对策 |
|---|---|---|
| 磁盘 90% 还不管 | 写满即宕机 | Red 90% 告警 + 清理归档 |
| 连接数压线跑 | 峰值连接风暴 | 应用侧连接池 + 限额 + 监控 |
| 只看 CPU 不看 IO/连接 | 漏掉隐形瓶颈 | 多维监控 |
| 扩容只看硬件无限上 | 边际收益递减 | 分级分库分表 |
| 缺预测只有监控 | 出了问题才救火 | 季度容量规划 |
| 病急乱排查 | 延迟扩大 | 先监控再判断再决策 |
7. 总结
容量规划是数据库运维的"预防医学",核心就是六件套:盘点、测速、预测、定水位、排期、验证。记住几个触目惊心的数字:
| 动作 | 建议 |
|---|---|
| 磁盘预警 | 90% 就必须动作,别等 100% |
| 连接最安全区 | 活跃连接控制在 max_connections 的 60% 内 |
| 容量调度节奏 | 季度复盘 + 月度趋势 + 周度水位 |
| 扩展原则 | 垂直优先于水平、按需扩容留 buffer |
真正成熟的团队,是从不等到 100% 的。容量规划做得好,数据库就是"等你扩容"的可靠基础设施,而不是"求你救火"的定时炸弹。
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。