核心使用
先明确使用姿势
对象存储的日常操作可以归成四类,本篇按这个顺序展开:
| 类别 | 干什么 | 核心命令 |
|---|---|---|
| 桶管理 | 建桶、删桶、看桶 | mc mb / mc rb / mc ls |
| 对象管理 | 上传、下载、复制、删除、比对 | mc cp / mc mirror / mc rm / mc diff |
| 数据治理 | 多版本、过期清理、转储 | mc version / mc ilm |
| 临时授权 | 给别人一个限时链接 | mc share |
mc 的设计很 Unix,ls、cp、rm、cat、du 一套照搬,上手成本几乎为零。更细的参数和踩坑记录在 mc 命令实战笔记 里,这里讲的是「怎么把一套桶用明白」。
桶操作
建桶与删桶
# 建桶,指定区域(不指定就用默认 us-east-1)
mc mb local/photos --region cn-north-1
# 幂等建桶:已存在不报错,适合写进部署脚本
mc mb local/photos --ignore-existing
# 删桶:只能删空桶,桶里有对象会直接拒绝
mc rb local/photos
# 强制删桶(连同桶内全部内容),不可恢复,生产环境请加上二次确认
mc rb --force --dangerous local/old-bucket
桶名规则要记牢:3 到 63 个字符、全小写、只能含字母数字和 . -、不能是 IP 形式、不能以 . 开头结尾。用大写字母建桶,S3 客户端会在签名阶段就报错,问题看着很诡异但原因很简单。
对象存储没有回收站,rb --force 之后数据就真的没了。删之前先 mc ls --recursive local/bucket | wc -l 看看有多少对象,重要的桶先 mc mirror 到别的地方。开了版本控制的桶,删桶前还要确认所有历史版本都已清掉。
看桶与看占用
# 列出所有桶
mc ls local
# 桶的详细属性:创建时间、对象数、版本控制状态、配额
mc stat local/photos
# 桶内占用(--depth 控制统计深度)
mc du local/photos
mc du --depth 2 local/photos
mc du 会真遍历对象来算大小,桶里几百万个对象时很慢。要快速看容量,用 mc admin info local 看集群层面的 Used/Available,或者用 Prometheus 的桶用量指标(见《运维与监控》)。
对象操作
上传与下载
# 单文件上传,目标以 / 结尾表示放到该前缀下
mc cp ./logo.png local/photos/2024/
# 递归上传目录
mc cp --recursive ./dist local/photos/static/
# 多个文件
mc cp ./a.png ./b.png local/photos/2024/
# 下载
mc cp local/photos/2024/logo.png ./downloads/
# 大文件断了续传(依赖服务端分片上传记录)
mc cp --continue ./backup.tar.gz local/backup/
几个实用参数:
--attr key=value:附加自定义元数据,比如--attr "Cache-Control=max-age=86400";--preserve:保留源文件的修改时间、权限等属性;--newer-than 7d/--older-than 30d:只传指定时间窗口内的对象;--storage-class:写入时指定存储类,配合纠删码校验级别或生命周期转储。
同步与比对
mc mirror 是备份和迁移的主力,默认只增不删:
# 把本地目录同步进桶(覆盖同名对象,但目标端多余的文件不动)
mc mirror --overwrite ./backup local/backup/
# 先看两端差异,只读不写,动手前必做
mc diff ./backup local/backup/
# 严格镜像:目标端多余的对象也删掉
mc mirror --overwrite --remove ./backup local/backup/
# 持续监听,文件一变就同步(准实时热备)
mc mirror --watch ./logs local/log-archive/
--remove 是有破坏性的:源端误删一个目录,同步时目标端的备份也会跟着消失。养成 diff → 确认范围 → 再 mirror 的习惯,尤其是加了 --remove 的时候。
删除与查找
# 删单个对象
mc rm local/photos/2024/old.png
# 递归删整个前缀
mc rm --recursive --force local/photos/2023/
# 按时间清理
mc rm --recursive --force --older-than 30d local/photos/tmp/
# 找大文件、找旧文件
mc find local/photos --larger 50MB
mc find local/logs --name "*.gz" --older-than 90d
# 直接看内容(排查配置、看日志头)
mc cat local/config/app.yaml
mc head -n 100 local/logs/app.log
递归删除的执行顺序是「先列再删」,对象很多时会跑很久。删亿级对象更推荐用生命周期规则让服务端自己清,比客户端循环调用高效得多。
版本控制
开启与查看
mc version enable local/photos # 开启
mc version info local/photos # 查看状态
mc version suspend local/photos # 暂停(不是关闭,历史版本保留)
版本控制一旦开启就不能真正关闭,只能暂停。暂停后新写入不再产生新版本,但已有版本仍然存在,仍然占容量。
开启之后行为变了
这是最容易让人误操作的地方:
- 覆盖对象:同名对象再传一次不会覆盖旧数据,而是产生一个新版本,旧版本原样保留。
- 删除对象:
mc rm不会真的删数据,而是在对象上打一个「删除标记」(Delete Marker)。mc ls看不到它了,但数据还在。 - 容量只增不减:不清理历史版本,桶会一直涨。
# 看所有版本,包括删除标记
mc ls --versions local/photos/2024/
# 看某个对象的所有版本
mc stat --version-id <VERSION_ID> local/photos/2024/logo.png
# 恢复某个历史版本:把指定版本重新拷成当前版本
mc cp --version-id <VERSION_ID> local/photos/2024/logo.png local/photos/2024/logo.png
# 彻底删掉所有版本(含删除标记),不可恢复
mc rm --recursive --force --versions local/photos/2023/
开了版本控制后 mc rm 只是加了删除标记,mc du 统计的容量不会下降。定期清理必须用 --versions,或者配生命周期规则自动过期非当前版本,否则桶会悄无声息地涨到告警线。
版本控制的价值在于误删恢复和勒索软件防护:对象被批量覆盖或删除时,历史版本还在,清理掉删除标记就能恢复。代价是容量翻倍甚至更多,所以只给真正需要的桶开。
生命周期规则
生命周期规则把「定期清理」从客户端脚本搬到服务端,由后台扫描器异步执行,几百万对象也不用你写循环。
过期清理
# 桶内所有对象 90 天后过期
mc ilm rule add local/logs --expire-days 90
# 只对某个前缀生效
mc ilm rule add local/logs --prefix "tmp/" --expire-days 7
# 精确到日期(一次性清理历史数据)
mc ilm rule add local/logs --prefix "2025/" --expire-date 2027-01-01
# 只对带特定标签的对象生效
mc ilm rule add local/logs --tags "type=temp" --expire-days 3
清理历史版本
# 非当前版本保留 30 天,超过就删
mc ilm rule add local/photos --noncurrent-expire-days 30
# 同时清理「删除标记」本身,避免标记堆积
mc ilm rule add local/photos --expire-delete-marker
归档转储
冷数据不必占着高性能磁盘。MinIO 支持把对象转储到远端存储层(tier),本地只留一个很小的引用:
# 先把远端存储注册成一个 tier(示例为另一个 S3 兼容服务)
mc ilm tier add s3 local cold \
--endpoint https://s3.example.com \
--access-key 'AK' --secret-key 'SK' \
--bucket archive --storage-class STANDARD
# 对象 30 天后转储到 tier
mc ilm rule add local/backup --transition-days 30 --storage-class cold
规则管理
mc ilm rule ls local/photos # 看规则列表和规则 ID
mc ilm rule rm local/photos --id <RULE_ID>
mc ilm export local/photos > rules.json # 导出备份
mc ilm import local/photos < rules.json # 批量导入
生命周期由后台扫描器按周期执行,不是到了时间点立刻删。过期对象可能多留几小时到一天,容量统计也会滞后。另外规则匹配的是对象的最后修改时间,转储和过期同时配置时,先转储再过期,否则对象可能还没转走就被删了。
预签名 URL
不想给对方开账号,又需要临时传个文件、收个文件,就用预签名 URL:服务端用密钥算一个带有效期的签名 URL,任何人在有效期内都能直接访问。
# 生成 24 小时有效的下载链接
mc share download --expire 24h local/backup/report.pdf
# 递归给整个前缀生成链接
mc share download --expire 2h --recursive local/photos/2024/
# 生成上传链接:对方可以往指定前缀传文件,看不到其他内容
mc share upload --expire 7d local/incoming/
# 查看已生成的分享列表
mc share list local
mc share upload 会打印一条 curl 命令模板,把文件路径填进去就能传。
- 最长 7 天:
--expire写超过 7 天会被截断,别指望拿它做长期外链。 - 签名即授权:URL 泄露等于权限泄露,别贴到公开群聊、别写进前端代码。上传链接尤其危险,任何人都能往你的桶里写东西。
- 依赖服务端时间:服务端时钟偏了,链接会提前失效或验签失败。
预签名还有两个实践细节:如果前面挂了 Nginx 反代,要确保 Host 头和路径原样透传,否则签名对不上;链接里带的是桶的 endpoint,别把内网地址签出去,客户端在外网根本访问不到。
小结
- 桶是权限和治理的单位,删桶不可逆,先看对象数再动手。
- 对象操作记四组:
cp传、mirror同步、rm删、diff比对;mirror 前先 diff。 - 版本控制开了就不能关,
rm变成打删除标记、容量只涨不降,必须配--versions清理或非当前版本过期规则。 - 生命周期把清理交给服务端扫描器,支持按前缀、标签、时间过期,也支持转储到远端 tier;规则异步生效,别指望精确到分钟。
- 预签名 URL 最长 7 天,签名即授权,注意别把内网地址签给外网用户。
日常操作熟了,接下来该考虑可靠性:下一篇《部署与高可用》讲分布式集群、TLS 和扩容的那些坑。