Skip to content

5. 对象存储 RGW

本章目标

  • 部署 RGW 并用 S3 客户端完成 bucket/对象全流程
  • 理解对象存储与文件存储的本质差异
  • 理解 bucket index 与多站点复制的机制与边界

5.1 对象存储的心智模型

忘掉目录树。对象存储是扁平的 bucket + key 命名空间

text
file:   /photos/2026/08/trip.jpg     ← 路径有层级语义(目录可遍历)
object: s3://mybucket/photos/2026/08/trip.jpg   ← 整串只是 key!"目录"是假象

三个推论:

  1. 没有 ls -R:"列目录"是按 key 前缀的 LIST 查询,且按词典序分页 —— 想高效列数据,key 的命名设计(前缀分布)就是性能设计
  2. 没有 POSIX 锁/append:对象是不可变整体 —— "改一个字节"= 重传整个对象(multipart 分段除外)
  3. 无限横向扩展:没有目录树就没有元数据集中点,加上 S3 API 的行业标准地位,对象存储天然适合海量/多云/备份场景

5.2 部署与使用

bash
# 部署(cephadm 托管,无状态可水平扩)
ceph orch apply rgw myrgw:3        # 3 个网关实例

# 创建用户并配置客户端
radosgw-admin user create --uid=s3user --display-name="S3 User"
#   记下输出的 access_key / secret_key

# aws cli(或 s3cmd/mc)
aws configure                              # 填入 key 与 endpoint
aws --endpoint-url http://<rgw>:80 s3 mb s3://mybucket
aws --endpoint-url http://<rgw>:80 s3 cp ./bigfile s3://mybucket/
aws --endpoint-url http://<rgw>:80 s3 ls s3://mybucket

5.3 bucket index:第一个性能知识点

RGW 为每个 bucket 维护索引对象(记录 key→rados 对象映射,支撑 LIST)。默认单索引对象 —— 大 bucket 必须开 shard

bash
radosgw-admin bucket stats --bucket=mybucket     # 看 num_shards 与对象数
# 新建 bucket 预设分片:
radosgw-admin zone placement modify ... (或部署时配 bucket_index_max_shards)

经验阈值:单索引对象撑到百万级 entry 后 LIST 显著变慢;分片数按预期对象总数 / 每 10 万 取量级。超大规模(亿级)考虑 index-less bucket(放弃 LIST 换吞吐,适合备份/日志类只写场景)。

小对象 vs 大对象的吞吐画像(Lab 会实测):小对象瓶颈在 RGW 进程 CPU 与每请求的固定开销(一次 PUT = 多次 RADOS 写 + 索引更新);大对象瓶颈在网卡带宽与 EC 落盘速度。容量规划时两种负载要分开估算第 7 章)。

5.4 多站点与生命周期

multisite 异步复制:realm(信任域)→ zonegroup(同步域)→ zone(一套 RGW+pool)。两个 zone 之间双向/单向同步对象与元数据,用于异地容灾或就近写入。要点:异步意味着故障切换窗口内有数据延迟(RPO ≠ 0),金融级强一致别指望它。

生命周期规则:S3 原生能力,RGW 支持 —— 典型冷热分层:

text
上传 → 标准池(ssd/副本) → 30 天 → 自动迁移到 EC 池(hdd) → 365 天 → 过期删除

这是"热数据用副本买性能、冷数据用 EC 买容量"在对象侧的标准落地。

本章小结

  • 对象存储 = 扁平 key + 不可变对象 + 无限扩展;key 命名即性能设计
  • RGW 无状态可横扩;大 bucket 必须开 index shard(或 index-less)
  • 小对象瓶颈在 CPU/请求开销,大对象在带宽 —— 容量分开算
  • multisite 是异步容灾(RPO>0);生命周期做冷热分层

自测

Quiz把 s3://bucket/a/b/c.txt 的「目录」 a/b 删掉,会发生什么?
多选以下哪些是 RGW 相对 CephFS 的优势场景?(多选)
🧪Lab · 搭一个自己的 S3 服务入门
⏱ 45 分钟🖥 Ceph 实验集群
1. `ceph orch apply rgw`,创建用户并用 aws cli 配置 endpoint 与凭证。 2. 脚本化上传 **1 万个 1MB 小对象**(`for i in $(seq 10000); do aws s3 cp ... done` 或用 s5cmd 加速对照),记录总耗时与平均 TPS。 3. 再上传 **10 个 1GB 大对象**,记录吞吐。 4. `radosgw-admin bucket stats` 查看 index 与对象数;配一条生命周期规则(1 天过期),次日验证对象被清理。 5. **验收标准**:算出小对象 TPS 与大对象 MB/s 两张画像,解释瓶颈差异来自哪里(CPU/请求开销 vs 带宽/EC)。

上一章 · 下一章:6. 日常运维与故障处理 →