本篇介绍一种特殊情况下进行osd的修复。
写在前面
一句话广告:欢迎老铁们支持松鼠哥的课程,大家的支持就是对松鼠哥最大的鼓励,创作真的不易哇~~
本篇介绍一种特殊情况下进行osd的修复,在极端情况下,如误操作导致数据风险,或者需要进行关键数据的提取,都具有很好的借鉴意义,另外,在处理过程中用到的思路和内容,都能够为大家解决其他问题提供参考。
场景
我们知道,ceph集群的osd状态有好几种,最常见的就是up/down/in/out/destroyed,其中前面4种状态,ceph集群是可以自动调整切换的,如osd进程发生故障,在超时时间后,osd在集群的状态就会变成down,当osd重新被创建时,它在集群中的状态会重新up和in,但是destroyed状态必须是人为进行操作的,在松鼠哥的课程中有提到,osd坏盘处理过程中,我们应该尽量显式地将osd设置为destroyed状态,这个操作告诉集群这个osd的数据已经永久地被毁灭了,它将会进行换盘然后重建。
而本次集群就是一种意外情况,在实际操作中,osd进程本来是好的,它的数据、磁盘、lvm等都是没有问题的,意外地被操作删除了它在集群的key和标记为destroyed,这种情况下,osd将会被逐出集群,并且osd进程也不能正常运行
1 | [twj@test-cluster ~]# sudo ceph osd tree down |
当osd进入destroyed状态后,显式表示该osd的数据完全被毁灭,osd需要换盘后重新创建,这种状态的osd,集群仅支持两种操作,第一种操作就是重建osd,它会在osd完成prepare后进入down状态,然后在active后,osd进程拉起来进入up状态,第二种操作就是ceph osd rm,将其从集群完全清除,除此之外,osd的集群状态是不能变化的,也就是,没有其他办法能够将destroyed状态的osd变成down状态或者up状态。
如果我们的osd是被误操作的,或者,这个osd的磁盘还有继续使用的可能性(比如这个osd包含了最后一个副本,如果起不来可能会导致数据丢失),而osd目前是destroyed状态的,有没有可能救回这个osd呢?从思路上来说有2个:
修改osdmap
松鼠哥在课程中也重点提到,osdmap是集群最重要的map,它维护集群重要的信息,其中osd的集群状态信息就保存在osdmap中,那么我们能不能将对应osd的状态从destroyed直接修改为down,再将osdmap进行注入来达到目的呢?
答案是:不行~
原因是ceph不允许外力修改osdmap的内容,它不支持,也没有可行的办法去修改集群的osdmap并进行注入,外力能够做的最大努力,应该只有松鼠哥之前做的集群osdmap的回滚,如果能够修改osdmap,我们还做什么回滚。。
这里补充一个知识点,集群的osdmap只有mon能修改,而其他任何组件不具有修改osdmap的能力,并且,其他组件无条件相信mon的osdmap,所以mon的osdmap是最权威的数据。
况且在本场景中,为了几个osd的状态变化,去回滚整个集群的osdmap,不值得,也具有很高的风险!
欺骗mon让它帮忙将osd的集群状态进行修改
既然只有mon才能修改osdmap,那么我们能不能通过某些手段,让mon将osd的destroyed状态修改为down呢?这个思路就非常奇特了,事实上是行得通的。
从前述内容可知,mon修改osd的状态只有一种方法,就是告诉集群,这个osd将要被重建,那么我们可以利用这个过程,达到修改osd状态的目的。
首先,我们在节点上创建一个10G的文件,然后将其转变为块设备,并在它上面创建lvm,为osd的创建做准备
1 | 首先生成文件,大小为10G |
准备完成后,我们还要查看一下目标osd的原来的osdid,因为这些信息是保存在osd的磁盘上的,如果我们指定的id不对,可能会导致osd在启动时id对不上,而无法正常启动,因此我们在进行prepare的时候,指定这个osd原来的id
1 | [twj@test-cluster ~]# cd /var/lib/ceph/osd/ceph-688 |
接下来就是prepare了,它是ceph-volume创建osd的第一步,松鼠哥的课程内有详细讲解
1 | [twj@test-cluster ~]# /usr/sbin/ceph-volume --cluster ceph lvm prepare --bluestore --data testosdblockvg/testosdblocklv --osd-id 688 --osd-fsid 5ecb4e14-cbe9-4d0c-ab4c-7ec0672e6913 |
如果在prepare的时候提示osd entity存在了,就用ceph auth rm osd.xx
进行删除。上述操作完成后,查看osd的状态,发现已经变成了down,当然,我们并不打算对它继续创建。
1 | [twj@test-cluster ceph-688]# sudo ceph osd tree down |
变成down就好办了,我们可以直接修改osd的链接信息并用它原来的盘进行拉起,注意要修改权限,否则会起不来
1 | [twj@test-cluster ceph-688]# ls -l |
拉起后,看到进程能够顺利起来了~~注意到,osd的拉起过程中,有日志提示它被标记为destroyed
1 | 2024-04-07 14:24:40.191 7f49b977cb80 0 osd.688 140029 done with init, starting boot process |
即在osdmap的版本140029
中,osd.688是destroyed的,不过因为当前osdmap版本已经到了更高的版本,因此这个日志输出尽管是-1
级别,但并不影响osd的启动运行。
1 | [twj@test-cluster osd]# ceph osd dump|more |
在经过半个小时的启动后,osd中遇完全起来了,pg数据也正常扫描并顺利上线
1 | [twj@test-cluster ~]# sudo ceph osd tree-from host1 |
接下来还要再把用来进行prepare的文件进行处理,主要是卸载和删除
1 | [twj@test-cluster ~]# lvremove -y testosdblockvg/testosdblocklv |
至此,osd从destroyed状态转变到了up状态,它上面的数据也得到了恢复。
总结
即便不是误操作,在集群运行过程中仍然有可能会需要用到osd的集群状态变化,本篇提出的办法利用osd创建过程导致的osd变化,来实现原来osd的重新上线,为大家做数据恢复提供思路。
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2024/04/16/ceph运维大宝剑之拯救destroyed的osd/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!