在部署 Docker 和 MySQL 的服务器时,合理的磁盘划分不仅能提升性能,还能有效防止数据丢失(例如日志爆满导致系统盘写死)并简化备份策略。
以下是针对生产环境的推荐划分方案、分区理由及具体操作建议:
1. 核心原则:分离与隔离
最核心的原则是将“系统运行文件”与“业务数据/容器数据”物理或逻辑分离。
- 系统盘 (OS Disk):仅用于操作系统、Docker 守护进程本身、日志(可选)、临时文件。
- 数据盘 (Data Disk):专门用于存放 MySQL 的数据目录 (
/var/lib/mysql) 和 Docker 的存储驱动目录 (/var/lib/docker)。
2. 推荐划分方案
A. 系统盘 (System Disk)
- 挂载点:
/(根分区) 或单独划分/boot,/home等。 - 推荐大小: 40GB – 80GB (取决于是否安装大量开发工具)。
- 用途:
- 操作系统文件 (
/bin,/lib,/etc等)。 - Docker 二进制文件 (
dockerd)。 - 注意:如果可能,将 Docker 的默认日志路径 (
/var/log/journal或 Docker 的json-file日志) 限制容量,或者挂载到独立的日志分区,避免日志写满系统盘导致服务器宕机。
- 操作系统文件 (
B. 数据盘 (Data Disk) – 关键部分
建议创建一个新的独立分区或挂载新的云硬盘,统一挂载到 /data 目录(或其他非根目录),然后在其中建立子目录供 MySQL 和 Docker 使用。
- 推荐大小: 根据业务数据量预估,通常建议预留 50% 以上的增长空间。
- 文件系统: 推荐使用 XFS (CentOS/RHEL/Alibaba Cloud 默认) 或 EXT4 (Ubuntu/Debian)。
- 挂载点:
/data
在该数据盘上的具体布局建议:
| 子目录 | 用途 | 说明 |
|---|---|---|
/data/mysql |
MySQL 数据 | 存放 ibdata1, .ibd, 事务日志等。这是 IO 最密集的区域。 |
/data/docker |
Docker 存储 | 存放所有容器的镜像层、容器层、卷数据。 |
/data/logs |
应用日志 | 存放业务容器产生的日志,方便定期清理或归档。 |
3. 配置实施步骤
假设你已经有一块新硬盘(例如设备名为 /dev/vdb),以下是标准的操作流程:
第一步:格式化并挂载数据盘
# 1. 查看新硬盘
lsblk
# 2. 格式化 (以 xfs 为例,如果是 Ubuntu 则用 mkfs.ext4 /dev/vdb)
mkfs.xfs /dev/vdb
# 3. 创建挂载目录
mkdir -p /data/mysql /data/docker /data/logs
# 4. 挂载
mount /dev/vdb /data
# 5. 设置开机自动挂载 (编辑 /etc/fstab)
echo "/dev/vdb /data xfs defaults 0 0" >> /etc/fstab
第二步:迁移 MySQL 数据
不要直接修改 MySQL 配置文件中的 datadir 而不移动旧数据。
- 停止 MySQL 服务:
systemctl stop mysqld - 复制数据到新位置 (保留权限):
# 假设原数据在 /var/lib/mysql cp -aR /var/lib/mysql/* /data/mysql/ chown -R mysql:mysql /data/mysql chmod 750 /data/mysql - 修改配置文件 (
/etc/my.cnf或/etc/mysql/my.cnf):[mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock # 如果有 log_bin, 也可以考虑指向 /data/mysql/logs - 修复 SELinux 上下文 (如果开启 SELinux):
restorecon -Rv /data/mysql - 启动服务:
systemctl start mysqld
第三步:迁移 Docker 数据
Docker 默认存储在 /var/lib/docker。为了迁移它,需要停止 Docker 服务并替换软链接或移动目录。
-
停止 Docker:
systemctl stop docker -
备份并移动数据:
mv /var/lib/docker /data/docker_backup # 先改名以防万一 mkdir -p /var/lib/docker ln -s /data/docker /var/lib/docker # 创建软链接 (推荐方式) # 或者直接将 /data/docker 的内容拷贝过去,然后删除原目录注意:如果之前有正在运行的容器,确保它们已经停止,否则可能导致元数据不一致。
-
配置 Docker Daemon (可选但推荐):
编辑/etc/docker/daemon.json,虽然软链接通常足够,但显式指定 root 更清晰:{ "data-root": "/data/docker", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } } -
启动 Docker:
systemctl start docker
4. 进阶优化建议
-
I/O 调度策略:
- 对于机械硬盘 (HDD),建议将 I/O 调度器设置为
deadline或mq-deadline。 - 对于 SSD,通常使用
none(noop) 或kyber(取决于内核版本),让硬件自行管理。 - 命令示例:
echo mq-deadline > /sys/block/vdb/queue/scheduler
- 对于机械硬盘 (HDD),建议将 I/O 调度器设置为
-
日志轮转 (Log Rotation):
即使数据盘很大,也务必配置日志轮转。- MySQL: 在
my.cnf中配置expire_logs_days或基于大小的max_binlog_size。 - Docker: 在
daemon.json中配置max-size和max-file,防止容器日志无限增长占满数据盘。
- MySQL: 在
-
RAID 与 LVM:
- 如果是自建物理机且对数据安全性要求极高,建议在底层使用 RAID 10 (兼顾速度与冗余)。
- 如果使用 LVM (逻辑卷管理),可以更方便地后续扩容数据盘,而无需停机重装。
-
监控告警:
部署监控(如 Prometheus + Node Exporter),专门监控/data分区的使用率。当使用率达到 80% 时触发告警,因为数据库一旦无法写入,后果比内存溢出更严重。
总结
- 系统盘:保持干净,只装系统和基础软件,限制日志大小。
- 数据盘:挂载为
/data,分别通过目录映射或软链接承载/data/mysql和/data/docker。 - 优势:这种架构下,即使系统崩溃重装,只要数据盘还在,你的数据库和容器数据就能瞬间恢复;同时也能轻松对数据盘进行单独的快照备份。
CLOUD云计算