Skip to content

MinIO:对象存储与分布式部署 ​

MinIO 提供 S3 兼容接口,用来替代"把文件存本地磁盘"的做法。单盘没有冗余,分布式至少要 4 块盘。

一、单节点启动 ​

bash
cd /usr/local/bin
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio --version
text
minio version RELEASE.2026-10-15T00-00-00Z (commit-id=...)
Runtime: go1.23 linux/amd64
bash
useradd -r -s /sbin/nologin minio
mkdir -p /data/minio
chown -R minio:minio /data/minio
ini
# /etc/default/minio
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=MinioPass!2026
MINIO_VOLUMES=/data/minio
MINIO_OPTS="--console-address :9001"
ini
# /etc/systemd/system/minio.service
[Unit]
Description=MinIO
After=network-online.target
Wants=network-online.target

[Service]
User=minio
Group=minio
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
bash
systemctl daemon-reload
systemctl enable --now minio
journalctl -u minio -n 20 --no-pager
text
MinIO Object Storage Server
Copyright: 2015-2026 MinIO, Inc.
License: GNU AGPLv3
Version: RELEASE.2026-10-15T00-00-00Z

API: http://10.0.0.61:9000  http://127.0.0.1:9000
WebUI: http://10.0.0.61:9001  http://127.0.0.1:9001

两个端口:

端口用途
9000S3 API
9001控制台

二、mc 客户端 ​

bash
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc && mv mc /usr/local/bin/

mc alias set myminio http://10.0.0.61:9000 admin 'MinioPass!2026'
text
Added `myminio` successfully.
bash
mc mb myminio/backup
mc cp /data/backup/app-2026-10-27.tar.gz myminio/backup/
mc ls myminio/backup/
text
Bucket created successfully `myminio/backup`.

/data/backup/app-2026-10-27.tar.gz:  184.21 MiB / 184.21 MiB  [====================] 100.00%  62.41 MiB/s  3s

[2026-10-27 23:41:02 CST] 184MiB STANDARD app-2026-10-27.tar.gz

常用命令:

bash
mc ls myminio                       # 桶列表
mc du myminio/backup                # 用量
mc stat myminio/backup/app.tar.gz   # 对象信息
mc rm myminio/backup/app.tar.gz
mc mirror /data/backup myminio/backup --overwrite
mc admin info myminio               # 集群信息

三、桶与访问策略 ​

bash
mc anonymous set download myminio/public
mc anonymous get myminio/public
text
Access permission for `myminio/public` is `download`

四种预设策略:

策略含义
none私有(默认)
download匿名可读
upload匿名可写
public匿名可读写(危险)

不要用 public

mc anonymous set public 等于把桶变成公开网盘,任何人都能上传和删除。静态资源用 download 就够。

生成临时访问凭证(给前端直传用):

bash
mc admin user add myminio uploader 'UploadPass!2026'
mc admin policy attach myminio writeonly --user uploader

四、分布式部署 ​

至少 4 个节点/4 块盘,用纠删码(Erasure Coding)提供冗余。

ini
# 4 台机器都装好 minio,/etc/default/minio 写:
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=MinioPass!2026
MINIO_VOLUMES="http://10.0.0.61/data/minio http://10.0.0.62/data/minio http://10.0.0.63/data/minio http://10.0.0.64/data/minio"
MINIO_OPTS="--console-address :9001"

四个地址要全部写全。EnvironmentFile 不经过 shell,不会做花括号展开——命令行里可以写 http://10.0.0.{61..64}/data/minio,但配置文件里不行。

四台的 MINIO_VOLUMES 完全一致,启动顺序无所谓,但要求:

  • 所有节点时间同步(偏差 < 15 分钟)。
  • 9000 端口互通。
  • 每块盘大小一致(不一致按最小的算)。
bash
systemctl restart minio
mc admin info myminio
text
●  10.0.0.61:9000
   Uptime: 2 minutes
   Version: 2026-10-15T00-00-00Z
   Network: 4/4 OK
   Drives: 1/1 OK

●  10.0.0.62:9000
   ...

Network: 4/4 OK 表示与其他三个节点都通。Drives: 1/1 OK 表示本地盘正常。

五、纠删码怎么算容量 ​

假设 4 节点、每节点 1 块 1TB 盘:

text
总原始容量 = 4 × 1TB = 4TB
默认 EC 配置 = 2 数据 + 2 校验
可用容量 = 4TB × (2/4) = 2TB
可容忍故障 = 2 块盘(或 2 个节点)
盘数默认校验可用率容忍故障
4250%2
8450%4
82(自定义)75%2
16475%4

单块盘 = 没有冗余

minio server /data/minio 单目录启动时,数据就是普通文件,盘坏即丢。生产必须用分布式 + 纠删码,或者依赖云盘快照。

另外:分布式一旦用单盘启动过,不能直接加盘升级成纠删码,必须新建集群再迁移。

六、与云 OSS 的取舍 ​

维度MinIO阿里云 OSS
成本自建服务器 + 磁盘按量付费
运维自己负责扩容/监控/备份厂商负责
延迟内网极低跨网有延迟
容量受磁盘限制近乎无限
合规数据在自己手里需评估
功能S3 核心 API更丰富(图片处理、CDN 等)

判断标准:数据量 < 100TB、有稳定机房、需要内网低延迟 → MinIO 划算;否则用云对象存储。

七、常见故障 ​

现象原因处置
控制台打不开只开了 9000开 9001
分布式节点不在线时间偏差 > 15 分钟配 NTP
Drive ... is not formatted盘里已有数据换空目录,或加 --force 谨慎处理
上传大文件失败反向代理的 body 限制Nginx client_max_body_size 0
401/403AK/SK 错或策略不允许mc alias 重设,查 policy
容量突然不涨但文件在纠删码开销实际占用是原始大小的 2 倍
集群扩容后数据不均需要 rebalancemc admin rebalance start myminio

八、Nginx 前置 ​

nginx
server {
    listen 443 ssl;
    server_name s3.example.com;

    client_max_body_size 0;
    chunked_transfer_encoding off;

    location / {
        proxy_pass http://10.0.0.61:9000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

client_max_body_size 0 和 proxy_buffering off 是必须的,否则大文件上传会被截断或占满内存。

九、踩过的坑 ​

现象根因处置
单节点跑得很欢,一坏全丢没有纠删码上分布式
4 节点只有 1 个在线时间不同步/端口不通NTP + 开 9000
上传到 99% 失败Nginx 默认 1MB 限制client_max_body_size 0
桶名报错名字含下划线或大写只能小写字母、数字、点、连字符
删除后空间没释放开了版本控制删版本或配生命周期
mc mirror 很慢单线程小文件加 --concurrency,或先打包
控制台登录失败环境变量没生效检查 EnvironmentFile