1.1 环境检查
通过ceph -s等方式检查集群状态是否已稳定,不存在
osd服务反复up/down;
上报心跳超时;
有slow ops
有大量数据迁移中
等情况。
1.2 查询unfound对象相应的信息
- 查看unfound对象所在的pg
#ceph health detail
- 查询丢失对象
#ceph pg {pgid} list_unfound
- 对对应pg进行状态查询,记录对应的active/up set及恢复状态中是否有osd处于down状态
#ceph pg {pgid} query
- 若后端存储类型为filestore,先备份osd上的对象(若为bluestore则跳过)
查寻丢失对象,将对象哈希转化为16进制,如下图转换后为4E220181
对象所在的目录层级为哈希字符由后至前,直至没有子目录,如图中对象所在目录为
/var/lib/ceph/osd/ceph-{osdid}/{pgid}_head/DIR_1/DIR_8/DIR_1/DIR0/DIR2
将对应对象拷贝,并校验文件完整性
#cp -a {object} {target dir}
#md5sum {object}
1.3 拉起down状态osd服务
尝试将down的osd恢复,一般恢复后就可以找到object
登录osd所在机器
#systemctl restart ceph-osd@{osdid}
检查osd启动状态
检查启动后对象是否仍旧为unfound状态
1.4 回退unfound对象(osd服务无法拉起/拉起后对象仍未unfound状态)
执行前建议让研发同学评估此操作是否存在数据丢失风险
集群仅为副本模式时可执行回退,EC模式无法回退
若osd无法拉起,先将osd删除
#ceph osd out osd.{osdid}
#.ceph osd rm osd.{osdid}
#ceph osd crush remove osd.{osdid}
#ceph auth del osd.{osdid}
将丢失回退至存活osd中存放的旧版本
#ceph pg {pgid} mark_unfound_lost revert
观察对象是否恢复
1.5 删除unfound对象(若无法回退)
执行前建议让研发同学评估此操作是否存在数据丢失风险
若osd无法拉起,先将osd删除
#ceph osd out osd.{osdid}
#.ceph osd rm osd.{osdid}
#ceph osd crush remove osd.{osdid}
#ceph auth del osd.{osdid}
将丢失对象删除
#ceph pg {pgid} mark_unfound_lost delete
观察集群状态是否恢复