Ceph 运维高频面试题(30 题)
一、基础架构(5 题)
Q1:Ceph 的核心组件有哪些?各自的作用是什么?
| 组件 | 作用 |
|---|
| MON | 维护集群状态图(OSD Map、PG Map、CRUSH Map),负责认证和选举(需奇数个) |
| MGR | 提供监控指标、Dashboard、REST API |
| OSD | 每个磁盘一个进程,负责数据存储、复制、恢复、再平衡 |
| RGW | 对象存储网关,提供 S3/Swift API |
| MDS | 仅用于 CephFS,管理文件元数据 |
| Client | 通过 librados 直接与 OSD 通信,不经过 MON |
Q2:CRUSH 算法是什么?有什么作用?
- 作用:代替传统中心元数据查询,客户端本地计算就能确定数据存储的 OSD 位置,去中心化。
- 原理:
(pool ID + object ID) → hash → PG 编号 → CRUSH 算法(根据 CRUSH Map 层级规则) → OSD 列表。 - 优点:数据分布均匀,支持故障域隔离(如副本分散在不同机架/主机),节点增减时仅迁移必要数据。
Q3:PG 是什么?为什么需要 PG?
- PG(Placement Group):对象的逻辑容器,将大量对象归组。
- 需要 PG 的原因:
- 若每个对象直接映射到 OSD,OSD 需要维护海量元数据。
- PG 作为中间层,OSD 只需管理 PG 级别的元数据。
- 恢复/平衡以 PG 为单位,效率更高。
- PG 数量公式:
(OSD总数 × 100) / 副本数,取接近的 2 的幂。
Q4:Ceph 三副本模式下,数据是如何写入的?
- Client 向任意 MON 获取集群拓扑(OSD Map + CRUSH Map)。
- 根据
pool ID + object ID 哈希找到 PG 编号,再用 CRUSH 算出 PG 对应的主 OSD 和从 OSD。 - Client 直连主 OSD,发送写入请求。
- 主 OSD 同时将数据写入自身和两个从 OSD,等待从 OSD 确认。
- 主 OSD 收到所有从 OSD 的 ACK 后,向 Client 回复写入成功。
- 关键点:MON 不参与数据路径,只做控制平面。
Q5:为什么 MON 节点需要奇数个?
- 防止脑裂,选举需要多数派(
> n/2)。 - 奇数个节点可以保证任意多数派不会出现平局。
- 生产环境建议 3 或 5 个 MON。
二、集群状态与健康检查(3 题)
Q6:如何快速检查 Ceph 集群健康状态?
ceph -s
ceph health detail
ceph osd tree
ceph df
ceph pg stat
Q7:集群出现 HEALTH_WARN 常见原因及处理?
| 告警 | 处理 |
|---|
OSD down | ceph osd tree 查看,重启或替换 OSD |
PG degraded | 等待自动恢复,或检查网络/磁盘 |
nearfull | 清理数据、扩容或调整全满阈值 |
mon clock skew | 检查 NTP 同步,重启 MON |
slow requests | ceph osd perf 找慢 OSD,检查磁盘 IO |
Q8:如何查看 OSD 的性能指标?
ceph osd perf
ceph daemon osd.<id> perf dump
ceph daemon osd.<id> dump_ops_in_flight
iostat -x 1
关注:fs_commit_latency < 100ms,磁盘 await、util%
三、OSD 运维(4 题)
Q9:OSD 磁盘损坏,如何替换?
systemctl stop ceph-osd@<id>
ceph osd out osd.<id>
ceph osd purge osd.<id>
ceph-deploy disk zap <node> /dev/sdb
ceph-deploy osd create --data /dev/sdb <node>
Q10:OSD 使用率不均怎么办?
Q11:如何在不影响业务的情况下恢复 OSD?
ceph tell osd.* injectargs --osd_max_backfills=1
ceph tell osd.* injectargs --osd_recovery_max_active=2
ceph osd set noout
ceph osd unset noout
Q12:OSD 进程挂掉但磁盘完好,如何处理?
systemctl restart ceph-osd@<id>
journalctl -u ceph-osd@<id> -n 100
四、PG 管理(3 题)
Q13:如何计算 PG 数量?
Q14:PG 卡在 inactive 或 peering 状态怎么办?
Q15:如何设置 PG 自动伸缩(autoscale)?
ceph osd pool set <pool> pg_autoscale_mode on
ceph osd pool autoscale-status
- 优点:自动根据 OSD 数量调整 PG 数。
- 缺点:可能频繁触发 rebalance,适合稳定集群。
五、性能优化(3 题)
Q16:针对小文件场景做了哪些优化?
| 层面 | 优化措施 |
|---|
| Bluestore | bluestore_min_alloc_size = 4096(默认 64KB) |
| RGW | rgw_obj_stripe_size = 16MB;rgw_thread_pool_size = 512 |
| OSD 内存 | osd_memory_target = 4GB |
| 业务侧 | 小文件打包成 4~8MB 再上传 |
Q17:如何提高 Ceph 的 IOPS 和吞吐量?
- 增加 OSD 数量:线性提升性能。
- 使用 SSD:作为 WAL/DB 设备或全闪。
- 分离网络:public 和 cluster 网络隔离,使用万兆网卡。
- 调整缓存:调大
osd_memory_target,开启 RBD/RGW 缓存。 - 优化 PG 数量:避免过多或过少。
Q18:如何定位集群突然变慢的问题?
ceph -s 看是否有 recovery 或 rebalance。ceph osd perf 找出延迟最高的 OSD。ceph pg dump_stuck 找出卡住的 PG。- 登录对应 OSD 节点:
iostat -x 1 检查磁盘 await、util%ceph daemon osd.<id> perf dump 查看内部延迟细分。
- 检查网络:
ping -M do -s 1472 <其他OSD> 检查 MTU 问题。
六、RGW 对象网关(3 题)
Q19:RGW 用户无法上传文件,如何排查?
- 检查 RGW 服务:
systemctl status ceph-radosgw@* - 测试端点:
curl http://<rgw-host>:7480(应返回 XML) - 检查用户 key:
radosgw-admin user info --uid=<uid> - 检查 pool 是否启用
rgw 应用标签:ceph osd pool application enable recordings_data rgw
- 查看 RGW 日志:
journalctl -u ceph-radosgw@* -f
Q20:RGW 性能瓶颈如何优化?
- CPU:调大
rgw_thread_pool_size,增加 RGW 实例数量(前挂 LB) - 网络:万兆网卡,分离 public 和 cluster 网络
- 存储:优化
rgw_obj_stripe_size,使用 SSD 做 WAL/DB - 缓存:
rgw_cache_enabled = true,rgw_cache_lru_size = 1000000
Q21:如何为 RGW 设置 bucket 生命周期(自动删除旧文件)?
cat > lifecycle.xml << EOF
<LifecycleConfiguration>
<Rule>
<ID>expire-30-days</ID>
<Status>Enabled</Status>
<Expiration><Days>30</Days></Expiration>
</Rule>
</LifecycleConfiguration>
EOF
radosgw-admin bucket lifecycle set --bucket=<bucket> --lifecycle-xml=lifecycle.xml
七、Monitor 运维(2 题)
Q22:MON 宕机了怎么办?
- 多数派存活(3 节点挂 1 个)不影响读写,只是管理面冗余降低。
- 恢复:
- 重启:
systemctl restart ceph-mon@<host> - 若无法恢复,从集群移除:
ceph mon remove <host> - 添加新 MON:
ceph-deploy mon add <new-host>
Q23:MON 日志出现 clock skew detected 怎么办?
八、扩容与快照(3 题)
Q24:如何向集群添加新的 OSD?
ceph-deploy install --release pacific <new-node>
ceph-deploy disk zap <new-node> /dev/sdb
ceph-deploy osd create --data /dev/sdb <new-node>
ceph tell osd.* injectargs --osd_max_backfills=1
Q25:如何管理 RBD 快照?
rbd snap create pool1/image1@snap1
rbd snap ls pool1/image1
rbd snap rm pool1/image1@snap1
rbd snap purge pool1/image1
rbd snap rollback pool1/image1@snap1
- 优化:避免快照链过长(>128 个影响性能),低峰期批量删除。
Q26:如何备份 Ceph 集群?
九、故障排查实战(3 题)
Q27:Ceph 和 K8s 结合使用时,Pod 挂载 RBD 卷失败,如何排查?
kubectl get pvc / kubectl get pv 查看状态- 查看 csi-rbdplugin Pod 日志:
kubectl logs -n ceph-csi-rbd - Ceph 侧检查:
rbd info <pool>/倦<, rbd status /倦<` - 检查节点是否安装
rbd-nbd 或 rbd 内核模块
Q28:遇到过最棘手的 Ceph 故障是什么?如何解决的?
(准备一个你的案例) 示例:
“一次网络交换机故障导致部分 OSD 心跳超时,多个 OSD 被标记为 down。我们立即执行 ceph osd set noout 防止迁移风暴,然后定位到故障交换机。网络恢复后,取消 noout,OSD 自动 peering,集群恢复。”
Q29:集群 full 了怎么办?
- 紧急处理:
- 删除不必要的数据(旧快照、日志)
- 临时提高阈值:
ceph osd set full_ratio 0.97
ceph osd set nearfull_ratio 0.90
- 扩容添加 OSD
- 预防:设置容量告警(85% nearfull),配置自动清理策略。
十、面试速记卡
| 主题 | 关键命令/参数 |
|---|
| 健康检查 | ceph -s, ceph health detail, ceph osd tree |
| OSD 替换 | ceph osd out, ceph osd purge, ceph-deploy osd create |
| PG 诊断 | ceph pg dump_stuck, ceph pg map, ceph pg repair |
| 小文件优化 | bluestore_min_alloc_size, rgw_obj_stripe_size |
| RGW 调试 | curl http://rgw:7480, radosgw-admin user info |
| 快照 | rbd snap create/ls/rm, rbd snap schedule |
| 限速 | osd_max_backfills, osd_recovery_max_active, noout |
| 容量 | ceph df, ceph osd df, full_ratio |