【无标题】

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 三副本模式下,数据是如何写入的?

  1. Client 向任意 MON 获取集群拓扑(OSD Map + CRUSH Map)。
  2. 根据 pool ID + object ID 哈希找到 PG 编号,再用 CRUSH 算出 PG 对应的主 OSD 和从 OSD。
  3. Client 直连主 OSD,发送写入请求。
  4. 主 OSD 同时将数据写入自身和两个从 OSD,等待从 OSD 确认。
  5. 主 OSD 收到所有从 OSD 的 ACK 后,向 Client 回复写入成功。
  6. 关键点:MON 不参与数据路径,只做控制平面。

Q5:为什么 MON 节点需要奇数个?

  • 防止脑裂,选举需要多数派(> n/2)。
  • 奇数个节点可以保证任意多数派不会出现平局。
  • 生产环境建议 3 或 5 个 MON。

二、集群状态与健康检查(3 题)

Q6:如何快速检查 Ceph 集群健康状态?

ceph -s               # 全局状态
ceph health detail    # 详细告警
ceph osd tree         # OSD 状态树
ceph df               # 容量使用
ceph pg stat          # PG 状态汇总

Q7:集群出现 HEALTH_WARN 常见原因及处理?

告警处理
OSD downceph osd tree 查看,重启或替换 OSD
PG degraded等待自动恢复,或检查网络/磁盘
nearfull清理数据、扩容或调整全满阈值
mon clock skew检查 NTP 同步,重启 MON
slow requestsceph osd perf 找慢 OSD,检查磁盘 IO

Q8:如何查看 OSD 的性能指标?

ceph osd perf                              # 实时延迟(commit/apply latency)
ceph daemon osd.<id> perf dump             # 详细性能计数器
ceph daemon osd.<id> dump_ops_in_flight    # 当前正在处理的请求
iostat -x 1                                # 磁盘 IO 状态

关注:fs_commit_latency < 100ms,磁盘 awaitutil%


三、OSD 运维(4 题)

Q9:OSD 磁盘损坏,如何替换?

# 1. 停掉故障 OSD
systemctl stop ceph-osd@<id>
# 2. 标记为 out(数据开始迁移)
ceph osd out osd.<id>
# 3. 等待数据迁移完成(监控 ceph -s)
# 4. 从集群中移除
ceph osd purge osd.<id>
# 5. 物理更换磁盘
# 6. 重新创建 OSD
ceph-deploy disk zap <node> /dev/sdb
ceph-deploy osd create --data /dev/sdb <node>

Q10:OSD 使用率不均怎么办?

  • 原因:PG 分布不均、CRUSH weight 设置不当、扩容后未平衡。
  • 处理
    ceph osd df                                    # 查看使用率
    ceph osd reweight-by-utilization              # 自动调整
    ceph osd crush reweight osd.<id> 0.8          # 手动降低权重
    
  • 预防:设置合理的 PG 数量,启用 balancer 模块。

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 数量?

  • 公式(OSD总数 × 100) / 副本数,取接近的 2 的幂。
  • 示例:10 个 OSD,三副本 → (10×100)/3 ≈ 333,取 512
  • 查看命令
    ceph osd pool get <pool> pg_num
    ceph osd df | grep pg
    
  • 调整(只能增加,不能减少):
    ceph osd pool set <pool> pg_num 512
    ceph osd pool set <pool> pgp_num 512
    

Q14:PG 卡在 inactive 或 peering 状态怎么办?

  • inactive:PG 无法提供服务,通常因 OSD 离线或网络分区。
    ceph pg dump_stuck inactive     # 找出卡住的 PG
    ceph pg map <pgid>              # 查看所在 OSD
    # 检查对应 OSD 状态,重启或修复
    
  • peering:PG 正在建立主从关系,长时间无果可能是网络问题或 OSD 版本不一致。
  • 极端修复ceph pg repair <pgid>(有数据丢失风险)。

Q15:如何设置 PG 自动伸缩(autoscale)?

# 为 pool 启用自动伸缩
ceph osd pool set <pool> pg_autoscale_mode on

# 查看建议
ceph osd pool autoscale-status
  • 优点:自动根据 OSD 数量调整 PG 数。
  • 缺点:可能频繁触发 rebalance,适合稳定集群。

五、性能优化(3 题)

Q16:针对小文件场景做了哪些优化?

层面优化措施
Bluestorebluestore_min_alloc_size = 4096(默认 64KB)
RGWrgw_obj_stripe_size = 16MBrgw_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:如何定位集群突然变慢的问题?

  1. ceph -s 看是否有 recovery 或 rebalance。
  2. ceph osd perf 找出延迟最高的 OSD。
  3. ceph pg dump_stuck 找出卡住的 PG。
  4. 登录对应 OSD 节点:
    • iostat -x 1 检查磁盘 awaitutil%
    • ceph daemon osd.<id> perf dump 查看内部延迟细分。
  5. 检查网络:ping -M do -s 1472 <其他OSD> 检查 MTU 问题。

六、RGW 对象网关(3 题)

Q19:RGW 用户无法上传文件,如何排查?

  1. 检查 RGW 服务:systemctl status ceph-radosgw@*
  2. 测试端点:curl http://<rgw-host>:7480(应返回 XML)
  3. 检查用户 key:radosgw-admin user info --uid=<uid>
  4. 检查 pool 是否启用 rgw 应用标签:
    ceph osd pool application enable recordings_data rgw
    
  5. 查看 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 = truergw_cache_lru_size = 1000000

Q21:如何为 RGW 设置 bucket 生命周期(自动删除旧文件)?

# 1. 创建生命周期规则文件
cat > lifecycle.xml << EOF
<LifecycleConfiguration>
  <Rule>
    <ID>expire-30-days</ID>
    <Status>Enabled</Status>
    <Expiration><Days>30</Days></Expiration>
  </Rule>
</LifecycleConfiguration>
EOF

# 2. 应用到 bucket
radosgw-admin bucket lifecycle set --bucket=<bucket> --lifecycle-xml=lifecycle.xml

七、Monitor 运维(2 题)

Q22:MON 宕机了怎么办?

  • 多数派存活(3 节点挂 1 个)不影响读写,只是管理面冗余降低。
  • 恢复
    1. 重启:systemctl restart ceph-mon@<host>
    2. 若无法恢复,从集群移除:ceph mon remove <host>
    3. 添加新 MON:ceph-deploy mon add <new-host>

Q23:MON 日志出现 clock skew detected 怎么办?

  • 原因:节点时间不同步。
  • 解决
    # 检查时间同步状态
    chronyc sources -v
    # 强制同步
    chronyc -a makestep
    # 重启 MON
    systemctl restart ceph-mon@<host>
    

八、扩容与快照(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>
# 集群自动 rebalance
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 集群?

  • RBDrbd export <pool>/斤 < /backup/image.raw
  • RGW:使用 s3cmd/awscli 同步到备用存储
  • 集群元数据
    ceph osd getcrushmap -o crush.bin
    ceph osd dump > osd_dump.txt
    

九、故障排查实战(3 题)

Q27:Ceph 和 K8s 结合使用时,Pod 挂载 RBD 卷失败,如何排查?

  1. kubectl get pvc / kubectl get pv 查看状态
  2. 查看 csi-rbdplugin Pod 日志:kubectl logs -n ceph-csi-rbd
  3. Ceph 侧检查:rbd info <pool>/倦<, rbd status /倦<`
  4. 检查节点是否安装 rbd-nbdrbd 内核模块

Q28:遇到过最棘手的 Ceph 故障是什么?如何解决的?

(准备一个你的案例) 示例:

“一次网络交换机故障导致部分 OSD 心跳超时,多个 OSD 被标记为 down。我们立即执行 ceph osd set noout 防止迁移风暴,然后定位到故障交换机。网络恢复后,取消 noout,OSD 自动 peering,集群恢复。”

Q29:集群 full 了怎么办?

  • 紧急处理
    1. 删除不必要的数据(旧快照、日志)
    2. 临时提高阈值:
      ceph osd set full_ratio 0.97
      ceph osd set nearfull_ratio 0.90
      
    3. 扩容添加 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值