在云服务器上部署 MySQL 时,合理分配 SSD 系统盘(OS 盘)与数据盘(MySQL 数据存储盘)的容量,是保障性能、稳定性、可维护性和成本效益的关键。以下是基于生产实践的分层建议与最佳实践:
✅ 一、核心原则(先明确为什么这样分)
| 维度 | 系统盘(OS盘) | 数据盘(MySQL专用盘) |
|---|---|---|
| 职责 | 运行 OS、MySQL 二进制、配置文件、临时文件(如 /tmp)、日志(系统日志、MySQL 错误日志等) |
存储 datadir(数据库文件:.ibd, ibdata1, ib_logfile*, binlog, relay log, slow log 等) |
| I/O 特性 | 随机小 I/O(启动、配置读取、日志轮转),低吞吐、低压力 | 高并发随机读写 + 大量顺序写入(InnoDB Buffer Pool 刷脏页、redo log、binlog 写入)→ 对 IOPS/吞吐/延迟极度敏感 |
| 扩容性 | 通常不建议频繁扩容(涉及系统分区调整风险高) | 强烈推荐独立挂载,支持在线扩容(LVM/XFS resize/云盘热扩容) |
| 可靠性 | 可通过快照备份,但非核心数据载体 | 所有业务数据所在,必须启用自动快照 + binlog 完整备份策略 |
⚠️ 关键结论:MySQL 数据目录(
datadir)必须放在独立的数据盘上,严禁与系统盘混用!
✅ 二、容量分配建议(按典型场景)
| 场景 | 系统盘(SSD)推荐容量 | 数据盘(SSD)推荐容量 | 说明 |
|---|---|---|---|
| 小型应用 (QPS < 100,数据量 < 50GB,日增 < 10MB) |
40–60 GB | ≥ 100 GB(建议 200 GB 起) | • 系统盘留足空间给 OS(Ubuntu/CentOS 约 8–15GB)、MySQL 二进制(~500MB)、慢日志/错误日志(需定期轮转) • 数据盘预留 ≥ 3 倍当前数据量空间(含 binlog、redo log、临时排序/JOIN 空间、未来 6–12 个月增长) |
| 中型生产库 (QPS 100–1000,数据量 50–500GB,日增 100MB–1GB) |
60–80 GB | ≥ 1 TB(建议 2 TB,支持云盘自动扩容) | • 数据盘需满足: ✓ 数据文件 × 1.2(预留碎片/膨胀) ✓ binlog 保留 7–14 天(按日增 500MB → 7天需 3.5GB,但大事务可能单个 binlog > 1GB) ✓ redo log(默认 2×48MB,可调至 256–1024MB) ✓ tmpdir(建议挂到数据盘,防系统盘爆满)✓ innodb_buffer_pool_size 不占磁盘,但影响内存规划 |
| 大型/高写入库 (QPS > 1000,数据量 > 500GB,日增 > 1GB) |
80–100 GB | ≥ 2–5 TB 或更高 (务必启用云厂商的超高性能 SSD(如 AWS io2 Block Express / 阿里云 ESSD PL3 / 腾讯云 CBS Ultra)) |
• 必须分离:数据盘、binlog 盘、备份盘(可选) • 示例分离方案: ▸ /data/mysql(数据+redo)→ 主数据盘▸ /data/binlog → 独立 SSD 盘(降低刷 redo 和 binlog 的 I/O 竞争)▸ /backup → 对象存储(OSS/COS/S3)+ 定时 xtrabackup |
✅ 三、关键配置与优化建议
1. 文件系统与挂载选项(数据盘必做)
# 推荐格式化为 XFS(高性能、大文件友好)
mkfs.xfs -f -i size=512 /dev/vdb
# 挂载参数(关键!提升 MySQL 性能与一致性)
mount -o noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k /dev/vdb /var/lib/mysql
# /etc/fstab 永久挂载(加 `x-systemd.requires=cloud-init.service` 避免云初始化冲突)
/dev/vdb /var/lib/mysql xfs defaults,noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k 0 0
2. MySQL 配置要点(my.cnf)
[mysqld]
# ▶ 数据路径(必须指向数据盘)
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
pid-file = /var/lib/mysql/mysqld.pid
# ▶ 日志分离(强烈推荐)
log-error = /var/lib/mysql/error.log # 错误日志放数据盘
slow-query-log-file = /var/lib/mysql/slow.log
general_log_file = /var/lib/mysql/general.log
# ▶ Binlog 单独路径(若使用独立 binlog 盘)
# log_bin = /data/binlog/mysql-bin
# binlog_index = /data/binlog/mysql-bin.index
# ▶ 临时文件(避免 /tmp 爆满)
tmpdir = /var/lib/mysql/tmp # 创建并 chown mysql:mysql
# ▶ InnoDB 关键参数(根据内存调整)
innodb_buffer_pool_size = 70% of RAM # 如 16GB RAM → 11–12GB
innodb_log_file_size = 256M # 建议 256–1024MB,总大小 ≤ 1GB(避免恢复过长)
innodb_flush_log_at_trx_commit = 1 # 强一致性(生产环境勿改 0/2)
sync_binlog = 1 # 与上条配合保证主从一致性
3. 自动化运维保障
- ✅ 监控告警:监控数据盘使用率(>85% 告警)、IOPS/吞吐饱和度、MySQL
Innodb_data_pending_*等指标 - ✅ 自动清理:
expire_logs_days = 7(binlog)、max_relay_log_size+relay_log_purge = ON - ✅ 备份策略:
- 全量:每周
xtrabackup+ 压缩上传至对象存储 - 增量:每日 + binlog 实时归档(用于 PITR)
- 全量:每周
- ✅ 快照策略:云盘设置每日自动快照 + 保留7天(作为最后防线)
❌ 四、常见错误(务必规避)
- ❌ 将
datadir放在系统盘 → 磁盘打满导致 MySQL crash + 系统不可用 - ❌ 系统盘仅分配 20GB → 更新内核/MySQL 升级失败,或日志填满后无法登录
- ❌ 数据盘未格式化 XFS / 未加
noatime→ 额外 I/O 开销、元数据锁竞争 - ❌ 忽略
tmpdir路径 → 大排序/JOIN 生成临时表挤爆/tmp(常为内存 tmpfs 或小系统盘) - ❌ binlog 与数据文件共盘且无清理 → 日增 10GB binlog,30天后爆盘
✅ 五、一句话总结(部署 checklist)
系统盘够用就好(60–80GB),只装 OS 和 MySQL 程序;数据盘要宽裕(≥ 当前数据量 × 3)、独立挂载、XFS 格式、noatime 挂载;所有 MySQL 数据、日志、临时文件必须全部落在数据盘;并配置自动扩容、监控与多层备份。
如需,我可为你提供:
- 阿里云/腾讯云/AWS 各平台的 SSD 云盘选型对比(ESSD vs GP3 vs io2)
- 自动化部署脚本(含分区、挂载、MySQL 安装、安全加固)
- xtrabackup + binlog 的 PITR 恢复 SOP
欢迎随时提出具体需求 👇
云计算HECS