这个问题没有标准的“万能答案”,因为 MySQL 的存储需求完全取决于你的数据量大小、写入频率(QPS/TPS)、备份策略以及业务增长预期。
但在实际生产环境搭建中,为了兼顾性能、成本和运维便利性,有一套比较通用的最佳实践。以下是基于国内主流云厂商(阿里云、腾讯云、华为云等)ECS/RDS 架构的经验总结:
1. 核心原则:系统盘与数据盘必须分离
首先明确一点:永远不要把数据库文件放在系统盘上。
- 系统盘:只装操作系统、MySQL 软件包、配置文件、日志轮转产生的临时小文件。
- 数据盘:存放 InnoDB 表空间文件(ibdata1, ibd)、redo log、undo log、binlog 等核心数据。
为什么?
- 性能隔离:系统盘的 IOPS 通常有限且共享,而数据盘可以独立配置高 IOPS。混用会导致系统更新或日志输出时影响数据库查询延迟。
- 数据安全:如果系统盘损坏或需要重装系统,数据盘挂载在另一个磁盘上,数据不会丢失,只需重新挂载并启动服务即可恢复。
- 扩容灵活性:数据盘可以按需平滑扩容,而系统盘扩容往往需要停机或复杂操作。
2. 具体建议尺寸
A. 系统盘(System Disk)
建议大小:40GB – 50GB
- 最低要求:Linux 系统本身占用约 5-10GB,MySQL 安装包和基础配置占几 GB。预留 20GB 足够。
- 推荐 40-50GB 的原因:
- 日志空间:MySQL 的错误日志、慢查询日志、以及操作系统的
/var/log会随着时间增长。虽然我们可以做日志轮转(logrotate),但预留空间更安全。 - 临时文件:MySQL 在进行大排序、临时表处理时可能会在
/tmp或指定目录下产生临时文件。 - 避免误操作:有些新手习惯把东西随便扔在根目录,留多点空间能减少“磁盘满导致服务宕机”的概率。
- 快照备份:如果你开启了云厂商的系统盘自动快照,较小的系统盘备份更快、成本更低。
- 日志空间:MySQL 的错误日志、慢查询日志、以及操作系统的
注意:不要选太大(如 100GB+),浪费钱。除非你打算在系统盘上跑其他非关键服务(如 Nginx 静态资源),否则纯 MySQL 服务器不需要大系统盘。
B. 数据盘(Data Disk)
建议大小:根据 当前数据量 × 3 ~ 5 来估算,并设置自动扩容阈值。
这是一个动态值,分场景讨论:
场景一:初创项目 / 个人博客 / 小型应用(日均 PV < 1万)
- 初始配置:100GB – 200GB
- 理由:初期数据量小,但考虑到未来 1-2 年的增长,以及 MySQL 自身膨胀(InnoDB 碎片、事务日志增长)。100GB 对于绝大多数中小型单表百万级以下的数据是足够的起步容量。
场景二:中型企业应用(日均 PV 1万 – 10万,数据量几十 GB 到几百 GB)
- 初始配置:500GB – 1TB
- 理由:这个量级的数据,读写压力开始显现。建议直接上 500GB 起步,避免频繁扩容带来的麻烦。同时,一定要选择支持在线扩容的云盘类型(如阿里云 ESSD PL0/PL1,腾讯云高性能云硬盘)。
场景三:大型核心业务 / 高并发交易(数据量 TB 级别)
- 初始配置:2TB 起,按需线性扩展
- 理由:此时数据盘的大小已经不是瓶颈,IOPS 和吞吐量才是。你应该更关注云盘的性能等级(如 ESSD PL2/PL3),而不是单纯追求容量。建议采用多块云盘 RAID 0(需谨慎评估可靠性)或直接使用云厂商提供的分布式文件系统/数据库服务。
3. 关键影响因素(决定你是否需要更大)
在确定最终大小前,请检查以下几点:
-
Binlog 保留策略:
- 如果你开启了主从复制或点恢复(PITR),binlog 会持续增长。默认可能保留 7 天甚至更久。如果未定期清理,binlog 可能吃掉几十 GB 空间。
- 建议:设置
expire_logs_days = 7或使用脚本定期清理,这样数据盘压力小很多。
-
Redo Log 和 Undo Log:
- 高并发写入下,这两个文件会变大。确保数据盘有足够的剩余空间供其增长,否则数据库会报错停止写入。
-
备份策略:
- 如果你是在本地磁盘上做物理备份(如 XtraBackup),备份文件会占用大量空间。
- 最佳实践:将备份文件上传至对象存储(OSS/COS/S3),而不是留在云服务器本地。这样数据盘只需要存原始数据和日志,无需为备份预留额外空间。
-
云盘性能 vs 容量:
- 在阿里云/腾讯云等平台,云盘的性能(IOPS)往往与容量挂钩。例如,一块 1TB 的 ESSD PL1 云盘,其最大 IOPS 可能比一块 100GB 的同类型云盘更高。
- 因此,适当加大数据盘容量,有时反而能获得更好的 IO 性能上限。 这不是为了存更多数据,而是为了买更高的性能配额。
4. 运维建议(比初始大小更重要)
-
监控告警:
- 务必设置磁盘使用率告警!当数据盘使用率达到 80% 时触发警告,90% 时紧急处理。MySQL 在磁盘满时会直接崩溃,无法优雅退出。
-
自动扩容:
- 大多数云厂商支持云盘在线扩容。设置一个策略:当使用率超过 85% 时,自动增加 100GB 或 200GB。这比手动干预更可靠。
-
文件系统选择:
- Linux 下推荐使用 XFS 或 ext4。XFS 在处理大文件和并发写入时表现更好,尤其适合数据库场景。格式化时注意对齐扇区(align),以提升 IO 效率。
-
SSD 优先:
- 无论多大,务必选择 SSD 云盘(高性能型)。机械硬盘(HDD)仅适用于冷数据归档,不适合作为主库数据盘。
总结推荐方案
| 业务阶段 | 系统盘 | 数据盘 | 备注 |
|---|---|---|---|
| 测试/开发 | 40GB | 50GB | 够用即可,随时可删 |
| 初创/小规模 | 40-50GB | 100-200GB | 重点监控 binlog 大小 |
| 中型生产 | 50GB | 500GB – 1TB | 选高性能 SSD,开启自动扩容 |
| 大型核心 | 50GB | 按需弹性伸缩 | 关注 IOPS 指标,考虑分库分表 |
最后提醒:不要过度纠结初始大小。云服务器的优势就是弹性。你可以先按保守值配置,然后通过监控观察增长速度,再逐步扩容。比起一开始就配个巨大的磁盘,建立好监控和自动化扩容机制更为重要。
云技术博客