问题描述
ceph集群状态为HEALTH_ERR,ceph -s显示有pg状态不一致,ceph health detail输出如下:
1 | # ceph health detail |
分析 & 解决
手动执行pg修复
ceph pg repair 14.16a
ceph pg deep-scrub 14.16a
结果:集群状态依旧HEALTH_ERR
重启对应osd daemon
systemctl restart ceph-osd@
结果:集群状态依旧HEALTH_ERR
检查ceph-osd log
1 | # vim ceph-osd.1.log-xxx.gz |
上面可以看出pg 14.16a里有几个objects报告candidate had a read error
查看出错的object的md5值
1 | # md5sum /var/lib/ceph/osd/ceph-1/current/14.16a_head/10000002380.0000061d__head_33F2856A__e |
上面得出ceph-27上的object获取md5值失败,报Input/output error,这里猜测其对应的磁盘有问题;
查看ceph-27上pg 14.16a里别的object的md5值,输出正常,则证明磁盘还能工作,可能是文件有损坏,也可能磁盘上有部分坏道;
删除md5sum报IO错误的文件,然后执行ceph pg repair 14.16a,pg状态恢复正常;
磁盘检查与恢复
那磁盘是否有问题呢?执行以下步骤来检测并恢复:
1 | # systemctl stop ceph-osd@27.service |
上述检查会花费比较长时间,一般SATA盘的read速度为100-120MB/s,4TB大小的SATA盘,约需要410241024/120/3600 = 9.7小时;
不过你可以在别的窗口查看输出文件badblocks.log的内容,如果里面有信息,那证明你的磁盘确实有坏块,就需要尝试恢复检查了:
1 | # head -n 10 badblocks.log |
通过badblocks修复坏块,注意会丢失坏块里的数据
1 | # badblocks -ws /dev/sdi1 10633 10624 |
通过上述步骤恢复了磁盘中的坏块,有如下两种情况:
坏块中有xfs的元数据信息
执行xfs_repair修复磁盘上的xfs系统,很可能报错;
没有办法,只能重新格式化磁盘,然后执行ceph的recovery了;
坏块中无xfs的元数据信息
通过xfs_repair修复磁盘上的xfs系统,报告done
1 | # xfs_repair -f /dev/sdi1 |
这时mount,start ceph-osd damon后,ceph报HEALTH_OK,但其实osd上的部分数据已经丢失,这个等ceph的deep scrub触发后会自动修复;
参考
http://ceph.com/planet/ceph-manually-repair-object/
https://linux.cn/article-7961-1.html