对于存储系统,磁盘是消耗品,损坏是很常见的,所以这篇文章记录一下 Ceph 中出现磁盘损坏时的现象,以及如何定位和更换损坏的磁盘。
1. 磁盘损坏
1.1 现象
工作环境中出现问题的 Ceph 的数据是双备份的,OSD 35 所在的磁盘出现了坏道,表现出来的现象是 ceph 经常会报出存储在 OSD 35 上的 pg 数据不一致,以及报出 scrub error,以下是 ceph health detail 命令输出新相关信息。
$ ceph health detail
......
OSD_SCRUB_ERRORS 31 scrub errors
PG_DAMAGED Possible data damage: 5 pgs inconsistent
pg 41.33 is active+clean+inconsistent, acting [35,33]
pg 41.42 is active+clean+inconsistent, acting [29,35]
pg 51.24 is active+clean+inconsistent, acting [35,43]
pg 51.77 is active+clean+inconsistent, acting [28,35]
pg 51.7b is active+clean+inconsistent, acting [35,46]
......
1.2 数据状态
因为数据只有双备份,ceph 无法确定哪个备份中的数据是可用的,所以此时虽然显示 pg 状态是 active+clean,但有问题的数据其实是不可用的。
1.3 临时解决方法
作为临时的解决方案,可以执行 ceph pg repair 解决,此时由于磁盘坏道造成不可读的数据会拷贝到其他位置。但这不能从根本上解决问题,磁盘损坏会持续报出类似的错误。
$ ceph pg repair 41.33
$ ceph pg repair 41.42
$ ceph pg repair 51.24
$ ceph pg repair 51.77
$ ceph pg repair 51.7b
2. 定位并检查故障磁盘
知道 OSD 35 有问题,但我们现在还不知道对应的是具体哪块磁盘。我们可以登录到对应到 OSD 服务器上查看 OSD 35 的目录名称,并查看 PVS 的对应关系来解决。
$ ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 127.09767 root default
-5 127.09767 host osd7
......
33 hdd 5.52599 osd.35 up 1.00000 1.00000
......
通过这个命令,我们可以知道 OSD.35 是位于 OSD7 这台服务器上。接下来,我们登录到 OSD7 上,并切换为 root 权限。
$ ssh osd7
$ sudo -i
然后进入到 OSD.35 的目录里。
# cd /var/lib/ceph/osd/ceph-35
再来查看 PVS 信息。
# pvs -o+pv_used
......
PV VG Fmt Attr PSize PFree Used
/dev/sda5 ubuntu-vg lvm2 a-- 446.65g 0 446.65g
/dev/sdc ceph-320de131-5f26-48a7-aa64-c7f08f87cd85 lvm2 a-- 5.46t 0 5.46t
......
好,现在我们终于知道,/dev/sdc 就是 OSD.35
3. 获取磁盘错误信息
我们已经知道是哪个磁盘出错,接下来就要向磁盘的提供商报修,或者联系购买新磁盘了。如果是报修,对方必然要求提供磁盘出错信息,接下来咱们就看一下如何拿到这些信息,这里我们要用到的命令好工具是 SMART monitor tool,Debian 系的系统可以通过 APT 安装:
$ sudo apt install -y smartmontools
RedHat 系的系统用 yum 安装:
$ sudo yum install -y smartmontools
安装完成后用如下命令获取输出信息即可,这里需要注意一下输出中序列号这项信息,这次磁盘的唯一标识,后面会用到:Serial Number: 57J6KA41F6CD
$ sudo smartctl -a /dev/sdc
smartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.4.0-121-generic] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Device Model: TOSHIBA MG04ACA600E
Serial Number: 57J6KA41F6CD
LU WWN Device Id: 5 000039 7cb9822be
Firmware Version: FS1K
User Capacity: 6,001,175,126,016 bytes [6.00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: ATA8-ACS (minor revision not indicated)
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Tue Aug 7 14:46:45 2018 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
...
4. 点亮硬盘指示灯
最后,存储厂商同意保修,或者购买新硬盘进行更换,都需要知道磁盘具体插在哪个 PCIe 口上。虽然我们已经知道是哪个设备了,本例中是 /dev/sdc,但这依旧不够直观,如果能让坏掉的硬盘的指示灯亮起,那么就非常方便维修人员查找和更换了。这就需要用到 SAS-x integrated RAID configuration utility 了。
该文件没有提供 APT 和 YUM 源的下载方式,只能从网上找到 RPM 或可执行文件,以下链接是该文件的百度云盘地址:
sas3ircu
下载好后,先执行 display 命令,查找全部磁盘信息。
$ sudo ./sas3ircu 0 display
......
Device is a Hard disk
Enclosure # : 2
Slot # : 0
SAS Address : 5003048-0-1867-f140
State : Ready (RDY)
Size (in MB)/(in sectors) : 5723166/11721045167
Manufacturer : ATA
Model Number : TOSHIBA MG04ACA6
Firmware Revision : FS1K
Serial No : 57J6KA41F6CD
Unit Serial No(VPD) : 57J6KA41F6CD
GUID : 50000397cb9822be
Protocol : SATA
Drive Type : SATA_HDD
......
从输出结果来看,Serial No : 57J6KA41F6CD,和之前 smartctl 查询到的结果一致,那么我们就知道这次磁盘的位置是
Enclosure # : 2
Slot # : 0
接下来执行下面的命令点亮对应硬盘的指示灯:
sudo ./sas3ircu 0 locate 2:0 on
另外更换完毕后,自然还要执行该命令关掉指示灯:
sudo ./sas3ircu 0 locate 2:0 off