实际生产使用的经验
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
有段时间没有更新了,忙是一方面,最近大盘极差导致我心情也受到影响,唉,算了,如果明天冲高,割肉离场!
继续插播招聘广告:我们这边是天翼云科技,在广州猎德大桥旁边广报中心办公,目前我们在大量招聘存储方面的人才(其他方向的人才也要的),有意向过来的朋友可以私聊、发简历,已经有一些读者朋友私聊过简历并通过了面试,所以大家不要犹豫了,有意向的快快联系~
那么赶紧开始今天的干货之旅
问题的提出
很多时候,我们的环境会写入大量的对象存储数据,一个bucket数亿对象非常常见,线上的集群单bucket数十亿的对象也屡见不鲜,而我们时不时会有这样的需求,就是帮助客户清理过期、废弃的数据,单个bucket亿级别的对象数删除起来还是要费点时间,本篇便是介绍在这样的背景下进行大规模数据删除的思路
此前的文章有提到,删除海量对象,最快的办法就是重建pool,但是大多数情况下pool都是不能重建的,因为单个pool可能是被多个bucket共享了,在不能重建pool的情况下,快速删除海量数据的手段通常有哪些呢?
在思路上,删除对象存储数据首先要获取到bucket里面的要删除的key,对于小数据量的bucket,直接用s3的接口做list即可,但是对于上亿数据的bucket,这样做就显得太挫,机器累死了也没删完。
快速得到key
早期,为了得到整个bucket的key,一般的方法是使用radosgw-admin的bi list来做的
1 | [root@node-01 ~]# radosgw-admin bi list --bucket=python-2022-04-26-10|more |
bi list可以列出bucket中所有的key的详细信息,这其中就包含了key的名字,通过诸如awk或者sed进行加工,可以得到整个bucket的key信息
但是目前这种方法已经被我淘汰了,主要是因为速度太慢,用这种方法得到一个20亿对象的bucket的全部key,所花费的时间为
1 | 开始时间 16:37:05 |
一个半小时实在是太慢了,不行不行,火云邪神曾说,天下集群,无坚不破,唯快不破–我们就是要快!
于是推荐下面这种方法,目前最快的办法,使用多进程的方式,直接从bucket的shard里面取,rados直接提供了这个命令
1 | /usr/bin/rados -p default.rgw.buckets.index listomapkeys .dir.xxx.1 > /tmp/shard.1 |
在使用16个进程的情况下,这种方法,同样是取20亿对象的bucket的key,仅需时间为
1 | 开始时间 16:30:32 |
快了近23倍!这才是我要的速度。
删除
得到了所有的key,接下来我们要进行删除。思路上,删除我们主要有两个方向:
1、使用s3接口删除,用的是s3的api
这种方法比较主流,以我个人最常用的python boto为例
1 |
|
配合多进程和多线程,将key以共享队列的方式打包传过去删,实测一般情况下每秒4、5千个key的速度,还可以
当然,用c++或者java等接口也可以,不过删除速度主要跟集群性能有关,客户端其实用什么语言做差别不是很大
2、从rados直接删除,用的是librados
这种路子比较野,目前我们用librados主要是用来删除rbd的残留数据,有时候rbd rm删掉之后,因为某些原因一些rbd_data的块没删掉,就要用librados的接口来删
1 |
|
同样,结合python多进程和多线程,通过共享队列发送key给各个工作线程,进行删除,不过在实际测试中我们发现,这种方法删除速度不是很快,不知道是什么原因。。。-.-
另外,用librados的方式删除对象存储数据,要考虑的东西比较多,multipart、超过4M的分块等,都是比较麻烦的事情,而且元数据还要再搞,说实话是有点鸡肋
3、骚操作
这就是一种涉及专利的方法了,因为专利目前还在申请中,所以具体操作迟点再说吧。。
这种方法比仅比删除重建pool慢一些,是s3的数倍甚至更快
总结
很多时候,我会接到一些删除大型bucket的需求,为了更好地做好这块工作,我也一直在研究如何更快更安全地删除过亿数据的bucket,目前的各个手段均不理想,我们的追求是瞬间删掉所有目标数据(对的,我就是想重建pool),后续如果有更好的方法,再写出来。希望本文提供的思路对各位读者朋友有帮助
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2022/07/06/如何删除超大的bucket/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!