Skip to content

MinIO对象存储

MinIO 是 S3 兼容对象存储,常用于备份、图片、日志归档、制品仓库、数据湖入口和内网对象存储。对象存储和文件系统不同:它不提供传统目录树和 POSIX 文件语义,核心对象是 bucket、object、key、policy、access key 和 lifecycle。

对象存储适合“按对象上传、下载、保留、归档”的场景。它不提供本地文件系统那种 open()rename()append() 语义。业务如果需要大量随机写、文件锁、目录遍历,NFS、CephFS 或块存储通常更合适。

MinIO 的授权也单独放一条。社区版按 GNU AGPLv3 发布,商业支持和企业功能走 MinIO SUBNET / 商业授权。公司内部落地时,除了技术能不能跑,还要确认许可证、镜像来源、升级通道和支持方式。

一、S3 基本概念

概念说明
bucket存放对象的桶,类似顶层命名空间
object一个对象,包含数据和元数据
key对象名,比如 logs/2026/05/app.log
region区域信息,S3 API 里常见
access key访问身份
secret key访问密钥
policy允许或拒绝哪些 API 操作
lifecycle对象过期、转储、清理规则

对象 key 看起来像路径,但本质是字符串。logs/2026/05/app.log 不是传统文件系统里的多级目录,只是 key 里包含 /。控制台和客户端会把它展示成目录形态。

MinIO 基本链路:

二、部署形态

常见形态:

形态说明场景
单节点单盘一个进程一块盘本地测试
单节点多盘一个节点多块盘,使用纠删码小规模内部存储
多节点多盘多台机器多块盘,分布式纠删码生产或准生产

生产里更常见多节点多盘。MinIO 通过 erasure coding 在多块盘之间分散对象,允许一定数量磁盘或节点故障。可用容量和容忍故障数取决于节点数、磁盘数和奇偶校验配置。

MinIO 更适合提前规划节点数、磁盘数、域名、TLS、访问密钥和备份策略,不适合做成“今天一台、明天两台、后天又换盘”这种随意变化的形态。

纠删码可以近似理解成把对象切成数据块和校验块,分散写到多个磁盘。坏掉一部分磁盘时,只要剩余块足够,数据还能恢复。它不是简单三副本,容量利用率通常比三副本高,但恢复和磁盘布局对集群规划更敏感。

几个关键词:

概念说明
erasure set一组参与纠删码的数据盘
parity校验块数量,影响容错能力
pool / server pool一组 MinIO 服务器和磁盘,扩容时常见
healing磁盘或节点恢复后自动修复对象

对象存储容量规划要同时看可用容量和故障容忍。只看裸盘总容量,很容易高估能给业务使用的空间。

三、单节点实验部署

创建用户和目录:

bash
# 使用专用用户运行 MinIO,避免用 root 跑长期服务
useradd -r -s /sbin/nologin minio-user || true
mkdir -p /data/minio
chown -R minio-user:minio-user /data/minio

下载二进制:

bash
curl -L https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio
chmod +x /usr/local/bin/minio

环境变量文件:

bash
cat > /etc/default/minio <<'EOF'
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=ChangeMe_123456
MINIO_VOLUMES="/data/minio"
MINIO_OPTS="--address :9000 --console-address :9001"
EOF
chmod 600 /etc/default/minio

systemd unit:

ini
[Unit]
Description=MinIO Object Storage
After=network-online.target
Wants=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

写入 unit:

bash
cat > /etc/systemd/system/minio.service <<'EOF'
[Unit]
Description=MinIO Object Storage
After=network-online.target
Wants=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now minio
systemctl status minio --no-pager

实验环境可以这样跑通概念。生产环境要换强密码、TLS、独立磁盘、反向代理或负载均衡、监控和备份。

四、分布式部署

示例四节点,每台四块盘:

主机数据盘
minio01/data1 /data2 /data3 /data4
minio02/data1 /data2 /data3 /data4
minio03/data1 /data2 /data3 /data4
minio04/data1 /data2 /data3 /data4

所有节点使用相同的 MINIO_VOLUMES

bash
cat > /etc/default/minio <<'EOF'
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=ChangeMe_123456
MINIO_VOLUMES="http://minio{01...04}:9000/data{1...4}"
MINIO_OPTS="--address :9000 --console-address :9001"
EOF

每台节点的 systemd unit 保持一致。四台机器都启动后,MinIO 会组成一个分布式集群。

bash
systemctl daemon-reload
systemctl enable --now minio
journalctl -u minio -n 100 --no-pager

分布式 MinIO 对主机名解析很敏感。minio{01...04} 要在所有节点上都能解析到正确 IP,时间同步、防火墙、磁盘挂载也要提前确认。

生产里所有节点的配置要保持一致:

项目说明
MINIO_VOLUMES所有节点一致,包含完整 server pool
root 凭据所有节点一致
磁盘路径每台节点都存在并已挂载
时间同步认证、复制和日志排查都依赖时间
TLS 证书多节点域名和负载均衡入口要覆盖

磁盘路径最容易出低级问题:系统重启后 /data1 没挂载,MinIO 可能把系统盘目录当成数据盘使用。生产节点要用 /etc/fstab、UUID、挂载检查和监控把这个问题提前挡住。

五、mc 客户端

安装 mc

bash
curl -L https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
chmod +x /usr/local/bin/mc

配置 alias:

bash
# alias 相当于给一个 S3 endpoint 起名字,后续命令都用 localminio
mc alias set localminio http://127.0.0.1:9000 minioadmin ChangeMe_123456
mc admin info localminio

创建 bucket:

bash
mc mb localminio/backups
mc ls localminio

上传和下载:

bash
echo "hello minio" > /tmp/hello.txt
mc cp /tmp/hello.txt localminio/backups/hello.txt
mc cat localminio/backups/hello.txt

查看对象:

bash
mc ls localminio/backups
mc stat localminio/backups/hello.txt

mc 是 MinIO 运维里最常用的入口。控制台适合看状态和临时操作,批量任务、权限、生命周期和复制更适合写成 mc 命令。

六、用户和策略

创建应用用户:

bash
mc admin user add localminio backup-app BackupApp_123456

策略文件:

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::backups",
        "arn:aws:s3:::backups/*"
      ]
    }
  ]
}

应用策略:

bash
# 把策略添加到 MinIO,再绑定给 backup-app 用户
mc admin policy create localminio backup-readwrite backup-policy.json
mc admin policy attach localminio backup-readwrite --user backup-app

验证:

bash
mc alias set backup http://127.0.0.1:9000 backup-app BackupApp_123456
mc ls backup/backups
mc cp /tmp/hello.txt backup/backups/hello-from-app.txt

应用侧使用独立用户。root 凭据适合初始化和管理,不适合写到业务配置里。

七、生命周期和版本

生命周期规则用于自动清理旧对象或旧版本。比如备份桶保留 30 天:

bash
cat > lifecycle.json <<'EOF'
{
  "Rules": [
    {
      "ID": "expire-old-backups",
      "Status": "Enabled",
      "Expiration": {
        "Days": 30
      },
      "Filter": {
        "Prefix": ""
      }
    }
  ]
}
EOF

mc ilm import localminio/backups < lifecycle.json
mc ilm ls localminio/backups

开启版本控制:

bash
mc version enable localminio/backups
mc version info localminio/backups

版本控制能降低误覆盖风险,但会增加容量占用。开启前要配合生命周期,否则旧版本会长期占空间。

八、TLS 和访问入口

内网测试可以 HTTP,生产更适合 HTTPS。MinIO 自身支持证书,也可以放在 Nginx、HAProxy、云 LB 后面。

常见入口:

入口说明
API 端口 9000S3 客户端访问
Console 端口 9001Web 控制台
负载均衡多节点前面统一入口
TLS 证书避免 access key 和数据明文传输

防火墙:

bash
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=9001/tcp
firewall-cmd --reload

如果放反向代理,大文件上传、超时、请求体大小和 WebSocket/控制台代理配置都要一起看。对象上传失败不一定是 MinIO 本身,入口层超时和 body 限制也很常见。

九、备份和复制

MinIO 自身是对象存储,不等于业务数据备份已经完成。备份还要看对象是否跨集群、跨机房或跨介质保存。

常见方式:

方式说明
mc mirror把一个 bucket 镜像到另一个 endpoint
bucket replicationMinIO 内建桶复制
versioning防误覆盖、误删
lifecycle过期清理
object lock合规保留,防删除

简单镜像:

bash
# 把 localminio/backups 同步到 remote/backups,适合作为备份任务基础
mc mirror --overwrite --remove localminio/backups remote/backups

--remove 会删除目标端多余对象。备份任务里用它前,目标端应当是镜像副本,而不是长期归档桶。

站点复制更适合两个 MinIO 集群之间做灾备:

bash
# 示例只表达入口,实际需要配置两个 alias,并确认版本、TLS、网络和权限
mc admin replicate add site-a site-b
mc admin replicate info site-a

bucket replication 更适合按 bucket 复制:

bash
# 开启版本控制是复制和误删恢复的重要前提
mc version enable localminio/backups
mc replicate add localminio/backups --remote-bucket remote/backups
mc replicate ls localminio/backups

对象锁适合合规保留和防勒索删除,但开启后删除流程会受到限制。这个功能适合在业务、合规和运维之间先约定清楚,再进入生产配置。

十、扩容和 healing

MinIO 扩容通常按 server pool 增加,不是随便往原有节点里塞一块盘就结束。新增 pool 后,新对象会按 MinIO 的规则写入新旧 pool,历史对象不会自动均匀重分布到所有磁盘。

扩容前记录这些信息:

项目说明
节点数和磁盘数新 pool 规模要符合纠删码要求
磁盘挂载所有磁盘路径稳定挂载
域名解析所有节点能互相访问
负载均衡新节点是否进入入口
监控新 pool 容量和 healing 指标是否纳入

查看集群状态:

bash
mc admin info localminio
mc admin heal localminio --scan

磁盘或节点恢复后,MinIO 会 healing。手动查看:

bash
# recursive 会扫描 bucket 下对象,数据量大时会增加集群负载
mc admin heal localminio/backups --recursive

healing 期间要看磁盘、网络和 S3 延迟。对象数量很多时,扫描本身也会带来压力。

十一、监控和排查

服务状态:

bash
systemctl status minio --no-pager
journalctl -u minio -n 100 --no-pager
mc admin info localminio

健康检查:

bash
curl -I http://127.0.0.1:9000/minio/health/live
curl -I http://127.0.0.1:9000/minio/health/ready

常见故障:

现象判断方向
控制台打不开9001 端口、防火墙、反向代理
S3 访问 403access key、policy、bucket 权限
上传大文件失败入口超时、body 限制、磁盘空间
节点离线systemd、磁盘挂载、网络、主机名解析
容量不释放版本控制、对象锁、生命周期未生效
集群启动失败节点数、磁盘路径、环境变量不一致

查看磁盘:

bash
df -h
lsblk
du -sh /data*/minio 2>/dev/null

Prometheus 指标通常通过 MinIO 暴露的 metrics endpoint 抓取。日常重点看节点在线、磁盘在线、容量水位、S3 请求错误率、延迟和 healing 状态。

补充几个排查分支:

现象方向
healing 长时间不结束对象数量、坏盘、网络、目标磁盘慢
某节点启动后反复退出MINIO_VOLUMES 不一致、磁盘路径缺失、权限
复制延迟两端网络、版本控制、目标桶权限、对象数量
删除后容量不降versioning、object lock、lifecycle 未生效
API 正常但 Console 异常9001、反向代理、WebSocket、浏览器证书

十二、适用边界

适合 MinIO 的场景:

场景说明
备份文件MySQL 备份、日志归档、制品包
图片和附件Web 应用对象文件
数据交换脚本、任务、数据平台交付文件
内部 S3开发测试、私有化环境

不太适合的场景:

场景原因
数据库数据目录对象存储不是块设备
需要 POSIX 文件锁S3 没有传统文件系统语义
频繁追加写一个文件对象通常是整体 PUT
大量目录级 renamekey 语义和文件系统不同

对象存储的优势在于 API、扩展性和对象生命周期。把它硬挂成文件系统给旧应用用,很多时候只是把问题延后到一致性、性能和错误处理上。