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

在部署 Docker 和 MySQL 的生产环境或高可用场景中,合理的磁盘划分对于性能、数据安全性和维护便利性至关重要。

以下是推荐的硬盘划分方案及详细理由:

🎯 核心原则

  1. 系统盘(OS Disk):仅用于操作系统、Docker 引擎、容器镜像层、日志文件。
  2. 数据盘(Data Disk)专门用于存放 MySQL 数据文件 和 Docker 持久化数据(Volumes/Bind Mounts)。
  3. 分离 I/O:避免数据库写入与系统日志/容器重建争用磁盘 I/O。

✅ 推荐分区方案

挂载点 用途 建议大小 说明
/ (根分区) 操作系统、Docker 引擎、容器元数据 50–100 GB 足够容纳 OS + Docker 默认存储驱动(overlay2)的基础层
/var/lib/mysql MySQL 数据目录 独立数据盘 关键! 将 MySQL 数据文件放在高性能 SSD/NVMe 上
/var/lib/docker Docker 运行时、容器日志、临时层 可单独划分或使用 LVM 若容器多且日志大,建议单独挂载;否则可与系统盘共享但监控空间
/data 或 /mnt/data Docker Volumes / Bind Mounts 独立数据盘 所有需要持久化的应用数据(如 Redis、Elasticsearch、用户上传文件等)

💡 最佳实践:使用 LVM(逻辑卷管理) 或 RAID 组合,便于后续扩容。


🔧 具体实施步骤

1. 物理磁盘规划示例

假设你有两块 SSD:

  • Disk 1 (/dev/sda): 100GB → 系统盘
  • Disk 2 (/dev/sdb): 500GB → 数据盘

2. 格式化并挂载数据盘

# 创建分区(例如使用 fdisk 或 parted)
sudo fdisk /dev/sdb

# 格式化(推荐使用 ext4 或 xfs)
sudo mkfs.ext4 /dev/sdb1

# 创建挂载点
sudo mkdir -p /data

# 挂载
sudo mount /dev/sdb1 /data

# 设置开机自动挂载
echo '/dev/sdb1 /data ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab

3. 迁移 MySQL 数据到新盘

# 停止 MySQL
sudo systemctl stop mysql

# 复制数据到新盘
sudo rsync -av /var/lib/mysql/ /data/mysql/

# 修改权限
sudo chown -R mysql:mysql /data/mysql

# 编辑 MySQL 配置文件(my.cnf 或 mysqld.cnf)
sudo nano /etc/mysql/my.cnf
# 添加或修改:
# datadir=/data/mysql

# 重启 MySQL
sudo systemctl start mysql

4. 配置 Docker 使用数据盘(可选但推荐)

如果你希望 Docker 的容器数据也存储在数据盘上:

方法一:修改 Docker 默认存储路径

编辑 /etc/docker/daemon.json:

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

然后重启 Docker:

sudo systemctl restart docker

方法二:使用 Volume 或 Bind Mount(更灵活)

在 docker-compose.yml 中明确指定持久化路径:

services:
  db:
    image: mysql:8.0
    volumes:
      - /data/mysql:/var/lib/mysql   # 直接映射到数据盘
    environment:
      MYSQL_ROOT_PASSWORD: secret

⚠️ 注意事项

1. 文件系统选择

  • ext4:通用性强,兼容性好。
  • XFS:适合大容量文件和高并发写入,MySQL 官方推荐。
  • 避免使用 NTFS/FAT:不支持 Linux 权限模型。

2. I/O 调度器优化

对于 SSD/NVMe,建议使用 none 或 mq-deadline 调度器:

# 查看当前调度器
cat /sys/block/sdb/queue/scheduler

# 临时设置为 none(SSD 推荐)
echo 'none' | sudo tee /sys/block/sdb/queue/scheduler

3. 监控磁盘空间

  • 使用 df -h 定期检查。
  • 设置告警:当 /data 使用率 > 80% 时触发警报。
  • Docker 日志可能占用大量空间,定期清理或使用 logrotate。

4. 备份策略

  • MySQL:使用 mysqldump 或 Percona XtraBackup 定期备份。
  • Docker Volumes:将 /data 目录整体打包备份至远程存储(如 S3、NAS)。

5. 安全考虑

  • 确保 /data 目录权限正确(特别是 MySQL 数据目录)。
  • 使用 tmpfs 挂载 /tmp 和 /var/tmp,减少磁盘写入。

📊 总结图示

[物理磁盘]
├── /dev/sda (100GB) → 系统盘
│   ├── /          : OS, Kernel, Systemd
│   └── /var/lib/docker : Docker 引擎、镜像层、容器日志(小量)
│
└── /dev/sdb (500GB) → 数据盘(高性能 SSD)
    ├── /data/mysql      : MySQL InnoDB 数据文件(高 I/O)
    ├── /data/docker     : Docker Volumes(持久化容器数据)
    └── /data/apps       : 其他应用持久化数据(Redis, ES, etc.)

✅ 最终建议:
MySQL 数据必须与系统盘分离,并使用高性能磁盘。Docker 的持久化数据也应尽量放在数据盘上,以确保数据安全和性能隔离。

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