Ceph RBD 故障排查实录:从 PG Inactive 到对象异常定位



!! 大家好,我是wanger,一个爱折腾的运维工程,一个睡觉都被自己丑醒的云原生爱好者。


作者:wanger
公众号:运维开发故事
博客:https://www.devopstory.cn/



一、事故背景

在一次异常重启后,Ceph 集群出现了 PG 状态异常、部分 RBD 镜像无法正常启动等问题。本文记录了从 PG 状态检查、unfound object 定位、RBD 镜像关联分析,到后续 OSD 异常处理和业务数据恢复的完整排查过程。

二、初步排查

  1. 查看当前ceph health detail, 显示pg2.0和pg2.1f各有一个对象丢失
ceph health detail
  1. 执行pg查询命令,发现主副本侧少了一个对象
ceph pg 2.0 query

这里也能看到有一个对象没有分配在任何一个副本上

  1. 查看这两个pg丢失的对象属于哪个镜像,这两个pg丢失的对象分别是rbd_data.3d9eda62e65b28.000000000011880
    rbd_data.4aa6c99c7c8b2.0000000000012e6,

中间的3d9eda62e65b28和4aa6c99c7c8b2就是镜像id,后面的是具体的对象名,可以根据这个镜像id查是哪个虚拟机丢失的对象

plain ceph pg 2.0 list_unfound ceph pg 2.1f list_unfound 
  1. 使用rbd info命令查找哪个虚拟机镜像是这个id,发现分别属于两个虚拟机
  1. 对这两个虚拟机做快照备份,并关闭虚拟机

现在这两个对象已经无法找回了,需要对其标记为丢失

plain ceph pg 2.0 mark_unfound_lost revert ceph pg 2.1f mark_unfound_lost revert 
  1. 执行后报错已经没了,还剩pg副本不一致的错误

直接对pg进行ceph pg repair 2.0 修复,如果还提示报错则执行ceph pg 2.0 deep-scrub

  1. 执行此命令可以将pg不一致的对象列出来,这里发现其实已经没有不一致的对象了
plain rados list-inconsistent-obj 2.0 rados list-inconsistent-obj 2.1f 

虚拟机开机后显示如下状态

pg 2.0 里有一个 RBD 对象在多个 OSD 上读失败,也就是断电还是导致了底层数据损坏

三、 第二阶段:OSD 崩溃

  1. 在将pg2.0对应的osd手动重启后,发现pg出现inactive,导致整个集群无法读写

手动启动那两个osd后,发现osd在 recover_backfill 的时候触发断言无法启动,关掉 recover和backfill后就正常了

根据现象发现是和 tracker上记录的 #57940(已标成 #56772 的重复问题)一致,是个已知的bug。

根据上面https://tracker.ceph.com/issues/56772说的移除其他两个pg副本,强制同步剩下的pg副本的方法也并不管用。

  1. 查了下2.1f的peering 被历史上参与过这个 PG 的 down OSD 卡住了,当前 PG 2.1f 要完成 peering,还想去问 osd.3 和 osd.8,但这两个 OSD 现在是 down。
  1. 数据同步给其他osd之后做了ceph osd lost 8 和ceph osd lost 3 操作,发现还是有inactive的状态,现在又变成了pg2.6一直在peering中

四、升级ceph版本

因为当前环境是17.2.6的版本,17版本还在支持的是17.2.9,因此决定从17.2.6升级到17.2.9看看是否还存在这个问题。新版本会把断言改成安全判断,不再崩溃。

升级版本后发现是pg没有卡在那个有故障的osd上了

不过当我把min_size从3改为2后,没多久又出现了同样的断言问题,看样子即使升级到17.2.9版本也没有解决这个问题

五、后续尝试

  1. pg的所有snap进行处理

具体的处理步骤我这边丢失了,这里把参考的ceph大佬的步骤贴一下

http://www.strugglesquirrel.com/2024/09/06/%E4%B8%80%E6%AC%A1%E6%8E%89%E7%94%B5%E5%BC%95%E5%8F%91%E7%9A%84rbd%E5%BF%AB%E7%85%A7%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98/

1、首先获取pg包含的所有object列表
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-10/ --type bluestore --pgid 10.276 --op list
2、删除pg中object的snap信息
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-10/ --type bluestore --pgid 10.276 rbd_data.23d1114e645816.0000000000014804 remove-clone-metadata 4

不过即使删除了所在pg的snap数据后osd也一样会触发断言。

  1. 删除触发断言的镜像文件,删除后并把对应的osd标记为ceph osd lost 4 --yes-i-really-mean-it,结果inactive状态仍然存在。

看了下虚拟机状态,发现系统都读不到引导分区了,后面通过挂载ISO的方式修复了引导分区和文件系统,并把虚拟机的数据做了备份,这里不表。

后面就重置了整个存储池,重新在上面部署了业务。



最后,求关注。如果你还想看更多优质原创文章,欢迎关注我们的公众号「运维开发故事」。

如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你还可以把我的公众号设为「星标」,这样当公众号文章更新时,你会在第一时间收到推送消息,避免错过我的文章更新。




我是 wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!



------本页内容已结束,喜欢请分享------

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发
运维开发故事的头像-运维开发故事

昵称

取消
昵称表情代码图片