暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

删除超大bucket的一种思路

奋斗的cepher 2020-10-10
2386

写在前面

最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-

问题的提出

本篇要分享的是删除超大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的对象数

[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects'
"num_objects": 475498655

接近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来找到

[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id'
"id": "e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11",
[twj@ENV-MON ~]$ sudo rados -p moumouzone.rgw.buckets.index ls |grep 'e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11' > target-bucket.index.objs
[twj@ENV-MON ~]$ wc -l target-bucket.index.objs
1297 target-bucket.index.objs

1297个对象,跟shard数量对得上,可以开始删除了

[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繁忙起来

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
3.11 0.00 1.05 7.91 0.00 87.93

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 0.00 5891.00 54.00 47524.00 23584.00 23.92 0.87 0.15 0.15 0.17 0.14 85.30
sde 0.00 0.00 10441.00 101.00 125804.00 40992.00 31.64 0.84 0.08 0.08 0.23 0.07 70.40
sdd 0.00 0.00 15868.00 147.00 125784.00 62668.00 23.53 0.77 0.05 0.05 0.31 0.05 72.10
sdf 0.00 0.00 6336.00 140.00 192396.00 48820.00 74.50 1.33 0.21 0.20 0.25 0.13 81.40
sdg 0.00 0.00 16027.00 150.00 126920.00 63196.00 23.50 0.79 0.05 0.05 0.31 0.05 74.60
sdc 0.00 0.00 12653.00 69.00 193728.00 29736.00 35.13 1.25 0.10 0.10 0.36 0.07 89.60
sda 0.00 0.00 0.00 29.00 0.00 1668.00 115.03 0.00 0.00 0.00 0.00 0.00 0.00

长达40分钟左右的删除操作退出后,集群告警的large omap objects
数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects
都消失后,index osd的空间也回收完成了

bucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错

[twj@ENV-MON ~]$ sudo radosgw-admin bucket list
[
"cosbench-test-pool31",
"cosbench-test-pool21",
"cosbench-test-pool11",
"target-bucket"
]
[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket
error getting bucket stats ret=-2
failure: (2) No such file or directory:
[twj@ENV-MON ~]$ sudo radosgw-admin bucket rm --bucket=target-bucket
2020-10-10 15:52:07.178 7fc385dfa840 -1 ERROR: unable to remove bucket(2) No such file or directory
[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket
[
"cosbench-test-pool31",
"cosbench-test-pool21",
"cosbench-test-pool11",
"target-bucket"
]

我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket

[twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket
[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket
[
"cosbench-test-pool31",
"cosbench-test-pool21",
"cosbench-test-pool11"
]

这样,就完成了这个超大bucket的删除,清清爽爽~

总结

实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考


文章转载自奋斗的cepher,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论