前言

所谓吃一堑长一智,每次面对问题才是最好的学习机会,在面对问题的时候,尽量是能够自己去解决,或者去尝试能够最接近答案,确实无法解决再去寻求他人帮助,这样成长的会更快一些,在学校读书做题的时候,老师也是经常告诉我们要忍住,不要去直接翻答案,在当今的互联网飞速的发展下,在google的帮助下,基本上90%的问题都能找到正确的答案,而我们其实真正需要锻炼的是实践能力和甄别的能力

去年一年给不少的生产环境解决过问题,在相互交流几次以后,解决问题的过程,基本也熟悉了,一般解决问题的大致流程都是:

  • 告之我环境的当前状况,需要实现的情况
  • 准备好远程的环境
  • 告之对方可能出现的情况,是否可操作,然后解决问题
  • 交流问题的出现原因以及解决的办法

目前来看,基本都解决了,对于我来说是一次处理故障经验的累积,对对方来说是环境的恢复,以及下次在出现相同故障的时候,自己能够处理好类似问题

本次恢复对于我来说也是刷新了的认识,进展只到了解决问题的地方,就结束了,那么我就记录下这次解决问题当中的收获

处理过程

故障的发生应该是在一次掉电后触发的,整个集群在重新启动以后,出现了多块磁盘故障的问题,也有主机无法启动的情况,整个集群的PG状态处于一个混乱的状态,stale和incomplete以及peering状态的都很多

告之对方,需要把相关的osd节点全部都启动起来,然后再看是否有恢复的可能,常规来说,如果三台机器同时出现磁盘损坏,那么这个集群的数据必然会丢失,并且丢失的数据基本将是覆盖所有数据

在将近一周的时间以后,集群环境磁盘都能挂载,环境可以进行处理了

出现pg状态一直是peering状态的情况

用ceph -s 检查集群的状态,集群的状态所有的osd都是正常的up in状态,但是pg状态就是peering状态无法恢复,然后查看都是来自其中的某一个osd,登陆上机器后查看osd的日志,显示无法获取心跳,但是网络明明是好的,并且还能登陆到其他机器上,这就奇怪了,这里先讲下这个地方对方环境埋下的一个坑

hosts文件里面是这种组合

10.10.10.101 node1


192.168.10.1 node1


10.10.10.102 node2


192.168.10.2 node2


10.10.10.103 node3


192.168.10.3 node3

也就是一个主机名映射了两个IP,这个对方说没问题,我也就不多说了,只是我的环境是不会允许这么配置,正是因为这个配置,也就间接隐藏了一个错误的配置,这个错误就是居然在环境当中配置两台主机相同的IP,这也就是为什么出现相同的IP我还能登陆机器

环境配置成了

10.10.10.102 node3


192.168.10.3 node3

也就是node3和node2的集群IP冲突了,所以我在ssh node3的时候能正确登陆node3 ssh node2也能正确登陆node2,只是集群用的IP冲突了,而两台机器之间网络又可以通过其他的网段通信,集群的osd状态是正常,只是pg异常了

IP冲突在生产环境中是大忌,可能会毁掉整个集群的状态,这个有多大影响?你可以试下配置好一个集群,然后把两个节点的IP配置成一样,然后检查集群的状态和你的上面运行的存储的状态,这个环境因为是在不提供服务状态下,所以带来的影响没有那么大

在排查到这个错误的时候,已经是晚上快11点了,对方也要回家了,作为运维比较苦逼的就是很多时候,需要待在公司到晚上很晚才能离开,所以问了下是否能留远程给我,得到了许可,可以继续操作,因为这个环境状态来看我觉得还在我的可控范围内,所以想继续尝试,对方也是问过几次,这个环境是否可恢复,我给出的回答也是尽量,IP冲突的问题解决后,重新启动OSD,集群基本快正常了,还是有一些异常的PG需要处理

出现osd无法启动

verify_reply couldn't decrypt with error: error decoding block for decryption

这个错误之前有处理经验,时间偏移过大引起认证不通过,登陆上osd对应的机器,检查发现时间偏移了几个小时,引起错误,检查发现ntp配置文件使用的是默认配置文件,至少这台没配置ntp,调整好时间,重启osd解决无法启动问题

出现PG incomplete的状态

这个状态一般是环境出现过特别的异常状况,PG无法完成状态的更新,这个只要没有OSD被踢出去或者损坏掉,就好办,这个环境的多个PG的数据是一致的,只是状态不对,这个就把PG对应的OSD全部停掉,然后用ceph-object-tool 进行mark complete,然后重启osd,一般来说这个都是能解决了,没出意外,这个环境用工具进行了修复,当然8个这样的PG操作起来还是要比较长的时间,一个个的确认状态,还好都解决了,这个工具是jewel上面集成的,所以在老版本出现这个问题,可以通过升级后进行处理,之前有个别人的生产环境这么处理过这个问题

出现PG inconsistent状态的

这个是环境中有数据不一致了,这个算比较小的问题,直接对pg进行了repair的修复,然后pg状态就正常了,不得不说现在的ceph比很久前的版本要好很多,Jewel版本的修复工具已经非常完善了,基本能覆盖很多常规的故障

出现PG 处于activaing状态

上面的各种问题都处理过来了,到了最后一个,有一个PG处于activating状态,对于ceph来说真是一个都不能少,这个影响的是这个PG所在的存储池当中的数据,影响的范围也是存储池级别的,所以还是希望能够修复好,在反复重启这个pg的所在的osd后,发现这个pg总是无法正常,并且这个机器所在的OSD还会down掉,开始以为是操作没完成,需要很多数据要处理,所以增加了osd_op_thread_suicide_timeout的超时值,发现增大到180s以后还是会挂掉,然后报一堆东西,这个时候想起来还没去检查下这个PG是不是数据之前掉了,检查后就发现了问题,主PG里面的目录居然是空的,而另外两个副本里面的数据都是完整的并且一样的,应该是数据出了问题,造成PG无法正常

停止掉PG所在的三个OSD,使用ceph-object-tool进行pg数据备份,然后用ceph-object-tool在主PG上删除那个空的pg,这里要注意不要手动删除数据,用工具删除会去清理相关的元数据,而手动去删除可能会残留元数据而引起异常,然后用ceph-object-tool进行数据的导入,然后重启节点,还是无法正常,然后开日志看,发现是对象权限问题,用工具导入的时候,pg内的对象是root权限的,而ceph 启动的权限无法读取,手动给这个pg目录进行给予ceph的权限,重启osd,整个集群正常了

然后通知对方,环境修复好了,对方回复,有空检查下虚拟机情况,然后就没有然后了···

这个环境暴露的问题

1、主机名hosts内单主机名对应多IP

这个对于对主机名敏感的应用会受影响

2、环境出现IP冲突

这个属于细节问题,当然也是最不好排查的一种故障

3、环境内没配置内网ntp

操作其中的某台机器的时候报了,不清楚整个环境没配置还是只是一台没配置

4、有一个mon挂掉了,没有先处理

这个对于进行故障处理的时候经常会请求到故障的mon上,造成卡操作,因为不清楚mon状态,所以没启动,直接注释配置文件进行操作

5、主机环境的内存分配设置有问题

这个因为没太多交流也就不多说了

6、ceph版本为10.2.2

这个版本有什么问题吗?用的不是好好的吗?这个问题我一直认为公司一定需要有人会选择版本,这里说下怎么选,你也可以自检下自己的版本,当然你们研发觉得没问题,我也就不做过多评论,每个人有自己的想法,别乱来就好

  • 软件的开发一般会是隔一个版本会是一个长期支持版本,所以尽量不要选择

    INFERNALIS这个版本,Jewel刚出来,那么你应该选择harmer最后一个版本,而这个时候就会有人选择了Jewel版本,也就是上面的10.2.2或者更低10.0.x
  • 长期支持版本出来了,那么尽量等版本出到4或者5再去用,也就是现在的Jewel的10.2.5,这个版本不会出现大的bug,K版本就不要随便上生产,等等后面的 Luminous的稳定版本
  • 内部做升级需求的时候,在选择下个版本的时候同样是选择下一个长期支持版本的稳定版本,这样能保证软件的稳定性,以及版本的生命周期尽量长
  • 正常运行的时候都没事,碰上异常经常一搜就是已经解决了bug,等到这个时候再升级,就是故障中升级,拉长了故障恢复时间
  • 所以现在的版本能够用Jewel的最后一个版本和hammer的最后一个版本,一些能backports的功能,也会合成到hammer的最后一个版本
  • 小版本中间也可能有大变化,0.94.4和0.94.7这两个都是节点版本,节点版本就是你从更低的版本往更高的版本升级的时候,需要先来到节点版本,然后才能往上走,也就是迭代升级,如果不了解清楚,直接把集群升级到起不来也是会出现的事情

总结

本次处理的故障属于组合型的,本篇是博客当中贴命令最少的一篇,当然内容不少,相信你看了处理过程也会有所收获,不管你是搞云计算还是云存储,一定要重视数据的可恢复问题

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-02-24

记最近一次ceph故障修复的更多相关文章

  1. Ceph 故障修复记录(持续更新)

    目录 文章目录 目录 问题:故障域与副本数导致的 PG 不正常 问题:故障域与副本数导致的 PG 不正常 缘起:执行 rbd snap unprotect 执行卡死. 调查:Ceph 集群 PG 不正 ...

  2. 模拟MBR Grub故障修复

    1.  MBR故障修复 备份 mkdir /pp mount /dev/sdb1 /pp dd if=/dev/sda of=/pp/mrb.bak bs=512 count=1   破坏mrb dd ...

  3. CentOS7.3系统启动故障修复

    CentOS7.3系统启动故障修复 破解CentOS7的root口令方法一 启动时任意键暂停启动菜单,选择启动内核菜单项 按 e 键进入编辑模式 将光标移动 linux16 开始的行,添加内核参数rd ...

  4. MBR扇区故障修复!

    一:进行分区且格式化硬盘 [root@roomc~]#mkfs -t ext4 /dev/sdb1    //格式化sdb1盘 二:模拟破坏/sda主硬盘破坏再修复! [root@roomc~]#mk ...

  5. CentOS 6或7 启动故障修复及root密码破解

    CentOS 6或7 启动故障修复及root密码破解 目录 CentOS 6或7 启动故障修复及root密码破解 CentOS 6启动流程修复: 实验一:删除initramfs-2.6.32-754. ...

  6. 记一次ceph的故障修复(20160408)

    ceph的在正常运行的时候基本不会出现故障,出现故障一般在变动的时候,具体有下面几种可能出现的情形 软件升级 增加存储节点 减少存储节点 调整副本数目 调整pg数目 磁盘出现损坏 节点网络出现异常 以 ...

  7. web-project 故障修复功能 传递所有的event_id数据到后台

    <script language=javascript> function IdentifyRepair(event_id) { var url; url = "/View/fa ...

  8. MySQL MGR集群单主模式的自动搭建和自动化故障修复

    随着MySQL MGR的版本的升级以及技术成熟,在把MHA拉下神坛之后, MGR越来越成为MySQL高可用的首选方案.MGR的搭建并不算很复杂,但是有一系列手工操作步骤,为了简便MGR的搭建和故障诊断 ...

  9. CM记录-CDH故障修复处理记录

    CDH大数据集群修复记录 1)cm web打不开,查看监听7180端口产生了很多进程,于是kill进程:重启cloudera-cmf-server服务,几秒钟就挂了,查看cloudera-scm-se ...

随机推荐

  1. Mysql架构与内部模块-第三章

    前言 接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分. 正文: Mysql存储引擎作为本系列文章中相对重要的一环,也 ...

  2. 非科班8k,靠这套知识体系收入暴涨100%!

    我是18年毕业,非科班,毕业即进入互联网行业.坐标深圳,java程序员,当时到手薪资8k左右. bat等大厂月薪薪资动辄20k,25k,还不包括"签字费",福利和奖金.当然,薪资也 ...

  3. (在模仿中精进数据可视化03)OD数据的特殊可视化方式

    本文完整代码已上传至我的Github仓库https://github.com/CNFeffery/FefferyViz 1 简介 OD数据是交通.城市规划以及GIS等领域常见的一类数据,特点是每一条数 ...

  4. spring boot:swagger3的安全配置(swagger 3.0.0 / spring security / spring boot 2.3.3)

    一,swagger有哪些环节需要注意安全? 1,生产环境中,要关闭swagger application.properties中配置: springfox.documentation.swagger- ...

  5. doment ready事件和load事件的区别及实现

    从2017年9月至今工作中大部分使用react,前端渲染的一些基础性知识记忆不是很深刻了.面试**公司的时候,碰到"document ready和load的区别,以及document rea ...

  6. better-scroll插件 api

    Vue中的better-scroll插件 在需要的文件中添加 import BScorll from 'better-scroll'; 引用的示例代码: let scroll = new BScrol ...

  7. 16 String类

    java中的所有的字符串文字(例如"abc","123")都可以看做是实现了此类的实例对象 eg: String str = new String(); str ...

  8. Python之list函数

  9. 前端未来趋势之原生API:Web Components

    声明:未经允许,不得转载. Web Components 现世很久了,所以你可能听说过,甚至学习过,非常了解了.但是没关系,可以再重温一下,温故知新. 浏览器原生能力越来越强. js 曾经的 JQue ...

  10. P6773 [NOI2020]命运

    整体DP 很明显计算答案需要用容斥计算,如果暴力容斥的话,就是枚举哪些路径不符合条件,在这些路径的并集中的边都不能取,其他边任意取,设当前取了$i$条路径,那么对答案的贡献是$(-1)^i2^{n-1 ...