在AI基础设施的运维中,数据存储层的稳定性和可迁移性至关重要。MinIO作为高性能的对象存储解决方案,常用于存储训练数据集、模型权重和推理日志。当需要进行硬件升级、集群扩容或主机维护时,我们必须将运行在Docker中的MinIO实例及其所有数据安全地迁移到新的主机上。本文将指导您如何使用rsync工具,实现一个最小停机时间的迁移方案。
1. 理解MinIO Docker部署的核心要素
MinIO在Docker中部署时,其状态信息主要保存在两个关键位置,这些位置通常映射到宿主机卷(Volume):
- 数据卷 (/data): 存储所有的对象数据、桶结构等。这是迁移的核心。
- 配置卷 (/root/.minio** 或自定义路径)**: 存储访问密钥、用户配置、策略等元数据。这是确保服务身份不变的关键。
迁移的核心思路是: 停止旧容器 -> 传输宿主机上的数据和配置卷 -> 在新主机上使用相同的卷路径和配置启动新容器。
2. 准备阶段:旧主机操作
首先,确定您旧主机上MinIO容器的名称和宿主机卷的挂载路径。假设您的MinIO容器名为 ai-minio-server,数据和配置卷都挂载在宿主机的 /mnt/minio 目录下。
2.1 停止MinIO服务
必须在数据传输前停止容器,以确保数据的一致性。
# 确认容器名称
docker ps | grep minio
# 停止MinIO容器,保留配置和数据卷
docker stop ai-minio-server
# 确认数据卷路径 (假设是 /mnt/minio)
SOURCE_DATA_PATH="/mnt/minio"
echo "MinIO源数据路径: $SOURCE_DATA_PATH"
2.2 准备新主机
在新主机上,创建与旧主机相同的数据卷挂载点,以简化后续的Docker配置。确保新主机上已安装Docker和SSH。
# 在新主机上执行
sudo mkdir -p /mnt/minio
3. 数据迁移:使用 rsync
rsync 是进行大量文件迁移的最佳工具,因为它支持断点续传、增量同步,并且能保留文件权限和时间戳,这对于Docker卷至关重要。
假设新主机的IP地址为 192.168.1.10,用户名为 deployer。
3.1 执行 rsync 迁移
在旧主机上执行以下命令:
# 替换为新主机的实际信息
DEST_USER="deployer"
DEST_HOST="192.168.1.10"
# 注意源路径的斜杠 (/),确保复制的是 /mnt/minio 下的内容,而不是 /mnt/minio 本身
SOURCE_DIR="/mnt/minio/"
DEST_DIR="/mnt/minio"
# rsync 参数解释:
# -a: 归档模式,保留权限、所有权、时间戳等
# -v: 详细输出
# -P: 显示进度,支持断点续传 (等同于 --partial --progress)
# -z: 传输时压缩数据
rsync -avPz $SOURCE_DIR $DEST_USER@$DEST_HOST:$DEST_DIR
# 检查 rsync 退出码,0 表示成功
if [ $? -eq 0 ]; then
echo "数据同步完成,请继续下一步。"
else
echo "数据同步失败,请检查网络和权限。"
fi
4. 部署阶段:新主机操作
数据传输完成后,我们需要确保新主机上的文件权限正确,然后启动MinIO容器。
4.1 调整文件权限(关键步骤)
MinIO容器内部通常使用一个非root用户(如UID/GID 1000)来访问数据卷。如果迁移后的文件所有权不正确,容器将无法启动或写入数据。
# 在新主机上执行
# 检查当前权限
ls -ld /mnt/minio
# 赋予容器用户权限。1000:1000 是常见的非root用户ID,请根据您的MinIO镜像和运行环境进行调整。
# 如果不确定,通常设置chown -R 991:991 或 1000:1000 是安全的。
sudo chown -R 1000:1000 /mnt/minio
# 确保权限允许写入
sudo chmod -R 755 /mnt/minio
4.2 启动新的MinIO容器
使用与旧主机完全相同的Docker运行参数来启动MinIO,特别是卷映射和环境变量。
# 假设这是您原始的运行命令
docker run -d --name ai-minio-server \
-p 9000:9000 -p 9001:9001 \
-v /mnt/minio/data:/data \
-v /mnt/minio/config:/root/.minio \
-e "MINIO_ROOT_USER=YOUR_ACCESS_KEY" \
-e "MINIO_ROOT_PASSWORD=YOUR_SECRET_KEY" \
--restart always \
minio/minio:latest server /data --console-address ":9001"
5. 验证和收尾
启动容器后,等待几秒钟,然后进行验证。
- 检查容器状态:
docker logs ai-minio-server # 确保没有权限错误或启动失败信息 - 访问控制台: 尝试通过浏览器访问新主机的 9001 端口(http://192.168.1.10:9001),使用原始的 Root 账号和密码登录。
- 数据完整性检查: 登录后,检查所有旧桶(Buckets)是否都在,并随机下载几个文件验证数据完整性。
一旦新主机的MinIO服务稳定运行并验证了数据,您可以安全地删除旧主机上的容器和数据卷。
汤不热吧