Ceph对象主本损坏的修复方法
前言
问题的触发是在进行一个目录的查询的时候,osd就会挂掉,开始以为是osd操作超时了,后来发现每次访问这个对象都有问题
log [WRN] : slow request 60.793196 seconds old, received at osd_op(mds.0.188:728345234100006c6ddc.00000000 [o map-get-header 0-0,omap-get-vals 0~16,getxattr parent] snapc 0=[] ack+read+known_if_redirected+full_force e218901) currently started
heartbeat_map is_healthy ··· osd_op_tp thread ··· had timed out after 60
这个对象是元数据的一个空对象,保留数据在扩展属性当中
然后做了一个操作判断是对象损坏了:
直接列取omapkeys
rados -p metadata listomapvals 100006c6ddc.00000000
发现会卡住,然后关闭这个osd再次做操作,就可以了,启动后还是不行,这里可以判断是主本的对象已经有问题了,本篇将讲述多种方法来解决这个问题
处理办法
本章将会根据操作粒度的不同来讲述三种方法的恢复,根据自己的实际情况,和风险的判断来选择自己的操作
方法一:通过repair修复
首先能确定是主本损坏了,那么先把主本的对象进行一个备份,然后移除
[root@lab71 2.0_head]# systemctl stop ceph-osd@0
[root@lab71 2.0_head]# cp -ra 100.00000000__head_C5265AB3__2 ../../
通过ceph-object-tool进行移除的时候有bug,无法移除metadata的对象,已经提了一个bug
[root@lab71 2.0_head]# mv 100.00000000__head_C5265AB3__2 ../
注意一下在老版本的时候,对对象进行删除以后,可能元数据里面记录了对象信息,而对象又不在的时候可能会引起osd无法启动,这个在10.2.10是没有这个问题
重启osd
[root@lab71 2.0_head]# systemctl restart ceph-osd@0
对pg做scrub
[root@lab71 2.0_head]# ceph pg scrub 2.0
instructing pg 2.0 on osd.0 to scrub
这种方法就是需要做scrub的操作,如果对象特别多,并且是线上环境,可能不太好去做scrub的操作
检查状态
[root@lab71 2.0_head]# ceph -s
cluster 03580f14-9906-4257-9182-65c886e7f5a7
health HEALTH_ERR
1 pgs inconsistent
1 scrub errors
too few PGs per OSD (3 < min 30)
monmap e1: 1 mons at {lab71=20.20.20.71:6789/0}
election epoch 4, quorum 0 lab71
fsmap e30: 1/1/1 up {0=lab71=up:active}
osdmap e101: 2 osds: 2 up, 2 in
flags sortbitwise,require_jewel_osds
pgmap v377: 3 pgs, 3 pools, 100814 bytes data, 41 objects
70196 kB used, 189 GB / 189 GB avail
2 active+clean
1 active+clean+inconsistent
发起修复请求
[root@lab71 2.0_head]# ceph pg repair 2.0
instructing pg 2.0 on osd.0 to repair
修复完成后检查集群状态和对象,到这里可以恢复正常了
方法二:通过rsync拷贝数据方式恢复
跟上面一样这里首先能确定是主本损坏了,那么先把主本的对象进行一个备份,然后移除
[root@lab71 2.0_head]# systemctl stop ceph-osd@0
[root@lab71 2.0_head]# cp -ra 100.00000000__head_C5265AB3__2 ../../
移除对象
[root@lab71 2.0_head]# mv 100.00000000__head_C5265AB3__2 ../
在副本的机器上执行rsync命令,这里我们直接从副本拷贝对象过来,注意下不能直接使用scp会掉扩展属性
[root@lab72 2.0_head]# rsync -avXH /var/lib/ceph/osd/ceph-1/current/2.0_head/100.00000000__head_C5265AB3__2 20.20.20.71:/var/lib/ceph/osd/ceph-0/current/2.0_head/100.00000000__head_C5265AB3__2
在主本机器检查扩展属性
[root@lab71 2.0_head]# getfattr 100.00000000__head_C5265AB3__2
# file: 100.00000000__head_C5265AB3__2
user.ceph._
user.ceph._@1
user.ceph.snapset
user.cephos.spill_out
重启osd
[root@lab71 2.0_head]# systemctl restart ceph-osd@0
检查对象的扩展属性
[root@lab71 2.0_head]# rados -p metadata listomapvals 100.00000000
方法三:通过删除PG的方式恢复
这个方式是删除PG,然后重新启动的方式
这种方式操作比较危险,所以提前备份好pg的数据,最好主备pg都备份下,万一出了问题或者数据不对,可以根据需要再导入
备份PG
ceph-objectstore-tool --pgid 2.0 --op export --data-path /var/lib/ceph/osd/ceph-0/ --journal-path /var/lib/ceph/osd/ceph-0/journal --file /root/2.0
删除PG的操作
[root@lab71 current]# ceph-objectstore-tool --pgid 2.0 --op remove --data-path /var/lib/ceph/osd/ceph-0/ --journal-path /var/lib/ceph/osd/ceph-0/journal
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
marking collection for removal
setting '_remove' omap key
finish_remove_pgs 2.0_head removing 2.0
Remove successful
重启osd
[root@lab71 current]# systemctl restart ceph-osd@0
等待回复即可
本方法里面还可以衍生一种就是,通过导出的副本的PG数据,在主本删除了相应的PG以后,进行导入的方法,这样就不会产生迁移
[root@lab71 current]# ceph-objectstore-tool --pgid 2.0 --op import --data-path /var/lib/ceph/osd/ceph-0/ --journal-path /var/lib/ceph/osd/ceph-0/journal --file /root/2.0
总结
上面用三种方法来实现了副本向主本同步的操作,判断主本是否有问题的方法就是主动的把主本所在的OSD停掉,然后检查请求是否可达,在确定主本已经坏掉的情况下,就可以做将副本同步到主本的操作,可以根据PG的对象的多少来选择需要做哪种操作
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2018-01-02 |
Ceph对象主本损坏的修复方法的更多相关文章
- win7注册表损坏的修复方法
win7注册表损坏的修复方法 发布时间:2013-07-19 09:31发布者:系统城-小薇浏览数:3129 注册表是window系统中的一个非常重要的数据库,用于存储电脑系统和应用程序的设置信息,我 ...
- Linux服务器断电导致挂载及xfs文件损坏的修复方法
系统文件损坏后进入紧急修复模式,无法进行维护工作 welcome to emergency mode!after logging in ,type "journalctl -xb" ...
- MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)
----------------- [1] use master go sp_configure reconfigure with override go ----------------- [2] ...
- sqlserver数据库出现可疑错误修复方法
一.主数据库出现可疑修复方法: 第一种方法: 当数据库发生这种操作故障时,可以按如下操作步骤可处理此要领,打开数据库里的Sql查询编辑器窗口,运行以下的命令: ?修改数据库为紧急模式 ALTER DA ...
- 旧文备份:硬盘MBR引导记录损坏的一种修复方法
硬盘MBR信息损坏原因:硬盘上安装了windows XP和linux双系统,在windows下安装一套软件,破解的时候修改了硬盘的序列号,结果导致引导系统的grub无法完成linux的引导,只能进到w ...
- MYSQL数据表损坏的原因分析和修复方法小结
MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...
- 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块
Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块 最近处理的一件 linux 服务器断电导致文件系统启动后文件系统不可读写,数据不可用的案例,现总结下 Linux ...
- Ceph对象存储网关中的索引工作原理<转>
Ceph 对象存储网关允许你通过 Swift 及 S3 API 访问 Ceph .它将这些 API 请求转化为 librados 请求.Librados 是一个非常出色的对象存储(库)但是它无法高效的 ...
随机推荐
- 如何设计一个牛逼的API接口
在日常开发中,总会接触到各种接口.前后端数据传输接口,第三方业务平台接口.一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护.这篇文章重点讨论一下提 ...
- Python中列表、元组、字典、集合与字符串,相关函数,持续更新中……
本篇博客为博主第一次学 Python 所做的笔记(希望读者能够少点浮躁,认真阅读,平心静气学习!) 补充: 列表.元组和字符串共同属性: 属于有序序列,其中的元素有严格的先后顺序 都支持双向索引,索引 ...
- jmeter 相关
Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, ...
- 【自学编程】新手经常遇到的10大C语言基础算法,珍藏版源码值得收藏!
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.本文是近百个C语言算法系列的第二篇,包括了经典的Fibonacci数 ...
- mysql锁 转
参考文章:https://blog.csdn.net/puhaiyang/article/details/72284702 一.mysql锁的结构图 如上图所示,针对mysql的innodb存储引擎, ...
- go 多协程爬取图片
package main import ( "fmt" "github.com/antchfx/htmlquery" "golang.org/x/ne ...
- go mod模式,引入自己的包,goland飘红
- 服务器同一个tomcat部署2两个相同的项目
项目A,B(B 是A 的复制) 若把A,B工程同时部署到tomcat下,会发生只能访问A,B工程中的其中一个,而另一个会出现404错误(或者无法访问),此时可参照如下方法解决: 步骤1:找到工程下的w ...
- Python常用模块之random和time
常用模块: time: 分为三种格式: 1.时间戳:从1970年1月1日0点0分0秒到现在经过的秒数 用于时间间隔的计算 import time print(time.time()) 2.字符串显示时 ...
- 监听MySQL的binlog日志工具分析:Canal
Canal是阿里巴巴旗下的一款开源项目,利用Java开发.主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费,目前主要支持MySQL. GitHub地址:https://github. ...