干货上线上线!
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-
问题的提出
本篇要分享的是删除超大bucket的另类操作思路,ceph version 14.2.11
我们有个测试环境,data pool的osd参数要做调整,不得已要重建某个data pool,它对应的有一个超大的bucket,其他pool不能重建,尤其是index pool,不能重建
对于单个bucket来说,存放的对象数超过1亿的话,就算是比较大的bucket了,在大规模数据场景中,过亿对象的bucket并不少见。
一般来说,生产环境中超大bucket的对象删除,是由客户端,也就是客户自己做的,主要途径有两个,一个是通过设置对象的lifecycle,让对象网关做自动的删除,另一个是客户端主动发起删除操作;而测试环境中的超大bucket,通常需要我们手工删除,那么问题来了,如何在短时间内删除超大的bucket?
对于超大的bucket的对象删除,思路有以下几种:
- 1、不赶时间,用radosgw-admin bucket rm删除,或者python的boto,bucket.list()后慢慢删除
- 2、赶时间1.0,用python boto多进程、多线程同时删除,这种思路需要事先得到object的列表,一般可以用bi list获得,进程、线程数够大的话,速度也很快
- 3、赶时间2.0,某种情况下,要非常短时间内删除bucket的数据,最快的办法就是重建所有pool(如果允许的话),这种方法最快了,脚本一跑嗖嗖嗖~
- 4、赶时间3.0,在不能重建所有pool的情况下,要用最短的时间删除bucket的object,就是本篇要介绍的方法
开始删除
查询一下需要删除的bucket的对象数
1 | [twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects' |
接近5亿,这要是用boto多进程多线程删除,得删到什么时候去。。。骚操作搞起来!
首先,重建目标data pool,这一步相对简单,osd批量destroy后,重建就可以了,这里不展开讲了
data pool 重建后,bucket实际上还在集群中,仅仅是这个bucket的object的数据部分已经不复存在了,接下来,我们要删除这个bucket的其他数据
经过测试,这种情况下使用python boto不能删除bucket的对象,rgw的返回虽然是http 204,但是op结果却是返回-2,查看到bucket的stats,对象数量没有减少,同时,使用radosgw-admin bucket rm
的方式,也不能正常删除bucket
这种情况下,只能继续强行从pool中删除数据对象,也就是直接将bucket的对应的全部元数据全部删除,然后重建这个bucket
要将bucket的index中对象的object删除,首先要取出它们的名称,根据bucket的id来找到
1 | [twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id' |
1297个对象,跟shard数量对得上,可以开始删除了
1 | [twj@ENV-MON ~]$ cat target-bucket.index.objs |xargs -i sudo rados -p moumouzone.rgw.buckets.index rm {} |
这个过程比较久,按照这个bucket接近5亿个对象的量,删除index对象花费时间大概是40分钟
删除进行时,注意到index pool所在的osd的IO繁忙起来
1 | avg-cpu: %user %nice %system %iowait %steal %idle |
长达40分钟左右的删除操作退出后,集群告警的large omap objects
数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects
都消失后,index osd的空间也回收完成了
bucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错
1 | [twj@ENV-MON ~]$ sudo radosgw-admin bucket list |
我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket
1 | [twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket |
这样,就完成了这个超大bucket的删除,清清爽爽~
总结
实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2020/10/30/删除超大bucket的一种思路/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!