问题现象

执行ceph -s时会出现如下内容的报错:

  1. $ ceph -s
  2. health HEALTH_WARN 2 pgs backfill_toofull; 2 pgs stuck unclean; recovery 20681/5338044 objects degraded (0.387%); 6 near full osd(s)
  3. monmap e7: 3 mons at {server-61.0.lg.ustack.in=10.1.0.61:6789/0,server-62.0.lg.ustack.in=10.1.0.62:6789/0,server-63.0.lg.ustack.in=10.1.0.63:6789/0}, election epoch 2050, quorum 0,1,2 server-61.0.lg.ustack.in,server-62.0.lg.ustack.in,server-63.0.lg.ustack.in
  4. osdmap e193002: 216 osds: 216 up, 216 in
  5. pgmap v53275710: 12288 pgs, 2 pools, 23456 GB data, 1737 kobjects
  6. 72246 GB used, 251 TB / 321 TB avail
  7. 20681/5338044 objects degraded (0.387%)
  8. 12286 active+clean
  9. 2 active+remapped+backfill_toofull
  10. client io 35704 kB/s rd, 63861 kB/s wr, 9060 op/s

原因分析

Ceph有磁盘保护机制,当磁盘使用率超过 osd_backfill_full_ratio = 0.85 的设置,0.85这个是集群默认的配置。以osd.1为例,可以通过以下命令对这个值进行查询:

  1. $ ceph daemon osd.1 config show | grep osd_backfill_full_ratio
  2. "osd_backfill_full_ratio": "0.85",

场景一 当前集群的OSD使用率比较高,有其中一个OSD对应的磁盘出现故障,这时集群会自动进行数据平衡,把数据平衡到其他的OSD,此时如果使用率达>到0.85,那么数据就不会backfill到对应的OSD

场景二 当前集群的OSD使用率比较高,此时增加了新的OSD,而仍有新的数据写入,此时集群在进行数据平衡时也是有可能部分OSD的使用率超过0.85

场景三 当前集群的OSD使用率比较高,没有磁盘故障和新加磁盘的操作,新的数据写入后,集群OSD的使用率超过0.85

处理过程

当集群出现backfill_toofull时有可能是数据平衡导致部分OSD的使用率临时比较高,建议通过 ceph -s 命令先观察一段时间,看看是否有PG还在进行backfill的操作。如果有这种状态,建议观察一段时间,看看是否能够恢复正常。如果过了一段时间之后集群状态静止,没有再进行backfill的操作,对应的状态可以参考故障描述中提供的状态信息,到了不调整 osd_backfill_full_ratio 就过不去的时候,可以参考以下方案先临时调高 osd_backfill_full_ratio 的值再对集群状态进行观察。不过在调整时,建议这个值不要一下调整的太高,建议一点点的往上调,同时调整的上限不要超过0.9,否则是有可能对集群造成不可预料的影响的。

找出PG对应的UP set和acting set,然后确认这些OSD的磁盘利用率是否已经超过 osd_backfill_full_ratio 的设置。

  1. $ ceph pg dump|grep "active+remapped+backfill_toofull"

找到对应的OSD之后使用以下命令,调高一些

  1. $ ceph tell osd.155 injectargs '--osd_backfill_full_ratio 0.87'

如果拿不准需要调高哪些OSD,也可以临时调高所有的OSD

  1. $ ceph tell osd.* injectargs '--osd_backfill_full_ratio 0.87'

等到PG recovery完成之后,重新将其调整过来

  1. $ ceph tell osd.* injectargs '--osd_backfill_full_ratio 0.85'

出现backfill_toofull意味着OSD的使用率比较高,建议如果此时集群整体的OSD使用率比较高的话,可以考虑对集群进行一下扩容。

结果验证

通过ceph -sceph health detail确认集群状态为HEALTH_OK