总结:
1、所有整个集群都是full状态,需要添加新osd或删除不必要内容
2、部分osd处于full状态,首先通过调节near full值,使osd能够读写。再调节osd的weight权重,使其能够把数据写到空间较大的osd
0.说明
个人经验总结,有不当的地方欢迎指正。
1.问题
昨晚在测试环境新建了7个rbd,然后在不同节点上向这些rbd执行fio,对rbd进行初始化。今早来发现fio没有按时完成,没有输出信息,一看集群状态如下:root@console:~/CeTune/benchmarking# ceph health detail
HEALTH_ERR 1 full osd(s); 3 near full osd(s)
osd.4 is full at 95%
osd.0 is near full at 87%
osd.2 is near full at 90%
osd.3 is near full at 90%
这个对于见过场面的我来说不是什么大事(PS:其实主要因为是测试环境),于是乎习惯性翻笔记,但是发现以前的操作处理记录没了,于是乎今天记录一下今天的解决步骤。
2.解决
2.0.根本之道
集群满了,说明空间不够用,因此添加OSD才是最终的出路,但是一旦集群有OSD达到full的级别,及时添加OSD,集群也不会进行数据平衡操作,因此先要能让集群动起来在根据实际情况选择添加OSD还是删除数据。
2.1.调整OSD的full比例
执行下面的命令调整OSD的full和nearfull的比例:ceph tell osd.* injectargs '--mon-osd-full-ratio 98'
ceph tell osd.* injectargs '--mon-osd-full-ratio 0.98'
上面两个是最容易想到的,但是实际上调整这两个后并不能很好的解决我的这个问题,这个时候及时选择删除rbd以腾出空间依然弹出错误如下:root@console:~/cluster# rbd rm volume-b0d3175b-7e74-4f71-aae5-39a53eda11ad
2016-04-08 08:56:27.911165 7f4cee0da7c0 0 client.104114.objecter FULL, paused modify 0x1cc3a60 tid 2
在回看我的场景,基本是所有的OSD的数据都满了,也就是说整个集群(包括pg和OSD)都是full的状态,因此还需要设置一个pg的full比例:ceph pg set_full_ratio 0.98
此时再次执行删除rbd操作就会开始工作了,删除可能会比较慢
PS:不推荐的删除方式,先解挂所有rbd,再删除所有rbd,最后直接删除OSD数据目录下current目录下的所有文件。即使是这样,由于我的集群整个满了,删除都消耗了十几分钟。
3.扩展
对于只有部分OSD用量满的情况跟前面的处理方式有很大不同。当然,让集群能够动起来是最开始要做的事 ,这里的情况跟前面第二节介绍的方法还是要所有区别,尤其是对于线上环境,因为一旦调整这个全局的比例,可能整个集群的数据都会动起来,可能会有更多的数据迁移。因此另一种解决方法是临时调整、单个调整。但是,但是,但是,最最重要也是最先要解决的就是找到为什么只有少数OSD空间用量会满。
3.1.数据分布不均匀的原因
3.1.1.crushmap问题
出现这种问题的原因可能是你手动修改过crushmap,将某些OSD划到了单独的组;或者是数据分布规则设定有误等。这种情况就只能自己到处crushmap分析一下了。不好举例,有问题的欢迎沟通。
3.1.2.pg数设置不合理
这个是目前我遇到的最主要的一种坑。ceph的数据存储结构应该都很容易查到。就是 file->object->pg->OSD->physics disk 。因此,一旦这里的pg数设置过小,pg到OSD的映射不均匀就会造成OSD上分配到的数据不均匀。这种额解决方法就是重新调整 pg_num 和 pgp_num 。有关调整这部分的工作和注意事项等见我的另一篇博文:调整pg数量的步骤
有一个python程序可以看各个pool在各个OSD上的pg分布,由此可以判断一下pg是否分布均匀。进而使用上面的方法调整该pool的pg_num和pgp_num。脚本点击这里
3.2.调整OSD的weight
对于只是少数OSD容量满的情况下,不管是上一小节中的调整crushmap还是pg_num的方法解决,最首先也还是需要集群能够进行正常读写操作,因此可以设置单个OSD的full和nearfull比例,也可以使用调整weight的方法。
关于一个OSD的weght,一共有两种:
- 一种就是在crush自动设置的weight,这个值是根据OSD所在硬盘空间大小算出来的,1T的硬盘可用空间,这个值为1.
- 另一种就是人为添加的用以表示数据分布权重值的 reweight,这个值介于0-1之间,越小表示分布权重越低。
两种weoght都可以在命令ceph osd ree
中看到,如下:root@node1:~# ceph osd tree
id weight type name up/down reweight
-1 13.65 root default
-2 2.73 host node1
0 2.73 osd.0 up 1
-3 2.73 host node2
1 2.73 osd.1 up 1
-4 2.73 host node3
2 2.73 osd.2 up 1
-5 2.73 host node4
3 2.73 osd.3 up 1
-6 2.73 host node5
4 2.73 osd.4 up 1
从上面的额输出来看,第二列的weight就是crush根据硬盘可用容量计算出来的,最后一列的reweight就是这个OSD的数据分布权重。这里我们应对某一个OSD满的另一种方法就是调整reweight,以降低数据在该OSD上的分布,调整的效果可以看看这个博文,此文ceph中国论坛有翻译稿
ceph提供有自动调节reweight的工具:ceph osd reweight-by-utilization
$ ceph osd crush reweight osd.7 2.6
reweighted item id 7 name 'osd.7' to 2.6 in crush map