老版本pg丢失,pg无法进入active+clean状态处理
背景
原集群版本0.94.5,三副本rbd池,由于硬盘故障导致硬盘a无法再次启动,后续由于操作流程问题,陆续out和remove掉了5块硬盘,等集群状态稳定后,发现有1 pg incomplete无法恢复
关键点
- 该版本无ceph pg $pg.id mark_unfound_lost delete/revert等命令
- 该pg query无任何返回,导致不知道stuck于哪个osd,且原先osd已经从crush中移除,无法执行lost动作
- 该pg以及操作历史无法追溯,无法确保该pg最新的副本存在于哪个osd上,尝试通过objectstore tool进行导出导入,仍无法修复
- 该版本ceph-objectstore-tool无mark complete等动作
尝试过的操作
- export与import pg:会报错因为osdmap冲突导致当前acting set的osd无法启动
- force-create:pg卡在creating阶段,重启osd后再次变成incomplete状态
- remove掉所有中间阶段该pg的temp osd上该pg的数据,再次重建仍无法启动
最终解决
经过多次尝试,多方讨论后,发现无法选举权威pg或无法更新pg状态原因为该版本工具和命令太老,正常处理incomplete只要人为选举出来一个较新或者较大的pg数据作为权威pg,再执行mark complete进行peering即可。
最终从ceph社区中下载0.94版本中小版本较高的ceph-objectstore-tool,进行了导入和mark操作,该pg终于可以进入active状态,但obj会报存在部分obj unfound,使用tool直接删除这几个obj进行有损恢复后(确实无法找回),集群恢复ok状态
问题回溯
造成本故障主要原因存在多方面:
- 短时间损坏了较多硬盘
- 操作不规范,不应该同时进行多个硬盘的删除替换
- 版本过老,部分工具、命令、处理经验无法使用