在一台高性能PC服务器上,使用ceph做虚拟机镜像的存储。在做压力测试的情况下,出现了该服务器所有虚拟机不能访问的故障。
引发原因:
1.在虚拟机当中安装了一个网站服务,网站服务中使用了redis作为缓存服务器。在压力比较大的情况下(8000千次访问每秒),发生了宿主机所有的虚拟机全部不能访问的情况
2.发生故障时,部分虚拟机不能ping到,部分虚拟机是能ping到,但是不能ssh登陆
开始以为是网桥故障,KVM的virtio的网卡故障非常著名,在使用网桥的情况下,会出现内存溢出。导致网桥失效。 Xen给的解决方案是关闭网桥的tso 支持。
(运行命令ethtool --offload <network device> tso off )
但是重启网络服务后,该故障没有消失。
因此排除网桥故障。
多次重现故障之后,有一个虚拟机的ssh没有断掉,所以还能执行cd命令,但是ls命令无法执行,报告input/output error,此错误为文件系统故障的表现。
所以开始怀疑文件系统出现问题 。
此文件系统为ceph,查看ceph日志,发现在发生故障的同时,ceph报大量一下的故障日志:
2015-06-30 16:36:28.493424 osd.0 172.23123123:6800/96711 9195 : cluster [WRN] 6 slow requests, 6 included below;
oldest blocked for > 30.934796 secs
还有
2015-06-26 18:46:45.192215 osd.2 172.132131231:6800/68644 5936 : cluster [WRN] slow request 240.415451 seconds old
, received at 2015-06-26 18:42:44.776646: osd_op(13213213500 [
stat,set-alloc-hint object_size 4194304 write_size 4194304,write 2269184~524288] 0.5652b278 ack+ondisk+write+kno
wn_if_redirected e48545) currently waiting for rw locks
明显出现了死锁。
查看磁盘IO记录,发现redis服务器,在故障发生时又大量的磁盘写入操作,发现在高操作频率的情况下,会比较频繁的触发rbd的持久化,因此引起了大量磁盘io,这些磁盘IO导致了其他磁盘操作得不到足够的写入时间,引起了ceph对osd的死锁。
解决方案是关闭了redis的rbd持久化,该问题不再出现。
长久的解决办法是不让redis持久化直接往ceph上的分区上写入。还有就是不要再ceph上的虚拟机镜像进行高IO的写入或者读取(好不靠谱。。。)
经验总结:
1.Ceph在高IO下存在死锁的风险,Ceph没有提供解锁机制,官方的解决方案是不要在ceph上放虚拟机镜像。。。无语。。
2.在系统设计的时候,应该将存储网络和业务网络隔离和分开。一个系统服务,应该分为,外网,业务网,存储网,心跳网,管理网,五种网络组建形式。
--------------------------------------分割线 --------------------------------------
CentOS 6.3上部署Ceph
HOWTO Install Ceph On FC12, FC上安装Ceph分布式文件系统
Ubuntu 12.04 Ceph分布式文件系统
Fedora 14上安装 Ceph 0.24
--------------------------------------分割线 --------------------------------------