速卖通素材
奋斗

运行Docker和MySQL的服务器硬盘应该怎么划分系统盘和数据盘?

服务器

在运行 Docker 和 MySQL 的生产环境中,合理的磁盘划分对于系统稳定性、数据安全性、性能以及后期维护至关重要。

以下是推荐的硬盘划分策略、理由及最佳实践:


✅ 推荐方案:双盘分离(系统盘 + 数据盘)

分区/挂载点 用途 建议大小 文件系统 说明
/ (根分区) 操作系统、Docker 引擎、容器元数据 20–50 GB ext4/xfs 仅存放系统文件和非关键数据
/data 或 /var/lib/mysql MySQL 数据目录 按需扩展(SSD/NVMe 优先) xfs/ext4 核心业务数据
/var/lib/docker Docker 镜像、容器层、卷 按需扩展(建议独立挂载) xfs/ext4 避免污染系统盘空间

📌 关键点:不要将 MySQL 数据和 Docker 存储都放在系统盘!


🔍 为什么这样划分?

1. 防止系统盘爆满导致服务崩溃

  • Docker 默认使用 overlay2 存储驱动,每个容器的读写层、镜像层都会占用磁盘空间。
  • MySQL 的 .ibd 文件、binlog、redo log 等会持续增长。
  • 如果它们与系统共用一个分区,一旦磁盘写满:
    • 系统无法写入日志 → SSH 断开、监控失效
    • MySQL 可能损坏或拒绝写入
    • Docker 容器启动失败

2. 便于备份、迁移和扩容

  • 数据盘可以单独备份(如 mysqldump 或直接拷贝 /data)。
  • 系统盘重装时不影响业务数据。
  • 数据盘可替换为更快/更大的磁盘(如从 HDD 升级到 NVMe SSD)。

3. 性能隔离

  • MySQL 对 I/O 延迟敏感,应放在高性能磁盘(SSD/NVMe)。
  • 系统盘通常不需要高 IOPS,普通 SATA SSD 即可。

🛠️ 实际配置示例

步骤 1:创建数据盘并格式化

# 假设新磁盘为 /dev/sdb
sudo fdisk /dev/sdb   # 创建分区,如 /dev/sdb1
sudo mkfs.xfs /dev/sdb1
sudo mkdir -p /data /var/lib/docker
sudo mount /dev/sdb1 /data
sudo mount /dev/sdb1 /var/lib/docker  # 可选:共享同一数据盘

步骤 2:设置开机自动挂载

编辑 /etc/fstab:

/dev/sdb1 /data       xfs     defaults        0 2
/dev/sdb1 /var/lib/docker xfs defaults        0 2

步骤 3:修改 Docker 存储路径

编辑 /etc/docker/daemon.json:

{
  "data-root": "/var/lib/docker"
}

重启 Docker:

sudo systemctl restart docker

步骤 4:修改 MySQL 数据目录

编辑 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf:

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock

确保权限正确:

sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql

重启 MySQL:

sudo systemctl restart mysqld

⚠️ 注意事项

  1. XFS vs ext4:

    • XFS 更适合大文件和并发写入(MySQL 场景更优),但不支持在线缩小。
    • ext4 更通用,支持在线扩容/缩容。
    • 生产环境推荐 XFS(尤其 CentOS/RHEL 8+)。
  2. Docker 卷(Volumes)管理:

    • 始终使用命名卷而非绑定挂载宿主机目录,除非明确需要。
    • 示例:docker volume create mysql_data,然后映射到容器。
  3. 监控磁盘使用率:

    • 设置告警阈值(如 >80% 警告,>90% 紧急)。
    • 工具:df -h, du -sh /var/lib/docker, du -sh /data/mysql
  4. 备份策略:

    • 定期备份 MySQL 数据(mysqldump 或 Percona XtraBackup)。
    • Docker 镜像和配置可版本化管理(Git),无需频繁备份。
  5. 安全考虑:

    • 数据盘权限严格限制(mysql:mysql,750)。
    • 禁用不必要的 Docker API 访问。

📊 小型部署简化方案(单盘但逻辑分离)

如果只有一块磁盘,至少做到:

  • 系统盘 / 限制在 50GB 以内。
  • 通过 LVM 或分区预留足够空间给 /var/lib/docker 和 /var/lib/mysql。
  • 使用 tmpfs 临时目录减少磁盘写入。

✅ 总结

原则 做法
隔离性 系统、Docker、MySQL 数据分开
可扩展性 数据盘独立,便于升级
安全性 权限最小化,定期备份
性能 MySQL/Docker 用 SSD/NVMe

💡 黄金法则:“系统归系统,数据归数据” —— 这是运维稳定性的基石。

未经允许不得转载:轻量云Cloud » 运行Docker和MySQL的服务器硬盘应该怎么划分系统盘和数据盘?