外观
MinIO:对象存储与分布式部署
MinIO 提供 S3 兼容接口,用来替代"把文件存本地磁盘"的做法。单盘没有冗余,分布式至少要 4 块盘。
一、单节点启动
bash
cd /usr/local/bin
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio --versiontext
minio version RELEASE.2026-10-15T00-00-00Z (commit-id=...)
Runtime: go1.23 linux/amd64bash
useradd -r -s /sbin/nologin minio
mkdir -p /data/minio
chown -R minio:minio /data/minioini
# /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.targetbash
systemctl daemon-reload
systemctl enable --now minio
journalctl -u minio -n 20 --no-pagertext
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两个端口:
| 端口 | 用途 |
|---|---|
| 9000 | S3 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/publictext
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 myminiotext
● 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 个节点)| 盘数 | 默认校验 | 可用率 | 容忍故障 |
|---|---|---|---|
| 4 | 2 | 50% | 2 |
| 8 | 4 | 50% | 4 |
| 8 | 2(自定义) | 75% | 2 |
| 16 | 4 | 75% | 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/403 | AK/SK 错或策略不允许 | mc alias 重设,查 policy |
| 容量突然不涨但文件在 | 纠删码开销 | 实际占用是原始大小的 2 倍 |
| 集群扩容后数据不均 | 需要 rebalance | mc 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 |