闯关:对象存储 5xx 激增
监控报 RGW 错误率飙升,但 Ceph 集群显示 HEALTH_OK。
学完这节你能做到
- 在集群健康的情况下定位网关层故障
- 把 RGW 的报错映射到 index 池与分片问题
- 给出既能救急又能治本的处置方案
场景
周一上午 10:30,监控告警:
[P1] RGW 5xx 错误率 12.4%(阈值 1%),持续 8 分钟
业务方同步反馈:备份任务大量失败,报 503 SlowDown;但另一个组说他们的图片上传一切正常。
你敲 ceph -s,返回 HEALTH_OK。
HEALTH_OK 只说明 RADOS 层没问题。RGW 是架在 RADOS 之上的网关,它自己的瓶颈(index 池热点、bucket 分片、网关并发、LB 配置)不会体现在 ceph -s 里。
这类"集群健康但业务报错"的场景,排查重点在网关层和它依赖的元数据池,而不是 OSD。
- 1.确认 RGW 网关侧的错误与积压情况
- 2.定位到出问题的 bucket,看它的对象数与分片数
- 3.对照一个正常的 bucket,验证判断
- 4.确认 index 池的冗余方式与所在介质
- 5.确认默认规则选中的是哪一类设备
- 6.确认集群里是否存在混合介质
模拟终端:RGW 5xx 激增,但 ceph -s 显示 HEALTH_OK。 部分业务正常、部分业务失败 —— 这个差异是重要线索。 输入 goals 看目标,hint 要提示。
复盘
结论:backup-prod bucket 有 4.13 亿个对象但仅 11 个索引分片(平均每片 3750 万对象),且 buckets.index 池未限定 device class,部分索引 PG 落在 HDD 上(延迟 400ms 量级)。索引读写成为瓶颈,RGW 请求队列打满(qlen = qactive = 1024),新请求被拒绝返回 503 SlowDown。
images-prod 因分片充足(128 片 / 841 万对象)未受影响——这解释了"部分业务正常"的现象。
处置分两步:
# ── 救急(分钟级)──
# 1. 让备份任务降低并发,先把队列压力降下来
# (沟通比命令更有效:告诉业务方并发从 64 降到 8)
# 2. 临时扩大 RGW 请求队列与线程数,缓解排队
ceph config set client.rgw rgw_max_req_queue_len 4096
ceph config set client.rgw rgw_thread_pool_size 1024
ceph orch restart rgw.s3
# ── 治本(需要窗口)──
# 3. 把 index 池限定到 SSD —— 这是最高优先级的一步
ceph osd crush rule create-replicated ssd-rule default host ssd
ceph osd pool set default.rgw.buckets.index crush_rule ssd-rule
# 4. 对 backup-prod 重新分片(会阻塞该 bucket 写入,必须选窗口)
radosgw-admin bucket reshard --bucket=backup-prod --num-shards=4096
# 5. 修正全局默认值,避免新 bucket 重蹈覆辙
ceph config set client.rgw rgw_override_bucket_index_max_shards 128
对一个 4 亿对象的 bucket 做 reshard,期间该 bucket 的写入会被阻塞,耗时可能长达数小时。
执行前必须:
- 和业务方约定停写窗口,而不是"顺手做一下"
- 先确认 index 池已经在 SSD 上(否则 reshard 本身会慢得离谱)
- 评估是否更适合拆成多个 bucket —— 单 bucket 4 亿对象本身就是设计问题
最好的解法是这个 bucket 当初创建时就把分片设够。 这也是为什么"预计存多少对象"必须在设计阶段就问清楚。
只要集群里有 HDD,所有元数据类的池都必须显式限定 device class:
*.rgw.buckets.index*.rgw.meta、*.rgw.logcephfs.*.meta- RBD 池的元数据(如果单独分池)
默认的 replicated_rule 不限定介质,PG 会随机落到 HDD 上。这个隐患在集群刚建好、数据量小的时候完全看不出来,等到规模上来才集中爆发——正如这一关的场景。
ceph -s 显示 HEALTH_OK,但 RGW 大量返回 503。这说明什么?
一个 bucket 有 4 亿对象、11 个索引分片。按规划口径,分片数应该是多少量级?
混闪集群里,下面哪些池必须显式限定 device class 到 SSD?(多选)
这一关的落点
ceph -s只覆盖 RADOS 层,网关层问题要用ceph daemon rgw.<name> perf dump看qlen = qactive说明请求队列打满,客户端会收到 503 SlowDown- 部分 bucket 正常、部分异常 → 用
bucket stats做对照,快速锁定 - 索引分片按每片约 10 万对象规划,建 bucket 时设够,事后 reshard 要阻塞写入
- 混闪集群里所有元数据池都必须显式限定 device class
- 处置分救急(降并发、扩队列)和治本(换介质、reshard、改默认值)两层
延伸资料
- ·k8s-in-action
storage/cephadm/5-deploy-rgw.md - ·k8s-in-action
storage/rook/rgw/README.md