掉电后osdmap丢失无法启动osd的解决方案
前言
本篇讲述的是一个比较极端的故障的恢复场景,在整个集群全部服务器突然掉电的时候,osd里面的osdmap可能会出现没刷到磁盘上的情况,这个时候osdmap的最新版本为空或者为没有这个文件
还有一种情况就是机器宕机了,没有马上处理,等了一段时间以后,服务器机器启动了起来,而这个时候osdmap已经更新了,全局找不到需要的旧版本的osdmap和incmap,osd无法启动
一般情况下能找到的就直接从其他osd上面拷贝过来,然后就可以启动了,本篇讲述的是无法启动的情况
解决方案
获取运行的ceph集群当前版本
[root@lab8107 ~]# ceph -v
ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)
获取最新的osdmap
[root@lab8107 ~]# ceph osd getmap -o /tmp/productosdmap
got osdmap epoch 142
通过osdmap可以得到crushmap,fsid,osd,存储池,pg等信息
提取crushmap
[root@lab8107 tmp]# osdmaptool /tmp/productosdmap --export-crush /tmp/productcrushmap
osdmaptool: osdmap file '/tmp/productosdmap'
osdmaptool: exported crush map to /tmp/productcrushmap
拷贝到开发环境的机器上面
通过osdmap获取集群的fsid
[root@lab8107 tmp]# osdmaptool --print productosdmap |grep fsid
osdmaptool: osdmap file 'productosdmap'
fsid d153844c-16f5-4f48-829d-87fb49120bbe
获取存储池相关的信息
[root@lab8107 tmp]# osdmaptool --print productosdmap |grep pool
osdmaptool: osdmap file 'productosdmap'
pool 0 'rbd' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0
获取osd相关的信息
[root@lab8107 tmp]# osdmaptool --print productosdmap |grep osd
osdmaptool: osdmap file 'productosdmap'
flags sortbitwise,require_jewel_osds
max_osd 3
osd.0 up in weight 1 up_from 135 up_thru 141 down_at 127 last_clean_interval [23,24) 192.168.8.107:6800/28245 192.168.8.107:6801/28245 192.168.8.107:6802/28245 192.168.8.107:6803/28245 exists,up d8040272-7afb-49c0-bb78-9ff13cf7d31b
osd.1 up in weight 1 up_from 140 up_thru 141 down_at 131 last_clean_interval [33,130) 192.168.8.107:6808/28698 192.168.8.107:6809/28698 192.168.8.107:6810/28698 192.168.8.107:6811/28698 exists,up c6ac4c7a-0227-4af4-ac3f-bd844b2480f8
osd.2 up in weight 1 up_from 137 up_thru 141 down_at 133 last_clean_interval [29,132) 192.168.8.107:6804/28549 192.168.8.107:6805/28549 192.168.8.107:6806/28549 192.168.8.107:6807/28549 exists,up 2170260b-bb05-4965-baf2-12d1c41b3ba0
构建新集群
下载这个版本的源码
http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/ceph-10.2.9-0.el7.src.rpm
放到一台独立的机器上面
解压rpm包
[root@lab8106 bianyi]# rpm2cpio ceph-10.2.9-0.el7.src.rpm |cpio -div
[root@lab8106 bianyi]# tar -xvf ceph-10.2.9.tar.bz2
编译环境
cd ceph
./install-deps.sh
./autogen.sh
./configure
make -j 12
cd src
修改vstart.sh里面的fsid
启动集群
./vstart.sh -n --mon_num 1 --osd_num 3 --mds_num 0 --short -d
检查集群状态:
[root@lab8106 src]# ./ceph -c ceph.conf -s
cluster d153844c-16f5-4f48-829d-87fb49120bbe
health HEALTH_OK
monmap e1: 1 mons at {a=192.168.8.106:6789/0}
election epoch 3, quorum 0 a
osdmap e12: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds
pgmap v16: 8 pgs, 1 pools, 0 bytes data, 0 objects
115 GB used, 1082 GB / 1197 GB avail
8 active+clean
导入crushmap
[root@lab8106 src]# ./ceph -c ceph.conf osd setcrushmap -i /root/rpmbuild/bianyi/productcrushmap
set crush map
2017-09-26 14:13:29.052246 7f19fd01d700 0 lockdep stop
设置PG
./ceph -c ceph.conf osd pool set rbd pg_num 64
./ceph -c ceph.conf osd pool set rbd pgp_num 64
模拟正式集群上的故障
[root@lab8107 meta]# systemctl stop ceph-osd@0
[root@lab8107 meta]# mv /var/lib/ceph/osd/ceph-0/current/meta/osdmap.153__0_AC977A95__none /tmp/
[root@lab8107 meta]# mv /var/lib/ceph/osd/ceph-0/current/meta/inc\\uosdmap.153__0_C67D77C2__none /tmp/
相当于无法读取这个osdmap和incmap了
尝试启动osd
设置debug_osd=20后
systemctl restart ceph-osd@0
检查日志
/var/log/ceph/ceph-osd.0.log

可以看到153 epoch的osdmap是有问题的,那么我们需要的就是这个版本的osdmap
检查当前开发集群的osdmap的版本
osdmap e18: 3 osds: 3 up, 3 in
那么先快速把osdmap版本提高到153附近,这里我选择120
[root@lab8106 src]# ./ceph -c ceph.conf osd thrash 120
will thrash map for 120 epochs
检查快速变化后的osdmap epoch
osdmap e138: 3 osds: 2 up, 1 in; 64 remapped pgs
做了上面的thrash后,集群的osd会是比较乱的,比如我的
[root@lab8106 src]# ./ceph -c ceph.conf osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.80338 root default
-2 0.80338 host lab8107
0 0.26779 osd.0 up 0 1.00000
1 0.26779 osd.1 down 0 1.00000
2 0.26779 osd.2 up 1.00000 1.00000
2017-09-27 09:43:24.817177 7fbcc7cdb700 0 lockdep stop
做下恢复,启动下相关osd
[root@lab8106 src]# ./ceph -c ceph.conf osd reweight 0 1
reweighted osd.0 to 1 (10000)
2017-09-27 09:45:01.439009 7f56c147b700 0 lockdep stop
[root@lab8106 src]# ./ceph -c ceph.conf osd reweight 1 1
reweighted osd.1 to 1 (10000)
2017-09-27 09:45:04.020686 7fea3345c700 0 lockdep stop
注意提取下开发集群上面新生成的osdmap的文件(多次执行以免刷掉了)
[root@lab8106 src]#rsync -qvzrtopg dev/osd0/current/meta/ /root/meta/
重启一遍开发集群
[root@lab8106 src]# ./vstart.sh --mon_num 1 --osd_num 3 --mds_num 0 --short -d
注意这里少了一个参数 -n,n是重建集群,这里我们只需要重启即可
再次检查
osdmap e145: 3 osds: 3 up, 3 in
还是不够,不够的时候就执行上面的这个多次即可,一直到epoch到满足即可
将得到的osdmap拷贝到无法启动的osd的主机上面
[root@lab8106 src]# scp /root/meta/osdmap.153__0_AC977A95__none 192.168.8.107:/root
osdmap.153__0_AC977A95__none 100% 2824 2.8KB/s 00:00
[root@lab8106 src]# scp /root/meta/inc\\uosdmap.153__0_C67D77C2__none 192.168.8.107:/root
inc\uosdmap.153__0_C67D77C2__none 100% 198 0.2KB/s 00:00
拷贝到osdmap的路径下面
[root@lab8107 meta]# cp /root/osdmap.153__0_AC977A95__none ./
[root@lab8107 meta]# cp /root/inc\\uosdmap.153__0_C67D77C2__none ./
[root@lab8107 meta]# chown ceph:ceph osdmap.153__0_AC977A95__none
[root@lab8107 meta]# chown ceph:ceph inc\\uosdmap.153__0_C67D77C2__none
启动并且观测
[root@lab8107 meta]# systemctl start ceph-osd@0
[root@lab8107 meta]#tailf /var/log/ceph/ceph-osd.0.log
检查集群状态,可以看到已经可以启动了
总结
一般来说,出问题的时候都会说一句,如果备份了,就没那多事情,在一套生产环境当中,可以考虑下,什么是可以备份的,备份对环境的影响大不大,这种关键数据,并且可以全局共用,数据量也不大的数据,就需要备份好,比如上面的osdmap就可以在一个osd节点上面做一个实时的备份,或者短延时备份
本篇讲的是已经没有备份的情况下的做的一个恢复,掉电不是没有可能发生,至少解决了一个在osdmap无法找回的情况下的恢复办法
当然这里如果能够通过直接基于最新的osdmap和incmap做一定的解码,修改,编码,这样的方式应该也是可行的,这个就需要有一定的开发基础了,如果后面有找到这个方法会补充进本篇文章
你备份osdmap了么?
变更记录
| Why | Who | When |
|---|---|---|
| 创建 | 武汉-运维-磨渣 | 2017-09-27 |
掉电后osdmap丢失无法启动osd的解决方案的更多相关文章
- Spring Boot 添加jersey-mvc-freemarker依赖后内置tomcat启动不了解决方案
我在我的Spring Boot 项目的pom.xml中添加了jersey-mvc-freemarker依赖后,内置tomcat启动不了. 报错信息如下: org.springframework.con ...
- 三星Q470c Logo界面无限掉电重启,变砖后的挽救过程
背景 三星笔记本的部分型号如:NP530 Q470等 安装win8后再次重装系统(我弄了个Ubuntu18)会导致无法进入BIOS菜单页面的问题.启动显示logo页面后,能够听到明显啪的一声(硬盘掉电 ...
- 【转】巧用CAT706做掉电检测
相信大家都会遇到这样的情况,当你正在敲一份文档或一段代码时,啪的一下停电啦,我擦……,我的代码……,我的图纸……,我刚写好的文章…….但是在嵌入式系统中也会遇到类似的情况,通常会导致嵌入式系统数据,程 ...
- 视频修复工具recover_mp4,视频录制一半掉电,如何查看已保存数据?
在生产环境中,视频通常是一种重要的文件证据,但是,如果因为各种原因,导致视频在录制到一半过程中失败, 比如:监控到一半,录制设备掉电.虽然,掉电后的视频肯定找不到,但是,有时,长时间工作生产的视频通常 ...
- Linux掉电处理
在嵌入式设备中,掉电处理一直是一项比较麻烦的工作,在具有Linux系统的设备中,系统的种种数据的处理更是增加掉电处理的难度.现在做以下几点总结,再遇到类似问题可以做个参考. 1,系统启动的处理 在系统 ...
- STM32 可编程电压监测器(PVD)实现数据掉电保存
STM32内部有一个完整的上电复位和掉电复位电路,当供电电压达到2v时系统即能正常工作. STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控.通过电源控制寄存器中的PLS[2:0]位可以 ...
- STC单片机掉电断电失电瞬间EEPROM数据保存处理办法(转)
由于客户在请人设计开发一设备,但是设备用户处总停电,造成设备及其周边耗材损耗严重,因此请我司在现有STC为主要芯片的基础上做掉电瞬间EEPROM里的20个参数保存,上电后通过读取EEPROM中的参数回 ...
- MacBook Pro休眠掉电、耗电量大问题解决方案
1.前言 最近我的2015mbpMacBook Pro (Retina, 13-inch, early 2015)更新完10.14系统后,发现休眠待机一晚上后能掉5%电,白天待机4-5小时又掉了8%. ...
- 在win7之后安装Ubuntu14.04系统后,丢失对win7的引导
安装完ubuntu 14.04后,开机直接进入ubuntu.但是win7下的分区还在,只是未显示引导菜单. 恢复步骤: (前提是机器上确实存在win7的引导) $ sudo update-grub G ...
随机推荐
- 关于Dockerfile
在Docker中创建镜像最常用的方式,就是使用Dockerfile.Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A.B.C.D-的步骤.Dockerfile其内部包含 ...
- Java9系列第7篇:Java.util.Optional优化与增强
我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...
- 使用浏览器抓取QQ音乐接口(歌曲篇)
前言 前面我们获取了歌曲的排行榜的数据,我们现在需要实现歌曲播放 前面我们写了一段函数来得到了回调的数据,现在我们需要使用这一段数据,来实现播放歌曲 完整代码 <!DOCTYPE html> ...
- this()与super()
1. 构造器中第一行默认是super(),一旦直接父类的构造器中没有无参的,那么必须显式调用父类的某个有参构造. 2. 构造器中第一行的super()可以换成this(),但是this()和super ...
- this.$nextTick的用法
element-ui中有一个动态添加tag的组件,平常状态是按钮,点击后变成输入框:那么这里的话,希望按钮点击后,input输入框被选中 这里二者的切换依赖于inputVisible这个值,当按钮点击 ...
- requests 库和beautifulsoup库
python 爬虫和解析 库的安装:pip install requests; pip install beautifulsoup4 requests 的几个常用方法: requests.reques ...
- java处理大数据量任务时的可用思路--未验证版,具体实现方法有待实践
1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集基本原理及要点:对于原理来说很简单,位数组+k个独立hash函数.将hash函数对应的值的位数组置1,查找时如 ...
- JAVA学习第一阶段(2)
21. ArrayList类和LinkList类 注意:add,contains,remove,retain(取交集) 都可以+all表示对集合的操作 ArrayList c = new ArrayL ...
- centos8 curl: (35) error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
centos8操作系统,curl -k https:/www.xxx.com 报错 curl: (35) error:141A318A:SSL routines:tls_process_ske_dh ...
- 4g物联网模块的原理
4G DTU模块也可以被称之为是含有第四代移动通信技术的模块,是随着科技不断发展进步下物联网和移动互联网发展下的又一产物.而4G技术包括TD-LTE和FDD-LTE两种制式.集3G与WLAN于一体并能 ...