总结:
   
    
     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
    
   
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
   
 
