在云服务器上部署 MySQL 时,合理分配 SSD 系统盘与数据盘的容量是保障性能、可靠性与可维护性的关键。以下是结合最佳实践的分层建议(以主流云厂商如阿里云、腾讯云、AWS 为例):
✅ 一、核心原则(先明确为什么这么分)
| 组件 | 关键要求 | 原因说明 |
|---|---|---|
| 系统盘(OS) | 稳定、足够启动+基础运维 | 存放 OS、MySQL 安装包、日志(临时/错误日志)、监控工具等;不存业务数据,避免 I/O 干扰和空间耗尽导致系统崩溃 |
| 数据盘(MySQL) | 高 IOPS、低延迟、独立扩展、持久化 | 存放 datadir(表数据、索引)、innodb_log_group_home_dir(redo log)、slow_query_log、general_log(若开启)、备份临时目录等——所有高负载、高写入、需长期保留的数据 |
⚠️ 错误做法:把 MySQL 数据库全放在系统盘 → 易因日志/数据膨胀导致系统盘满 → SSH 登录失败、MySQL 崩溃、无法恢复。
✅ 二、容量分配建议(按典型场景)
| 场景 | 系统盘(SSD) | 数据盘(SSD) | 说明 |
|---|---|---|---|
| 小型应用(<10GB 数据量,QPS < 100) | 40–60 GB | ≥100 GB(推荐 200 GB 起) | 系统盘预留 30% 余量;数据盘需容纳:当前数据 + 未来6–12个月增长 + redo log(默认768MB×2) + binlog(建议保留7天以上,按日增1GB则需7GB+) + 备份临时空间(如 mysqldump 中间文件) |
| 中型生产(50–500GB 数据,QPS 100–1000) | 60–100 GB | ≥500 GB – 2 TB(按数据量 × 2.5~3 倍预估) | 例如:当前数据300GB → 建议数据盘 ≥900GB。必须启用 binlog(主从/恢复必需),每日binlog约2–5GB,7天需15–35GB;InnoDB buffer pool 增大后,刷盘更频繁,需更高IOPS和空间余量 |
| 大型/高并发(>1TB,读写混合,主从架构) | 100–200 GB | 独立多盘 or 云盘扩容至 TB 级 • 数据盘:≥数据量×3 • 可选 日志盘(单独100–500GB):存放 binlog/redolog/slowlog |
分离日志提升性能与管理灵活性;云平台支持在线扩容,但初始规划宁大勿小;Redo log 建议 2–4 个文件 × 1–2GB(总4–8GB),需连续空间 |
✅ 三、关键配置与优化建议(落地必做)
-
挂载与权限
# 格式化并挂载数据盘(如 /dev/vdb) mkfs.xfs -f /dev/vdb mkdir -p /data/mysql mount /dev/vdb /data/mysql echo "/dev/vdb /data/mysql xfs defaults,noatime 0 0" >> /etc/fstab chown -R mysql:mysql /data/mysql -
MySQL 配置(my.cnf)关键项
[mysqld] datadir = /data/mysql # ✅ 指向数据盘 innodb_data_home_dir = /data/mysql innodb_log_group_home_dir = /data/mysql/logs # 建议单独子目录(或独立日志盘) log_error = /data/mysql/error.log slow_query_log_file = /data/mysql/slow.log general_log_file = /data/mysql/general.log log_bin = /data/mysql/binlog/mysql-bin # ✅ binlog 必须在数据盘! expire_logs_days = 7 # 控制 binlog 自动清理 -
空间监控与告警(强制)
- 使用云监控(如阿里云云监控、Zabbix)设置:
- 数据盘使用率 >85% → 告警
- binlog 目录大小突增 → 排查长事务/未清理
SHOW GLOBAL VARIABLES LIKE 'innodb_log_file_size';确保 redo log 总大小 ≤ 数据盘可用空间 5%
- 定期执行:
SHOW VARIABLES LIKE 'datadir'; SHOW VARIABLES LIKE 'log_bin'; SELECT table_schema, ROUND(SUM(data_length+index_length)/1024/1024,2) MB FROM information_schema.TABLES GROUP BY table_schema;
- 使用云监控(如阿里云云监控、Zabbix)设置:
-
备份策略协同
- 备份文件(如 xtrabackup 全量/增量)绝不存于数据盘 → 单独挂载备份盘(NAS/OSS/S3),或直接上传至对象存储。
- 示例:
xtrabackup --backup --target-dir=/backup/mysql-full-$(date +%F)(/backup 为独立挂载点)
✅ 四、避坑指南(血泪经验)
- ❌ 不要将
/var/lib/mysql(默认路径)留在系统盘 —— 即使初始很小,增长不可控。 - ❌ 不要混用系统盘和数据盘的 I/O —— MySQL 高并发写入会拖慢 SSH、yum、监控等系统操作。
- ❌ 不要依赖“云盘自动扩容”代替规划 —— 扩容需停机(部分云支持热扩容但有风险),且可能触发内核重映射问题。
- ✅ 推荐组合:系统盘(SSD,60GB) + 数据盘(SSD,按需,建议入门即 500GB) + 对象存储(存备份)。
📌 总结:一句话决策树
你的 MySQL 当前数据量 × 3 = 数据盘最小推荐容量
系统盘 ≥ 60GB(纯 OS+MySQL 二进制+基础日志),且必须预留 ≥30% 余量
所有日志(binlog/redolog/slowlog)和数据必须位于同一高性能数据盘(或分离日志盘)
如需进一步帮助,可提供您的:
🔹 当前数据量 & 增长率(日/月)
🔹 是否启用主从、GTID、归档?
🔹 云厂商及实例规格(如阿里云 ecs.g7.2xlarge)
我可为您定制容量计算表 + my.cnf 配置模板 👇
是否需要? 😊
CLOUD云计算