
1.环境
- openstack加ceph,计算存储放在一起,管理节点独立。
- 4个存储节点,每个节点12块3T的SATA硬盘,都做OSD
- sda是120G的Intel S3500既做操作系统分区又分出6个10G做日志
- sdb是120G的Intel S3500分6个10G分区只做日志
- 虚拟机大多是UbuntuKylinDesktop1404,作为开发测试虚拟机
- ceph集群分public和cluster两个网段,都是万兆
- ceph是0.87.9
- 3个mon分布在管理节点和2个存储节点
2.问题
某一天管理节点网络无法连接,直连存储节点node-63正常。在机房管理员修复网络后,用户反映桌面无法卡顿,查看集群状态发现node-65节点有OSD状态是down,但是此时node-65已经无法通过ssh连接,处于输入用户名密码后挂起状态。
3.思考及处理流程
3.1.IPMI远程查看node-65
有IPMI还是方便很多的,无需去机房就可以实现对服务器的所有操作。从IPMI上看到服务器报了一些错,同时点击鼠标键盘无反应,实地去机房接显示器和键盘输入用户名等待很久才提示输入密码,输入密码后一直卡在登陆界面。
此时判断应该是服务器出现某种错误导致挂起不能正常提供服务
3.2.重启服务器
经过上面的判断,基本上只能重启了,为了防止数据进行大规模迁移,执行下面的命令禁止数据进行backfill和recover:
1 | ceph osd set nobackfill |
重启服务器后能够正常登陆,但是负载很大。命令交互很大延迟。此时频繁出现某一个OSD重启的情况,查看所有OSD性能如下:
1 | root@node-67:~# ceph osd perf |
其中ID为3,9,12,15的OSD都在node-65上。且此时osd.6一直处于down状态。
此时感觉是node-65的负载问题拖累整个集群,但是由于osd.6又正常,因此尝试将延时太高的这4个节点的
primary-affinity
设为0。
3.3.修改primary-affinity为0.0
通过下面的命令修改延时高的4个OSD的primary-affinity为0.0:
1 | ceph osd primary-affinity 3 0.0 |
但是实际上并没有什么效果,osd perf显示延时很大,看ceph日志写操作大都处于slow request状态。
实际上这一步只是当时瞎投医。因此尝试将这几个OSD的reweight调为0
3.4.调整延时大的OSD的reweight为0
使用下面的命令将OSD的reweight设为0:
1 | #先清除前面设置的禁止数据迁移的标记 |
由于此时虚拟机已经基本上都处于瘫痪状态,直接将backfill和recover的优先级、进程数调到最大。等到数据完全同步后,node-65的负载居然恢复正常了。(期间node-65上OSD.0也出现同样问题,再次调整reweight,等待同步)
此时来看,应该是OSD服务导致node-65负载过高,此时可以登陆node-65仔细检查。
3.5.登陆node-65检查
首先是通过smartctl、dmesg和syslog等查看上述OSD对应的硬盘,没有发现错误。其中OSD.6一直处于down是 leveldb损坏 ,这个Sage说是目前基本无力回天,只能重建。
实际通过调整OSD的reweight后能够正常同步数据来看,OSD所在硬盘应该是没问题的。
通过atop发现node-65的sda一直处于 busy 状态,而此时sda仅仅是作为操作系统,因此使用smartctl查看sda的信息,找到了如下输出信息:
1 | smartctl -a /dev/sda |
根据CephNote的博客intel-520-ssd-journal知道这个值表示的是SSD的寿命,输出表示当前SSD可用寿命为1%。
3.6.SSD寿命将尽的表现
对于smartctl的值还是有所怀疑,于是在sda上运行fio测试,结果如下:
1 | root@node-65:~# fio -direct=1 -bs=4k -ramp_time=40 -runtime=100 |
看到这里的bw、iops和延时应该很清晰了,当然为了保险起见,我在其他节点运行类型测试,iops可以达到14223,也就是说SSD寿命在1%的时候跟普通SATA硬盘相当,而这样的性能对于既做操作系统又做6个OSD的日志来说负载肯定是相当大的。
3.7.替换sda
现在问题已经很清晰了,解决方案也是唯一的:替换sda。这里的操作是使用一个新的SSD,利用dd将数据拷贝到这个新的SSD中,再直接插入node-65原来sda的位置即可。