skip to content
LOGO CLUE
目录

背景

两台服务器都用 Docker 跑 MinIO,需要把 A 上的全部桶(大约 5.1 GB)迁移到 B。网络带宽有限,而且担心 SSH 断开或者本地电脑休眠会导致迁移中断。

这里记录一下我用 mc 配合 screen 完成迁移的过程,可以稳定地在后台运行,不需要一直守着。

第一步:安装 mc 客户端

在服务器 A 的宿主机上操作。优先使用官方地址:

Terminal window
wget https://dl.min.io/client/mc/release/linux-amd64/mc

如果下载太慢(比如只有几十 KB/s),换成国内镜像站:

Terminal window
wget https://dl.minio.org.cn/client/mc/release/linux-amd64/mc

下载完成后:

Terminal window
chmod +x mc
sudo mv mc /usr/local/bin/
mc --version # 确认安装成功

第二步:配置 MinIO 别名

Terminal window
# 源服务器 A
mc alias set source http://<A的IP>:9000 <AccessKey> <SecretKey>
# 目标服务器 B
mc alias set dest http://<B的IP>:9000 <AccessKey> <SecretKey>

验证连接是否正常:

Terminal window
mc ls source/
mc ls dest/

第三步:执行在线迁移

基础命令是:

Terminal window
mc mirror --overwrite source/ dest/

考虑到网络不太稳定,我加了几个参数:

  • --max-workers 2:限制同时上传 2 个文件,降低并发压力
  • --retry:遇到临时错误自动重试
  • --skip-errors:如果某个文件多次重试仍然失败,跳过它继续迁移其他文件

最终使用的命令:

Terminal window
mc mirror --overwrite --max-workers 2 --retry --skip-errors source/ dest/

运行后,mc 会显示每个文件的传输进度,已经传输成功的文件会自动跳过(断点续传)。以后如果 A 有新增数据,再执行一次相同命令就可以只同步增量。

遇到的两个问题

1. 网络错误:Connection closed by foreign host

大文件上传耗时较长,中间设备(防火墙或负载均衡)可能超时断开连接。加上 --retry 参数后,mc 会自动重试失败的文件,基本能解决。

2. SSH 断开导致任务中断

因为 mc mirror 在前台运行,跟 SSH 会话绑定,只要断开连接或本地电脑睡眠,任务就会被杀掉。解决办法是用 screen 把它放到后台独立运行。

第四步:使用 screen 保活迁移任务

安装 screen

Terminal window
apt update && apt install screen -y # Debian/Ubuntu

启动 screen 会话

Terminal window
screen -S minio-migrate

在 screen 中运行迁移命令

Terminal window
mc mirror --overwrite --max-workers 2 --retry --skip-errors source/ dest/ 2>&1 | tee migration.log

这里 2>&1 | tee migration.log 可以把输出同时显示在屏幕上并保存到日志文件,方便事后查看。

脱离 screen 会话

Ctrl + A,然后按 D。此时任务就在后台继续运行了,可以安全关闭 SSH 或让电脑休眠。

重新连接查看进度

Terminal window
screen -r minio-migrate

查看已有的 screen 会话

Terminal window
screen -ls

第五步:验证迁移结果

迁移完成后,对比源和目标的容量:

Terminal window
mc du source/ --recursive
mc du dest/ --recursive

或者抽查某个桶的文件数量:

Terminal window
mc ls source/某个桶 --recursive | wc -l
mc ls dest/某个桶 --recursive | wc -l

增量同步说明

后续如果 A 有新增或修改的数据,只需要再执行一次相同的 mc mirror 命令。它会自动比较并只传输变化的部分,不会重新传所有数据。

如果你希望目标端和源端完全一致(删除目标端多余的文件),可以加上 --remove 参数,但请谨慎使用。

总结

任务工具/方法
客户端mc(MinIO Client)
迁移命令mc mirror --overwrite --max-workers 2 --retry --skip-errors
断点续传mc mirror 自动支持
后台保活screen
增量同步再次运行相同命令

按以上步骤操作,即使网络不太好、本地设备关机,迁移任务也能在服务器上稳定完成。