Skip to content

MinIO 迁移到 SeaweedFS

织信旧版本使用 MinIO 作为对象存储,新版本改用 SeaweedFS。两者均兼容 S3 协议,且织信的默认存储参数一致(Access Key admin、Bucket informat-next),因此迁移工作只涉及对象数据(文件)的搬运,织信本身无需修改存储配置。

安装 SeaweedFS

若目标端已通过织信安装器部署过 SeaweedFS,可跳过本节

下表为 SeaweedFS 各组件的端口与路径,如需调整请同步修改后文命令:

项目取值说明
安装目录/usr/local/seaweedfs存放 weed 二进制及配置
数据目录/data/seaweedfs卷数据与 filer 元数据,磁盘需充足
S3 端口19000对外提供 S3 API,织信通过此端口读写
Master 端口19002集群管理,仅本机访问
Volume 端口19003卷服务,仅本机访问
Filer 端口19011文件元数据,仅本机访问
Console 端口19001Web 控制台
Access KeyadminS3 访问账号
Secret Keyadmin12951bd3afeS3 访问密码
Bucketinformat-next织信使用的存储桶

WARNING

迁移场景下,SeaweedFS 的 Access Key、Secret Key、Bucket 必须与原 MinIO 完全一致,否则织信切换后无法读取存储,需要在 admin 中调整修改后的Access Key、Secret Key、Bucket。下文 s3.json 中的凭据请填原 MinIO 的实际值。

1. 准备 weed 二进制

x86(amd64)架构:

shell
cd /tmp
curl -LO https://github.com/seaweedfs/seaweedfs/releases/download/4.12/linux_amd64.tar.gz
tar -xzf linux_amd64.tar.gz
chmod +x weed

ARM(arm64/aarch64)架构:

shell
cd /tmp
curl -LO https://github.com/seaweedfs/seaweedfs/releases/download/4.12/linux_arm64.tar.gz
tar -xzf linux_arm64.tar.gz
chmod +x weed

2. 部署二进制与配置

shell
mkdir -p /usr/local/seaweedfs
cp -f weed /usr/local/seaweedfs/
mkdir -p /data/seaweedfs/files /data/seaweedfs/filerdb

创建 filer 配置 /usr/local/seaweedfs/filer.toml

shell
cat > /usr/local/seaweedfs/filer.toml << 'EOF'
[leveldb2]
enabled = true
dir = "/data/seaweedfs/filerdb"
EOF

创建 S3 凭据配置 /usr/local/seaweedfs/s3.jsonaccessKeysecretKey 填原 MinIO 的实际值:

shell
cat > /usr/local/seaweedfs/s3.json << 'EOF'
{
  "identities": [
    {
      "name": "admin",
      "credentials": [
        {
          "accessKey": "admin",
          "secretKey": "admin12951bd3afe"
        }
      ],
      "actions": ["Admin", "Read", "List", "Tagging", "Write"]
    }
  ]
}
EOF

3. 配置 systemd 服务

创建 /etc/systemd/system/seaweedfs.service

shell
cat > /etc/systemd/system/seaweedfs.service << 'EOF'
[Unit]
Description=SeaweedFS Server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/data/seaweedfs
ExecStart=/usr/local/seaweedfs/weed server -ip=127.0.0.1 -ip.bind=127.0.0.1 -dir=/data/seaweedfs/files -master.port=19002 -volume.port=19003 -filer=true -filer.port=19011 -s3=true -s3.port=19000 -s3.ip.bind=0.0.0.0 -s3.config=/usr/local/seaweedfs/s3.json
Restart=on-failure
LimitNOFILE=65536
Environment="WEED_MASTER_VOLUME_SIZE_LIMIT_MB=30000"

[Install]
WantedBy=multi-user.target
EOF

TIP

-ip.bind=127.0.0.1 让 master、volume、filer 仅监听本机,-s3.ip.bind=0.0.0.0 单独放开 S3 端口对外访问。这样既保证 S3 客户端可连接,又避免内部组件暴露到公网。

启动并设置开机自启:

shell
systemctl daemon-reload
systemctl enable seaweedfs
systemctl start seaweedfs

4. 创建存储桶

服务启动后创建织信使用的 informat-next 桶:

shell
/usr/local/seaweedfs/weed shell -master="127.0.0.1:19002" -filer="127.0.0.1:19011" <<< "s3.bucket.create -name informat-next"

验证桶已创建:

shell
/usr/local/seaweedfs/weed shell -master="127.0.0.1:19002" -filer="127.0.0.1:19011" <<< "s3.bucket.list"

输出中包含 informat-next 即表示安装完成,可继续执行下文的文件迁移。

5. 配置 Console 访问

生成 Basic Auth 密码文件(账号 admin、密码填 Secret Key 的实际值):

shell
SEAWEEDFS_HTPASSWD=$(openssl passwd -apr1 'admin12951bd3afe')
echo "admin:${SEAWEEDFS_HTPASSWD}" > /etc/nginx/.htpasswd_seaweedfs
chmod 644 /etc/nginx/.htpasswd_seaweedfs

conf.d 下新增配置 /etc/nginx/conf.d/seaweedfs.conf

shell
cat > /etc/nginx/conf.d/seaweedfs.conf << 'EOF'
server {
  listen 19001;
  server_name _;
  client_max_body_size 2000M;

  proxy_connect_timeout 1m;
  proxy_send_timeout 30m;
  proxy_read_timeout 30m;
  proxy_set_header Connection '';
  proxy_http_version 1.1;
  chunked_transfer_encoding off;
  proxy_buffering off;
  proxy_cache off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_set_header X-Forwarded-Server $host;

  auth_basic "SeaweedFS Console";
  auth_basic_user_file /etc/nginx/.htpasswd_seaweedfs;

  location / {
    proxy_pass http://127.0.0.1:19011;
    access_log /var/log/nginx/seaweedfs_console_access.log;
  }
}
EOF

检查配置并重载 nginx:

shell
nginx -t
systemctl reload nginx

完成后通过 http://<服务器IP>:19001 访问控制台,用 Access Key / Secret Key 登录。

TIP

密码文件用 openssl passwd -apr1 生成的是 Apache MD5(apr1)格式,所有 Linux 自带 openssl,无需额外安装 htpasswd 工具。若 Secret Key 含单引号,需先做转义再放入 openssl passwd -apr1 '...'

迁移前准备

  • 备份 MinIO 数据目录(默认 /data/minio_home/data),以便回滚。
  • 迁移期间建议停止 informat-biz 服务,避免产生新文件导致两端数据不一致。
  • 确认目标端磁盘剩余空间大于 MinIO 现有数据量。

下表为 MinIO 与 SeaweedFS 的存储参数示例,请以实际部署为准(默认凭据、Bucket 一致,仅 Endpoint 可能不同):

参数含义MinIO(源)SeaweedFS(目标)
EndpointS3 API 访问地址http://127.0.0.1:19000http://127.0.0.1:19000
Access Key访问密钥(账号)adminadmin
Secret Key访问密钥(密码)admin12951bd3afeadmin12951bd3afe
Bucket存储桶名称informat-nextinformat-next

TIP

同一台服务器迁移时,MinIO 与 SeaweedFS 不能占用相同端口,二者的 Endpoint 端口必然不同;不同服务器迁移时,Endpoint 的 IP 不同。请按实际情况填写下文命令中的地址。

迁移使用 MinIO 官方客户端 mc,它支持增量镜像、断点续传,适合大量小文件。根据执行迁移的机器架构下载对应版本:

x86(amd64)架构:

shell
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc

ARM(arm64/aarch64)架构:

shell
curl -O https://dl.min.io/client/mc/release/linux-arm64/mc
chmod +x mc

迁移步骤

1. 配置 mc 别名

别名(alias)是 mc 为一个 S3 服务保存的一组访问信息,配置后即可用简短的别名代替完整地址和密钥。命令格式为:

shell
./mc alias set <> <Endpoint> <AccessKey> <SecretKey>
参数含义
<别名>自定义名称,后续命令用它引用该服务,本文源端用 src、目标端用 dst
<Endpoint>S3 API 访问地址,对应上表的 Endpoint
<AccessKey>访问密钥账号,对应上表的 Access Key
<SecretKey>访问密钥密码,对应上表的 Secret Key

分别为 MinIO(源)和 SeaweedFS(目标)配置别名,将地址替换为各自实际的 S3 API 地址。

同一台服务器,两个服务监听不同端口:

shell
# 源:MinIO
./mc alias set src http://127.0.0.1:<MinIO端> admin admin12951bd3afe
# 目标:SeaweedFS
./mc alias set dst http://127.0.0.1:19000 admin admin12951bd3afe

不同服务器,按各自 IP 配置(需保证迁移机器能访问两端的 S3 端口):

shell
# 源:原服务器 MinIO
./mc alias set src http://<旧服务器IP>:19000 admin admin12951bd3afe
# 目标:新服务器 SeaweedFS
./mc alias set dst http://<新服务器IP>:19000 admin admin12951bd3afe

2. 镜像数据

shell
./mc mirror --overwrite src/informat-next dst/informat-next
参数含义
--overwrite目标已存在同名对象时覆盖
src/informat-next源:src 别名下的 informat-next Bucket
dst/informat-next目标:dst 别名下的 informat-next Bucket

mc mirror 可重复执行,仅同步差异对象。跨网络迁移耗时较长,建议配合 screen/tmux 等,避免 SSH 断开导致任务中断。

3. 校验

对比两端对象数量:

shell
echo "源对象数:$(./mc ls --recursive src/informat-next | wc -l)"
echo "目标对象数:$(./mc ls --recursive dst/informat-next | wc -l)"

数量一致后,在织信中打开若干含附件、图片的记录,确认文件可正常预览和下载。

常见问题

织信需要修改存储配置吗?

不需要。织信通过固定的 Access Key / Secret Key 及 informat-next Bucket 访问存储,MinIO 与 SeaweedFS 这些参数一致,SeaweedFS 接管后织信无感切换。若曾修改过默认凭据,请保证 SeaweedFS 的 s3.json 与原 MinIO 配置一致。

对象数量一致但部分文件打不开?

确认 SeaweedFS 的 master、volume、filer、s3 组件均已就绪,且 informat-next Bucket 已创建。可在 weed shell 中执行 s3.bucket.list 检查。

迁移完成后还能保留 MinIO 吗?

确认 SeaweedFS 数据完整、织信读写正常并稳定运行一段时间后,再停止 MinIO 并删除其数据目录,删除前请保留备份。