走啊走
加油

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

服务器价格表

在部署 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 而不移动旧数据。

  1. 停止 MySQL 服务:
    systemctl stop mysqld
  2. 复制数据到新位置 (保留权限):
    # 假设原数据在 /var/lib/mysql
    cp -aR /var/lib/mysql/* /data/mysql/
    chown -R mysql:mysql /data/mysql
    chmod 750 /data/mysql
  3. 修改配置文件 (/etc/my.cnf/etc/mysql/my.cnf):
    [mysqld]
    datadir=/data/mysql
    socket=/data/mysql/mysql.sock
    # 如果有 log_bin, 也可以考虑指向 /data/mysql/logs
  4. 修复 SELinux 上下文 (如果开启 SELinux):
    restorecon -Rv /data/mysql
  5. 启动服务:
    systemctl start mysqld

第三步:迁移 Docker 数据

Docker 默认存储在 /var/lib/docker。为了迁移它,需要停止 Docker 服务并替换软链接或移动目录。

  1. 停止 Docker:

    systemctl stop docker
  2. 备份并移动数据:

    mv /var/lib/docker /data/docker_backup  # 先改名以防万一
    mkdir -p /var/lib/docker
    ln -s /data/docker /var/lib/docker       # 创建软链接 (推荐方式)
    # 或者直接将 /data/docker 的内容拷贝过去,然后删除原目录

    注意:如果之前有正在运行的容器,确保它们已经停止,否则可能导致元数据不一致。

  3. 配置 Docker Daemon (可选但推荐):
    编辑 /etc/docker/daemon.json,虽然软链接通常足够,但显式指定 root 更清晰:

    {
      "data-root": "/data/docker",
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m",
        "max-file": "3"
      }
    }
  4. 启动 Docker:

    systemctl start docker

4. 进阶优化建议

  1. I/O 调度策略:

    • 对于机械硬盘 (HDD),建议将 I/O 调度器设置为 deadlinemq-deadline
    • 对于 SSD,通常使用 none (noop) 或 kyber (取决于内核版本),让硬件自行管理。
    • 命令示例:echo mq-deadline > /sys/block/vdb/queue/scheduler
  2. 日志轮转 (Log Rotation):
    即使数据盘很大,也务必配置日志轮转。

    • MySQL: 在 my.cnf 中配置 expire_logs_days 或基于大小的 max_binlog_size
    • Docker: 在 daemon.json 中配置 max-sizemax-file,防止容器日志无限增长占满数据盘。
  3. RAID 与 LVM:

    • 如果是自建物理机且对数据安全性要求极高,建议在底层使用 RAID 10 (兼顾速度与冗余)。
    • 如果使用 LVM (逻辑卷管理),可以更方便地后续扩容数据盘,而无需停机重装。
  4. 监控告警:
    部署监控(如 Prometheus + Node Exporter),专门监控 /data 分区的使用率。当使用率达到 80% 时触发告警,因为数据库一旦无法写入,后果比内存溢出更严重。

总结

  • 系统盘:保持干净,只装系统和基础软件,限制日志大小。
  • 数据盘:挂载为 /data,分别通过目录映射或软链接承载 /data/mysql/data/docker
  • 优势:这种架构下,即使系统崩溃重装,只要数据盘还在,你的数据库和容器数据就能瞬间恢复;同时也能轻松对数据盘进行单独的快照备份。