跳到主要内容

核心使用

先明确使用姿势​

对象存储的日常操作可以归成四类,本篇按这个顺序展开:

类别干什么核心命令
桶管理建桶、删桶、看桶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/
mirror 之前先 diff

--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/
rm 删不掉数据,容量却一直涨

开了版本控制后 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 命令模板,把文件路径填进去就能传。

预签名 URL 的三个坑
  • 最长 7 天:--expire 写超过 7 天会被截断,别指望拿它做长期外链。
  • 签名即授权:URL 泄露等于权限泄露,别贴到公开群聊、别写进前端代码。上传链接尤其危险,任何人都能往你的桶里写东西。
  • 依赖服务端时间:服务端时钟偏了,链接会提前失效或验签失败。

预签名还有两个实践细节:如果前面挂了 Nginx 反代,要确保 Host 头和路径原样透传,否则签名对不上;链接里带的是桶的 endpoint,别把内网地址签出去,客户端在外网根本访问不到。

小结​

  • 桶是权限和治理的单位,删桶不可逆,先看对象数再动手。
  • 对象操作记四组:cp 传、mirror 同步、rm 删、diff 比对;mirror 前先 diff。
  • 版本控制开了就不能关,rm 变成打删除标记、容量只涨不降,必须配 --versions 清理或非当前版本过期规则。
  • 生命周期把清理交给服务端扫描器,支持按前缀、标签、时间过期,也支持转储到远端 tier;规则异步生效,别指望精确到分钟。
  • 预签名 URL 最长 7 天,签名即授权,注意别把内网地址签给外网用户。

日常操作熟了,接下来该考虑可靠性:下一篇《部署与高可用》讲分布式集群、TLS 和扩容的那些坑。