ceph 12.2.1生产环境:3副本 tier + 3副本data
机房在拥有业务的情况下重启集群交换机,产生如下场景:
我们的生产环境更是异常问题的叠加,因为出现unfound的对象,同时又出现osd无法成功Recover而报出的段错误无法启动,此时丢掉的对象如果想要恢复,貌似只有revert或者delete了
关于PGlog的相关描述以及pg_log和pg_info如何参与到状态机中进行peer,recover和backfill的相关过程可以参考PGlog写流程梳理
知道了问题,并且能够复现问题,接下来就是如何解决的过程了。
首先我们知道部分数据并未完全丢失,它可能是存在于down掉的osd中,为了后续的恢复,我们先将down掉的osd进行数据备份。
使用dd将down掉的osd所在的磁盘数据备份到一块空的磁盘上即可。
操作前先分析当前异常环境的处境以及我们想要达到的最终目标:
我们拥有的资源:备份完好的osd磁盘(数据未丢失)
我们的处境:对象丢失,深层含义就是当前环境没有任何一个up的osd承载该对象,但是该对象的操作版本被pg_log记录,环境曾经有过该对象。
分析:加入我们没有备份好的数据资源,遇到这样的情况貌似只能对unfound对象所在pg进行revert和delete了,但是我们备份了数据
最终要做的就是尽可能完整得将我们备份的数据迁移至现有集群,让改集群unfound的对象一一恢复
对象级别的操作工具我们能够想到的ceph-object-tool
,rados
这两个利器
对象的构成我们宏观来看:即数据+元数据
刚好,ceph-object-tool
工具拥有参数get-bytes
,set-bytes
,get-attr
,set-attr
这样的子命令。
于是我们尝试将备份的磁盘数据中将对应的丢失对象使用get-bytes
获取出来,然后再使用set-bytes
将该对象的数据写回集群,同时将对应对象的属性也设置回集群,这样我们猜想,osd起来之后有了对象以及对象的元数据,即可成功恢复。操作如下:
挂载备份数据的磁盘分区
a. mkdir /ceph-0
b. mount /dev/sdb1 /ceph-0
查看丢失的对象
a. ceph health detail
获取丢失对象的pg id
b. ceph pg 14.20 list_missing
列出丢失对象的pg 14.20的丢失对象信息
从备份的磁盘分区中获取丢失的对象数据和元数据
a. ceph-objectstore-tool --data-path /ceph-0/ --type bluestore obj470 get-bytes obj470.txt
获取对象obj470的数据,并放入到obj470.txt文件
关于ceph-object-tool
工具的使用可以参考ceph-object-tool使用详解
b. ceph-objectstore-tool --data-path /ceph-0/ --type bluestore obj470 get-attrs _ > obj470.attr
获取对象obj470的属性数据,即元数据信息到obj470.attr中
src/common/ceph_objectstore_tool.cc
中可以看到该属性信息为object_info_t
数据
则我们可以通过命令ceph-dencoder
来解码查看,关于ceph-dencoder
命令的使用可以参考文档ceph-dencoder使用详解
ceph-dencoder type object_info_t import obj470.attr decode dump_json
将获取到的数据设置到集群osd中,此时需要osd的状态为down,能够操作/var/lib/ceph/osd/ceph-id
目录
a. ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0/ --type bluestore obj470 set-attrs _ obj470.attr
设置对象属性
b. ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-0/ --type bluestore obj470 set-bytes obj470.txt
设置对象数据信息
此时有两种情况:
如果对象的have版本为0'0
,即对象当前并不存在于集群中,集群只有一个初始的空版本对象,执行以上命令会有如下输出
No object id 'get-bytes' found or invalid JSON specified
显然该方案走到这里即出现阻塞性的情况,对应对象版本为0'0
的对象该如何修复?
至此我们已经能够获取到对象的数据,但是因为集群中对象版本为0'0
的对象是不存在的,所以无法设置这样的对象
那么我们可以尝试如下操作,首先对象在其未加入集群时会通过crush算法计算好自己即将映射到的osd以及对应的pg
ceph osd map pool_name obj_name
命令可以看到该映射关系,那么我们可以认为只要知道对象的名字,那么它的映射关系实不会变化的。
依据以上过程,我们即可尝试这样的方案:
ceph-objectstore-tool
的get-bytes
参数来获取ceph-objectstore-tool
的get-attr _
获取object_info_t
属性,通过get-attr snapset
获取快照属性ceph pg 8.32 mark_unfound_lost delete
rados
命令,重新put同一个对象名,并指定我们第一步获取到的对象文件以上步骤可以简化为如下脚本:
#!/bin/bash
tier_pool=$1pg_list=`ceph health detail |grep unfound|grep has|awk '{print $2}'`for i in ${pg_list}
do# 按照PG编号,获取丢失对象列表ceph pg $i list_missing|grep "rbd_dat"|sed 's/"/ /g'|awk -F: '{print $2}'|awk '{print $1}' > "$i".txt#以PG为编号,从备份的磁盘挂载点获取丢失对象的数据for j in `cat "$i".txt` doceph-objectstore-tool --data-path /test_ceph0/ --type bluestore --pgid $i $j get-bytes "$i"/"$j".txtceph-objectstore-tool --data-path /test_ceph0/ --type bluestore --pgid $i $j get-attr _ > "$i"/"$j".oiceph-objectstore-tool --data-path /test_ceph0/ --type bluestore --pgid $i $j get-attr snapset > "$i"/"$j".ssecho $i $jdoneif [ -e "$i".txt ];then #检测到按PG编号 存储对象列表的文件存在,则进行pg的delete操作ceph pg $i mark_unfound_lost deleteelseecho "$i.txt is not exists,please check"exit 1fiecho $ifor k in `cat "$i".txt` #将拷贝出来的对象文件,按照对象名重新put到资源池dorados -p $tier_pool put $k "$i"/"$k".txt;echo $kdonesleep 100 #处理完一个pg,睡眠100秒,让上一个PG数据重构一会
done
该尝试能够将对象最原本的数据恢复到集群异常前的最新状态,目前在使用rbd-nbd
命令挂载的rbd块设备复现对象丢失的情况能够正常恢复。
点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...
RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...
MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...
这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...
本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...
我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...
作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...
这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...
这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...