云服务器部署MySQL时,SSD系统盘和数据盘如何合理分配容量?

在云服务器上部署 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 » 云服务器部署MySQL时,SSD系统盘和数据盘如何合理分配容量?