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!"目录"是假象三个推论:
- 没有
ls -R:"列目录"是按 key 前缀的 LIST 查询,且按词典序分页 —— 想高效列数据,key 的命名设计(前缀分布)就是性能设计 - 没有 POSIX 锁/append:对象是不可变整体 —— "改一个字节"= 重传整个对象(multipart 分段除外)
- 无限横向扩展:没有目录树就没有元数据集中点,加上 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://mybucket5.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 服务入门
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)。