掉电后osdmap丢失无法启动osd的解决方案
掉电后osdmap丢失无法启动osd的解决方案
zphj1987前言
本篇讲述的是一个比较极端的故障的恢复场景,在整个集群全部服务器突然掉电的时候,osd里面的osdmap可能会出现没刷到磁盘上的情况,这个时候osdmap的最新版本为空或者为没有这个文件
还有一种情况就是机器宕机了,没有马上处理,等了一段时间以后,服务器机器启动了起来,而这个时候osdmap已经更新了,全局找不到需要的旧版本的osdmap和incmap,osd无法启动
一般情况下能找到的就直接从其他osd上面拷贝过来,然后就可以启动了,本篇讲述的是无法启动的情况
解决方案
获取运行的ceph集群当前版本
1 | [root@lab8107 ~]# ceph -v |
获取最新的osdmap
1 | [root@lab8107 ~]# ceph osd getmap -o /tmp/productosdmap |
通过osdmap可以得到crushmap,fsid,osd,存储池,pg等信息
提取crushmap
1 | [root@lab8107 tmp]# osdmaptool /tmp/productosdmap --export-crush /tmp/productcrushmap |
拷贝到开发环境的机器上面
通过osdmap获取集群的fsid
1 | [root@lab8107 tmp]# osdmaptool --print productosdmap |grep fsid |
获取存储池相关的信息
1 | [root@lab8107 tmp]# osdmaptool --print productosdmap |grep pool |
获取osd相关的信息
1 | [root@lab8107 tmp]# osdmaptool --print productosdmap |grep osd |
构建新集群
下载这个版本的源码
1 | http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/ceph-10.2.9-0.el7.src.rpm |
放到一台独立的机器上面
解压rpm包
1 | [root@lab8106 bianyi]# rpm2cpio ceph-10.2.9-0.el7.src.rpm |cpio -div |
编译环境
1 | cd ceph |
修改vstart.sh里面的fsid
启动集群
1 | ./vstart.sh -n --mon_num 1 --osd_num 3 --mds_num 0 --short -d |
检查集群状态:
1 | [root@lab8106 src]# ./ceph -c ceph.conf -s |
导入crushmap
1 | [root@lab8106 src]# ./ceph -c ceph.conf osd setcrushmap -i /root/rpmbuild/bianyi/productcrushmap |
设置PG
1 | ./ceph -c ceph.conf osd pool set rbd pg_num 64 |
模拟正式集群上的故障
1 | [root@lab8107 meta]# systemctl stop ceph-osd@0 |
相当于无法读取这个osdmap和incmap了
尝试启动osd
设置debug_osd=20后
1 | systemctl restart ceph-osd@0 |
检查日志
1 | /var/log/ceph/ceph-osd.0.log |
可以看到153 epoch的osdmap是有问题的,那么我们需要的就是这个版本的osdmap
检查当前开发集群的osdmap的版本
1 | osdmap e18: 3 osds: 3 up, 3 in |
那么先快速把osdmap版本提高到153附近,这里我选择120
1 | [root@lab8106 src]# ./ceph -c ceph.conf osd thrash 120 |
检查快速变化后的osdmap epoch
1 | osdmap e138: 3 osds: 2 up, 1 in; 64 remapped pgs |
做了上面的thrash后,集群的osd会是比较乱的,比如我的
1 | [root@lab8106 src]# ./ceph -c ceph.conf osd tree |
做下恢复,启动下相关osd
1 | [root@lab8106 src]# ./ceph -c ceph.conf osd reweight 0 1 |
注意提取下开发集群上面新生成的osdmap的文件(多次执行以免刷掉了)
1 | [root@lab8106 src]#rsync -qvzrtopg dev/osd0/current/meta/ /root/meta/ |
重启一遍开发集群
1 | [root@lab8106 src]# ./vstart.sh --mon_num 1 --osd_num 3 --mds_num 0 --short -d |
注意这里少了一个参数 -n,n是重建集群,这里我们只需要重启即可
再次检查
1 | osdmap e145: 3 osds: 3 up, 3 in |
还是不够,不够的时候就执行上面的这个多次即可,一直到epoch到满足即可
将得到的osdmap拷贝到无法启动的osd的主机上面
1 | [root@lab8106 src]# scp /root/meta/osdmap.153__0_AC977A95__none 192.168.8.107:/root |
拷贝到osdmap的路径下面
1 | [root@lab8107 meta]# cp /root/osdmap.153__0_AC977A95__none ./ |
启动并且观测
1 | [root@lab8107 meta]# systemctl start ceph-osd@0 |
检查集群状态,可以看到已经可以启动了
总结
一般来说,出问题的时候都会说一句,如果备份了,就没那多事情,在一套生产环境当中,可以考虑下,什么是可以备份的,备份对环境的影响大不大,这种关键数据,并且可以全局共用,数据量也不大的数据,就需要备份好,比如上面的osdmap就可以在一个osd节点上面做一个实时的备份,或者短延时备份
本篇讲的是已经没有备份的情况下的做的一个恢复,掉电不是没有可能发生,至少解决了一个在osdmap无法找回的情况下的恢复办法
当然这里如果能够通过直接基于最新的osdmap和incmap做一定的解码,修改,编码,这样的方式应该也是可行的,这个就需要有一定的开发基础了,如果后面有找到这个方法会补充进本篇文章
你备份osdmap了么?
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2017-09-27 |