sleep期间读取所有_ceph部分数据所有副本先后故障的抢救

779c4ad481542518f14c4062236b264c.png

ce771fc3ce63d19b5d6a71bd700ad73b.png
半天河
网易游戏高级运维工程师,主要负责云存储的运维;一个既希望跟业务聊又喜欢能够默默在后面忙活的普通运维人。

背景故障现场故障恢复故障恢复分析第一种方式:物理磁盘对拷第二种方式:服务启动时跳过故障扇区来避免异常退出解决方案恢复流程找到故障扇区处的文件移走故障扇区的文件总结

背景

对于 ceph 运维而言,硬件故障导致的 ceph 存储故障是占比最高的一个故障源,小到单个磁盘故障大到机器故障,每天都在上演,ceph 的多副本、故障域等机制已经能够保证绝大部分的硬件故障不影响整个 ceph 集群的可用性,比如:

  • 多副本能够确保只要还有一个副本在,数据就不会丢失,业务依然可用
  • 故障域的划分能够确保一个故障域内的机器或者机柜故障时,数据不会丢失,业务依然可用
  • 有需要时还可以将故障服务踢出集群,触发数据迁移到故障域内其他硬盘,缩短副本数不达标的时间,降低二次故障的影响

但是在日常实际场景中,概率低不代表不会发生,我们必须对这种虽然概率低但是影响可能很大的故障做好预案,确保一旦发生故障能够快速恢复服务。

故障现场

这里先简单介绍一下整个故障现场:

  • ceph 的版本是Hammer 0.94.5
  • 故障域是 host,副本数是 2(即同一个业务的数据会写两份,落在不同 host 的各一个硬盘上)
  • 一台服务器的一块硬盘故障
  • 更换磁盘,同步数据
  • 另一台服务器上又有一块硬盘故障
  • 数据两个副本存放在这两块硬盘上的所有业务请求被 block 住
  • 集群状态关键信息如下:
    2 pgs down; 2 pgs peering;
    57 requests are blocked > 32 sec;
    recovery 4292086/381750087 objects degraded (1.124%);
    recovery 7/137511185 unfound (0.000%);
    21/967 in osds are down;
    • down 表示有部分数据的两个副本都不在线
    • 有 57 个客户端的请求被 block 超过 32 秒
    • 注意这里是 7 个对象的状态是 unfound

故障恢复

故障恢复分析

目前数据层的影响面及恢复分析如下:

  • 毫无疑问,第一要务是先拉回所有存储服务
  • 服务都在线后才能明确两块硬盘先后故障是否有数据丢失
  • 根据数据实际情况再决定后续恢复操作

目前是因为磁盘有坏道,读取坏道数据出错导致服务无法启动。

第一种方式:物理磁盘对拷

最先想到也是操作最简单的一种方法就是将故障盘数据全量拷贝到一块新的硬盘上,忽略其中的故障扇区读取错误,方法如下:

  • 在同机房找到一台空闲服务器,插上新硬盘,格式化分区
  • 通过 dd+nc 的方式将故障盘数据 dd 到准备的新盘
    # 备用机器,新硬盘
    nc -lp {port} | dd of=/dev/sde1
    # 故障机器
    dd if=/dev/sdX conv=noerror | nc -q 10 {backup ip} {nc port}
  • 拷贝完成后将新盘替换掉故障盘启动服务即可
  • 这种方法是可行的,尤其是对于较大范围的磁盘硬件故障这是一个相对稳妥且节省人力的方法
  • 但是由于故障 SAS 盘读写速度也就 200MB/s 的峰值,即使保持这个速度,1.2TB 的盘同步完成也需要接近两小时,线上业务坐等两小时是无计可施的保底方法。

第二种方式:服务启动时跳过故障扇区来避免异常退出

解决方案

回过头仔细分析本次故障的信息及规避方法汇总如下:

  • 磁盘故障范围小,虽然 dmesg 很多报错信息,但是都集中在同一个扇区
    Sep 26 16:09:33 cld-XXXX-XX kernel: [51720946.582063] end_request: critical medium error, dev sdd, sector 49382788
    ...
    Sep 26 16:23:02 cld-XXXX-XX kernel: [51721756.747154] end_request: critical medium error, dev sdd, sector 49382788
  • 存储服务启动时的报错信息是读写错误,尝试启动一次上面的 dmesg 信息就会再刷一些通用的日志:
    FAILED assert(0 == "Input/output error")
  • 找到故障扇区所在的文件,移走该文件,移走文件并不会变更该扇区所在的文件,以确保故障扇区依然被占用而不会分配给其他文件使用
  • osd 启动时就不会读取故障扇区所在文件,就不会抛异常退出

恢复流程

经过上述分析后,恢复流程就比较清晰而且简单了:

找到故障扇区处的文件

  • 在配置文件中调大 osd 服务的 debug_filestore 日志级别到 20/20
  • 启动故障盘的存储服务,从日志中可以看到故障扇区的文件,如下
    7f08ae8ee700 10 filestore(/home/ceph/var/lib/osd/ceph-387) FileStore::read(28.7cb_head/b7e767cb/rb.0.8e1ad1d.238e1f29.00000000a418/head//28) pread error: (5) Input/output error
  • 得到关键信息:PG 是 28.7cb ,目录结构是b7e767cb,故障扇区所在文件是 rb.0.8e1ad1d.238e1f29.00000000a418
  • 根据 filestore 的存储规则定位到该对象在磁盘上的绝对路径如下:
    /home/ceph/var/lib/osd/ceph-387/current/28.7cb_head/DIR_B/DIR_C/DIR_7/DIR_6/rb.0.8e1ad1d.238e1f29.00000000a418__head_B7E767CB__1c
TIPS:filestore 是以文件的形式存储,同时为了避免单目录下文件数过多影响性能,osd 会将这些对象分多级目录存储,从前面的日志中可以看到对象路径是<pg_id>/b7e767cb/<object_name>,这里面的b7e767cb就是用来分子目录时的目录名,根据当前目录层级是 4(由当前 pool 的总对象数和各层文件数决定),可知道这个 object 存储在磁盘上的路径是:<pg_id>/DIR_B/DIR_C/DIR_7/DIR_6/<object_name>

移走故障扇区的文件

这时候通过 cat 尝试查看这个文件可以看到中途会卡住,dmesg 也会继续刷上面的扇区错误,进一步实锤了磁盘坏道所在文件即为rb.0.8e1ad1d.238e1f29.00000000a418__head_B7E767CB__1c

  • 移动故障对象
    mv /home/ceph/var/lib/osd/ceph-387/current/28.7cb_head/DIR_B/DIR_C/DIR_7/DIR_6/rb.0.8e1ad1d.238e1f29.00000000a418__head_B7E767CB__1c /home/ceph/var/lib/osd/ceph-387
  • 拉起服务,成功运行,一段时间后集群状态如下这个 object 状态仍然是 unfound:
    1 requests are blocked > 32 sec;
    recovery 1/137522689 unfound (0.000%);
  • 注意这里的recovery 1/137524092 unfound (0.000%),前面服务没有拉起来时 ceph 提示有 7 个对象处于 unfound,现在只剩下一个了,这个对象的 osd 的日志提示如下:
    # 从名字上看也恰好是故障扇区的那个文件
    28.7cb missing primary copy of b7e767cb/rb.0.8e1ad1d.238e1f29.00000000a418/head//28, unfound
TIPS:ceph 的对象包括三个部分的数据,一个是纯数据部分,一个是文件系统扩展属性提供的元数据,一个 ceph 自己实现的 omap 元数据,这里的 unfound 表示 ceph 在本地没有找到跟元数据中记录的版本一致的对象,unfound 数量变少,说明经过版本比对,其他 6 个对象的版本和其他副本的版本是一致的。
  • 这时候只能用以下命令通过 ceph 将这个 pg 下的 object 回滚到另一个副本上的版本了
    ceph pg 28.7cb mark_unfound_lost revert
TIPS:因为第一块盘故障离线期间 ceph 是还可以继续使用的,这期间有对象发生数据更新,而更新的这部分数据就只在第二块故障盘上有,因此就造成了这个对象有两个版本,新的版本不可用,因此使用 revert 来告诉 ceph 使用较老版本;如果两个副本同时不可用,只能使用 lost 来标记对象丢失来恢复服务。

至此,集群完全恢复,后续的步骤就是根据这个故障对象名找到 rbd,继而找到所属的虚拟机,请求业务确认影响面并检查虚拟机。

总结

以上就是我们针对双副本对象的两个副本因为故障先后离线这种极端情况下进行数据抢救的过程。针对故障、抢救过程以及后续优化总结如下:

  • 单个磁盘故障可能会导致整个机器的 raid 卡控制器 reset
  • 在一个副本故障期间,又有新的磁盘硬件故障,就导致了本问描述的严重故障,三副本能大大减少本次故障概率
  • 如果硬盘故障,在完全恢复前不要删除数据或者格式化硬盘,以免碰到另一个副本也故障时,连回滚来版本的机会也没有了
  • 抢救的根本方法是找到问题症结,如本次故障中采用移走故障文件的方式就可以解决无法启动问题
  • ceph 故障都会有比较详细的日志提示,根据提示结合 ceph 的结构特点做针对性的处理即可
  • 双副本发生二次故障的概率更高,尤其是使用年限较高深圳过保的老集群
  • 对于关掉了 deep-scrub 的集群,需要手动不定期去触发 deep-scrub,防止一些可能隐藏的磁盘故障。

往期精彩

那些年,CDN踩过的坑

智能监控中的时间序列预测

使用 d3.js 绘制资源拓扑图

运维里的人工智能

CI构建环境下的docker build最佳实践

ce771fc3ce63d19b5d6a71bd700ad73b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】有限状态机用法教程

如博文无法正常显示&#xff0c;请访问原文地址&#xff1a; https://blog.csdn.net/ChinarCSDN/article/details/82263126 有限状态机用法教程 文章目录 有限状态机用法教程 [toc]1Finite-state machine —— 有限状态机2Foreword —— 前言()3Example —— 示例4Moltimode —…

通用usb集线器驱动_多口充电、高速传输——ORICO晶锐系列7口集线器测评

随着笔电越来越薄&#xff0c;机身接口数量越来越少&#xff0c;U盘、存储卡、移动硬盘、鼠标、蓝牙适配器等明显感觉无处可插&#xff0c;因此USB集线器就成为笔电的最佳拍档。近期&#xff0c;ORICO(奥睿科)推出了一款晶锐系列7口集线器产品&#xff0c;它集成了7个USB3.0接口…

【转】状态机思路在程序设计中的应用

状态机思路在单片机程序设计中的应用 状态机的概念 状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中&#xff0c;必然有状态机的身影浮现。 比如说一个按键命令解析程序&#xff0c;就可以被看做状态机&#xff1a;本…

【转】超详细的UML状态图符号,初学者也能轻松看懂状态图

UML状态图&#xff0c;用于显示状态机&#xff0c;即描述一个对象所处的可能状态以及状态之间的转移。用状态图建模可以帮助开发人员分析复杂对象的各种状态的转换&#xff0c;以及对象何时执行怎样的动作。那状态图又是怎样表示这些信息的呢&#xff1f;要想看明白其中的奥妙&…

舒尔特注意力训练表格_舒尔特注意力训练,舒尔特方格练习入口

孩子的注意力是否集中&#xff0c;直接影响孩子的上课效率和作业正确率&#xff0c;最终影响学习成绩。道理大家都懂&#xff0c;关键是如何保证注意力的集中。接下来&#xff0c;我给大家推荐一个简单方便在家就能完成的训练方法&#xff0c;把它比作小游戏也不为过。那就是舒…

nginx文件系统大小_Nginx 了解一下?

这篇文章主要简单的介绍下 Nginx 的相关知识&#xff0c;主要包括以下几部分内容&#xff1a;Nginx 适用于哪些场景&#xff1f;为什么会出现 Nginx&#xff1f;Nginx 优点Nginx 的编译与配置Nginx 适用于哪些场景&#xff1f;如图所示&#xff0c;一个请求会先经过 Nginx 到达…

存储过程排版工具_安利一款比Evernote更为实用的云笔记工具,不容错过

作为一个爱分享的自媒体人&#xff0c;出于工作和兴趣前前后后接触到的云笔记工具很多&#xff0c;例如&#xff1a;有道云笔记、为知笔记、语雀、印象笔记、oneNote...在笔记工具的使用上还是略有点点心得&#xff0c;今天给大家分享一款实用的云笔记工具——Baklib&#xff0…

【转】有限状态机(FSM)学习总结C#

FSM&#xff08;Finite State Machine有限状态机&#xff09;可以理解成是对行为逻辑的抽象&#xff0c;就好象人在生活中会做出各种行为&#xff0c;例如吃饭、睡觉等&#xff0c;这些所有我们都看作是“行为”的分支&#xff0c;由大脑决定每种行为具体是什么实施。在整个FSM…

【转】[完全免费] 在线UML Sequence Diagram 时序图工具 - 教程第3部分

时序图教程 甲序列图描述了一组对象之间的相互作用参与协作&#xff08;或情况&#xff09;&#xff0c;布置成按时间顺序; 它通过它们的“生命线”和它们发送给对方的消息来显示参与交互的对象。 什么是UML中的序列图&#xff1f; UML序列图是详细说明如何执行操作的交互图。…

【转】[完全免费] 在线UML Class Diagram 类图工具 - 教程第1部分

在线Visual Paradigm - UML编辑器 使用在线UML编辑器轻松绘制UML图&#xff0c;其中包含功能强大的UML编辑工具&#xff0c;即时UML语法检查和整洁的用户界面。Visual Paradigm在线UML 图&#xff0c;如类&#xff0c;用例&#xff0c;序列&#xff0c;活动&#xff0c;部署&a…

python 定时器_python 线程之四:定时器(Timer),非阻塞

线程之一讲了线程&#xff0c;如果不熟悉&#xff0c;可以点击【线程之一&#xff1a;线程的创建、启动及运行方式】1、定时器实质&#xff1a;Timer 定时器源码实现&#xff0c;和我们自定义一个线程方式一样&#xff0c;都是继承了 Thread 类&#xff0c;重写了 run() 方法&a…

人如何认知事物?

自然界是连续的&#xff0c;人类将自然界离散化成一个个独立的概念&#xff0c;独立的概念相互关联&#xff0c;形成模型&#xff0c;随着模型的完善&#xff0c;模型会不断逼近真实事物。 比如人类创造了各种学科&#xff0c;就是从不同的方面深入研究世界的结果。 所以&…

域内定位个人PC的三种方式(1)

会话搜集 在cmd下调用query session命令可以获得当前环境下的windows会话 NetSessionEnum 这个函数不允许直接查询是谁登陆&#xff0c;但是它允许查询是谁在访问此工作站的网络资源时所创建的网络会话&#xff0c;从而知道来自何处&#xff0c;此函数不需要高权限即可查询 第…

02.Teams组成概述及使用分享

在上一篇博客中介绍了Teams的前世今生&#xff0c;大家对Teams已经有了一个初步的认识&#xff0c;但是如上一篇文章中所说Teams是一个集成度很高的云协作平台&#xff0c;具体应该怎么去有效的利用起来呢&#xff1f;接下来这篇博客给大家全方位的分享一下Teams的组成部分以及…

【Qt】解决GDAL直接读取数据到QImage导致图像歪斜的问题

QRect intersect_rect; .... QImage img(intersect_rect.size(), QImage::Format_RGB888); uchar *pImageData (unsigned char *)img.constBits(); int img_width intersect_rect.width(); int img_height intersect_rect.height();// QImage每行是按照sizeof(int)对齐的&am…

高斯课堂数电讲义笔记_【法考经验贴】40岁三战主观题127分!他的笔记学习法助他逆袭!...

这位学员在考证界算是“高龄学员”&#xff0c;高分过关依赖于他的努力和正确的学习方法&#xff1b;本文中他有重点介绍自己是如何做笔记的&#xff0c;非常值得大家学习借鉴&#xff01;一、个人概况&#xff1a;三战法考我正值不惑之年&#xff0c;是一名在职基层人民警察&a…

【转】持续交付和DevOps的前世今生

作者/分享人&#xff1a;乔梁&#xff0c;20年IT老兵&#xff0c;腾讯公司高级管理顾问&#xff0c;敏捷和精益开发专家&#xff0c;持续交付领域先行者。曾就职于百度&#xff0c;国内多个知名互联网公司的企业教练。 历年QCon技术大会的讲师和专题出品人。 这是一个新概念风起…

关联规则挖掘算法_基于Apriori关联规则的协同过滤算法

Apriori 算法apriori关联规则算法的原理设计较为简单&#xff0c;著名的“啤酒和尿布”说的就是Apriori算法&#xff0c;通俗来讲apriori旨在寻找频繁项集&#xff0c;以帮助商家将消费者有可能一起搭配购买的物品放置在同一个地方&#xff0c;提高消费者的购物效率和良好的购物…

【转】RabbitMQ六种队列模式-1.简单队列模式

前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 在官网的教程中&#xff0c;描述了如上六类工作队列模式&#xff1a; 简单队列模式&#xff1a;最简单的…