OSD full/nearfull 的解决办法

总结:

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

 

出处:http://bbs.ceph.org.cn/question/363

http://bbs.ceph.org.cn/article/38

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值