美文网首页ceph总结Ceph
集群osd full错误处理

集群osd full错误处理

作者: ypdai | 来源:发表于2018-07-27 16:34 被阅读104次

title: 集群osd full错误处理

前言

之前也处理过集群出现osd full时的问题,但是没有整理出来,今天又处理了这种问题,所以就整理记录下来。

环境准备

首先准备一个正常的集群。

[root@ceph01 ~]# ceph -s
    cluster caf6dbda-86e7-4c4c-b8f7-a9a12d0a39b0
     health HEALTH_OK
     monmap e5: 1 mons at {ceph01=192.168.10.20:6789/0}
            election epoch 15, quorum 0 ceph01
      fsmap e12: 1/1/1 up {0=ceph01=up:active}
     osdmap e262: 6 osds: 6 up, 6 in
            flags sortbitwise,require_jewel_osds
      pgmap v57886: 344 pgs, 14 pools, 11636 MB data, 3115 objects
            23548 MB used, 68545 MB / 92093 MB avail
                 344 active+clean

开始实验

为了方便测试,首先将集群的nearfull和full设置低一些,这样就可以少写入点测试数据,使集群快速的能达到full的状态。

[root@ceph01 ~]# ceph pg set_nearfull_ratio 0.2
[root@ceph01 ~]# ceph pg set_full_ratio 0.3

这里将osd的nearfull设置为0.2,full设置为0.3。

开始往集群写入测试数据

[root@ceph01 ~]# bench -p rbd 1000 write --no-cleanup

写入过程中,另开一个窗口,观察集群状态

[root@ceph01 ~]# ceph -s
    cluster caf6dbda-86e7-4c4c-b8f7-a9a12d0a39b0
         health HEALTH_WARN
                1 near full osd(s)
         monmap e5: 1 mons at {ceph01=192.168.10.20:6789/0}
                election epoch 15, quorum 0 ceph01
          fsmap e12: 1/1/1 up {0=ceph01=up:active}
         osdmap e227: 6 osds: 6 up, 6 in
                flags nearfull,sortbitwise,require_jewel_osds
          pgmap v56958: 344 pgs, 14 pools, 7332 MB data, 2039 objects
                15512 MB used, 76581 MB / 92093 MB avail
                     344 active+clean
      client io 42989 kB/s wr, 0 op/s rd, 10 op/s wr

可以看到,写入一段时间之后,集群出现near full告警,但是客户端可以继续写入,继续观察集群状态

[root@ceph01 ~]# ceph -s
    cluster caf6dbda-86e7-4c4c-b8f7-a9a12d0a39b0
     health HEALTH_ERR
            6 full osd(s)
            full flag(s) set
     monmap e5: 1 mons at {ceph01=192.168.10.20:6789/0}
            election epoch 15, quorum 0 ceph01
      fsmap e12: 1/1/1 up {0=ceph01=up:active}
     osdmap e225: 6 osds: 6 up, 6 in
            flags full,sortbitwise,require_jewel_osds
      pgmap v56765: 344 pgs, 14 pools, 21672 MB data, 5626 objects
            43616 MB used, 48477 MB / 92093 MB avail
                 344 active+clean

可以看到集群状态变成err了,提示6 full osd(s),此时rados bench写入被挂起

2018-07-27 14:15:29.408205 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acae1900 tid 0
2018-07-27 14:15:29.468281 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acb084a0 tid 0
  309      16      2056      2040   25.3392         3     6.43313     2.48428
2018-07-27 14:15:29.945256 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaf3880 tid 0
2018-07-27 14:15:29.946301 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaf20a0 tid 0
2018-07-27 14:15:29.946332 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaefa30 tid 0
2018-07-27 14:15:30.033664 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaea8e0 tid 0
2018-07-27 14:15:30.037818 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaf0620 tid 0
  310      16      2061      2045   25.3226        20     6.73312     2.49643
2018-07-27 14:15:31.248976 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acb00240 tid 0
2018-07-27 14:15:31.396116 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acae6410 tid 0
  311      16      2063      2047   25.2691         8     8.38232     2.50219
2018-07-27 14:15:31.718398 7f257d824a40  0 client.78915.objecter  FULL, paused modify 0x55a5acaf14b0 tid 0
  312      16      2064      2048   25.2036         4     9.97337     2.50583

我们来看下详细的错误信息

[root@ceph01 ~]# ceph health detail
HEALTH_ERR 1 full osd(s); 5 near full osd(s); full flag(s) set
osd.2 is full at 30%
osd.0 is near full at 23%
osd.1 is near full at 22%
osd.3 is near full at 21%
osd.4 is near full at 25%
osd.5 is near full at 28%
full flag(s) set

可以看到osd.2的使用量达到了30%(我们设置的full ratio就是0.3),此时集群状态err,客户端不能读写了。

使用rados rm来删除对象也不行,会报错

[root@ceph01 ~]# rados -p rbd rm benchmark_data_ceph01_112826_object350
2018-07-27 14:20:07.302692 7f6fb3e3aa40  0 client.79057.objecter  FULL, paused modify 0x5621bfa279d0 tid 0

这里可以理解为,集群出现full告警之后,客户端不能读写集群数据了。

处理

方式一

此方式的思路就是,先让集群能够读写,然后再删除集群数据,使其使用量降低

[root@ceph01 ~]# ceph pg set_nearfull_ratio 0.85
[root@ceph01 ~]# ceph pg set_full_ratio 0.95

集群恢复到可读写的状态,然后删除数据

我这里是使用rados bench写入数据的,可以直接使用rados rm删除对应的对象,其他客户端写入时,使用对应的方法删除即可

[root@ceph01 ~]# rados -p rbd ls|grep ^bench|xargs -i rados -p rbd rm {}

方式二

通过查看集群详细错误信息可以知道具体哪个osd盘满了,然后可以通过释放磁盘空间来恢复集群

[root@ceph01 ~]# tune2fs -m 1 /dev/sdc1

关于该命令可以去详细了解下有兴趣的

方式三

预先在osd的数据目录下放置一个20G左右的文件,如果万一出现osd盘满的情况,通过rm这个文件来释放空间。

总结

集群某个osd盘使用量达到集群的full ratio时集群将不可读写。

想办法让集群恢复到可读写状态,然后来删除一些数据,从而释放集群空间。恢复的方式:

  • 调高full ratio
  • 通过tune2fs命令释放磁盘空间
  • 删除数据目录无用文件

为了防止出现集群被写满,要有完善的集群监控机制,在集群快写满时,能及时地处理。

相关文章

网友评论

    本文标题:集群osd full错误处理

    本文链接:https://www.haomeiwen.com/subject/lnsgmftx.html