文章目录

  • 先说问题:
  • 再说解决
    • 尝试1:
    • 尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试):

感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜

先说问题:

ceph 12.2.1生产环境:3副本 tier + 3副本data
机房在拥有业务的情况下重启集群交换机,产生如下场景:

  • time 1: osd.1 down, osd.2 osd.3 up
    此时数据先落到2,3上(2为primary)
  • time 2: osd.1 osd.2 osd.3 up
    此时状态机触发peering,根据pg_info和pg_log,构建missing列表,依据此列表进行后续的recovery(默认此时仅pg部分数据有变化,可通过权威日志恢复),但此时recovery并未完全恢复
  • time 3: osd.1 osd.2 up, osd.3 down
    根据此时osd的状态,因为上一个时间点osd.3上部分数据并未完全recover到osd.1上,此时osd.3就down了,但是对于osd.1来说已经获取到了missing列表并且将该列表中的对象操作数据追加到了pg_log_entry中,依此来pull或者push数据。但是此时osd.3已经down,这一些数据无法成功获取到osd.1上。此时集群的状态就会出现object unfound的情况,如下图:

我们的生产环境更是异常问题的叠加,因为出现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的对象一一恢复

尝试1:

对象级别的操作工具我们能够想到的ceph-object-toolrados这两个利器
对象的构成我们宏观来看:即数据+元数据
刚好,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的对象该如何修复?

尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试):

至此我们已经能够获取到对象的数据,但是因为集群中对象版本为0'0的对象是不存在的,所以无法设置这样的对象

那么我们可以尝试如下操作,首先对象在其未加入集群时会通过crush算法计算好自己即将映射到的osd以及对应的pg
ceph osd map pool_name obj_name命令可以看到该映射关系,那么我们可以认为只要知道对象的名字,那么它的映射关系实不会变化的。

依据以上过程,我们即可尝试这样的方案:

  1. 先从备份的磁盘上获取对应丢失对象的数据,通过 ceph-objectstore-toolget-bytes参数来获取
  2. 从备份的磁盘双获取对应丢失对象的元数据,通过ceph-objectstore-toolget-attr _获取object_info_t属性,通过get-attr snapset获取快照属性
  3. 每获取完一个pg上所有的unfound对象之后,即将该pg上的unfound对象都delete掉 ceph pg 8.32 mark_unfound_lost delete
  4. 使用rados命令,重新put同一个对象名,并指定我们第一步获取到的对象文件
  5. 将备份好的对象的oi属性和ss属性在osd down掉的情况设置进去

以上步骤可以简化为如下脚本:


#!/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块设备复现对象丢失的情况能够正常恢复。

再记一次ceph object unfound的艰辛历程相关推荐

  1. 再记一次 应用服务器 CPU 暴高事故分析

    一:背景 1. 前言 大概有2个月没写博客了,不是不想写哈????,关注公号的朋友应该知道我这两个月一直都在翻译文章,前前后后大概100篇左右吧,前几天看公号的 常读用户 降了好几十,心疼哈,还得回过 ...

  2. 请不要再记笔记了,四个词把人分为四类,最糟糕的一类人,颠覆了我们的认知。

    四类人? 少年你是不是走了弯路,千万不要让自己"看"起来很努力. 老子在的<道德经>中把做事的人分为四类: 一等人:聪明且勤奋: 二等人:聪明且懒惰: 三等人:愚蠢且懒 ...

  3. 再记一次止于三面的阿里面试之旅,感觉内心是拔凉拔凉的

    Hello 大家好,我是楠楠,最近心情不是很好,因为楠楠面试阿里三面挂掉了, 当收到下面这封邮件的时候猪猪内心是拔凉拔凉的.楠楠被 "Unfortunately","an ...

  4. 记一次ceph osd莫名其妙自动关闭进程异常

    某个在运行的ceph系统,巡检时发现osd掉线了,尝试将其启动,可以正常启动,数据恢复也正常,但是运行1-2分钟后osd又掉了,检查osd状态发现: 7f0231d85d80 -1 osd.2 199 ...

  5. 再记一下sscanf的一个小问题

    正在进行的项目中有个网络传输模块,需要在设备端将上位机发送的XML命令解析出来并转发到其它模块.在我测试一个获取数据的命令时,发现上位机读取到的数据是错误,看XML命令格式,明明是对的,但读到的数据就 ...

  6. ggThemeAssist:鼠标调整ggplot2主题,不用再记这些代码啦!

    文章目录 ggThemeAssist:鼠标调整主题,并返回代码 1. 设置 Settings 2. 面板和背景 Panel & Backgroud 3. 坐标轴 Axis 4. 标题与标签 T ...

  7. 再记AE与AO的区别与联系

    原文地址:转:ArcObjects与ArcEngine作者:梦游 ArcObjects(简称AO),一般都是指ArcGIS Desktop版本的组件开发集,即需要安装ArcGIS桌面版软件后才能安装这 ...

  8. emem今天再记一道套路whalectf pwn3

    这一题和上一题其实没啥大的区别一样是32位开了nx,cannary就是没有后门函数 main函数 int __cdecl main(int argc, const char **argv, const ...

  9. 再记公式弱爆了!用ChatGPT处理Excel问题,效率狂升

    作者:机器之心 人工智能新闻 精通 Excel 或许不再是简历亮点了. ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」 ...

最新文章

  1. 神经网络RNN图解!
  2. 360浏览器登录_360安全浏览器12下载-360安全浏览器12最新版下载
  3. Cortana 的谢幕,不一定是产品问题
  4. 吐血实践 三核就是强过双核
  5. Spark的Local模式及案例
  6. 新型内存攻击,专治制程提高的芯片
  7. Java高并发编程:线程范围内共享数据
  8. python获取数组中最多的元素
  9. 统计学习方法第十九章作业:马尔可夫链蒙特卡罗法、吉布斯抽样算法(书上题目) 代码实现
  10. 2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级
  11. hash 值重复_面试题:HashSet是如何保证元素不重复的
  12. 命令行linux iso,linux – 有没有办法从命令行更改.iso文件卷id?
  13. Pyomo 优化建模
  14. fastdfs文件上传 read timeout_121FastDFS实现文件上传下载
  15. 二、bootstrap table 父子表和行列调序
  16. 【旅行商问题】基于matlab免疫算法求解旅行商问题【含Matlab源码 195期】
  17. 求生之路2服务器无线跳,求生之路连跳宏 | 手游网游页游攻略大全
  18. 智能优化算法——蝙蝠算法(PythonMatlab实现)
  19. js封装ajax方法
  20. 基于ESP8266的空气温湿度检测系统

热门文章

  1. 28自定义View 模仿联系人字母侧栏
  2. Spark源码分析之七:Task运行(一)
  3. AFNetWorking 队列请求
  4. C语言程序设计 细节总结(链表)
  5. portal认证 php,配置外置Portal认证示例(命令行)
  6. vc2010解决方案项目编译顺序_科学网—VS2012 (2008,2010) 编译问题解决合集 - 冯博远的博文...
  7. python excel操作单元格_python 操作excel表格的方法
  8. python xpath用法_Python--xpath的使用
  9. 网关 0.0.0.0_久违的升级——全新米家智能多模网关
  10. linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘