使用python删除遇到的一些问题
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
有段时间没更新了,一方面也是懒了,另一方面,松鼠哥近期忙着筹备视频课程和新书。
视频课程是此前一位读者朋友建议的,当下ceph方面讲得好的视频课程基本没有,其建议松鼠哥出一些相关课程,计划是出一期入门课程,再出一期运维开发进阶,目前入门课程大纲和讲稿都基本准备完了,进入录制阶段,后续发布后,还望同学们多多支持,进阶的课程还未完成大纲,有学习意向的同学也欢迎私信给松鼠哥建议和意见。
新书说来惭愧,一直难产,去年写到现在也只完成了一半,出书的初衷是目前市面上好的ceph入门书籍缺乏,松鼠哥希望出一本能真正帮助到新手朋友的书,所以花了很多精力打磨,后续出版后,也希望同学们多多支持。
本篇的问题可以说很棘手,搞了好多天
问题排查
测试集群总容量31PiB,为了进行全面的性能和压力测试,松鼠哥使用程序进行了连续的写入,大概1周后,集群写满了,确认性能和压力后,开始了数据删除。
如此大规模的集群进行数据删除不是件容易的事,为了在删除的时候也能实现线上业务的模拟,松鼠哥使用了比较大压力的python-boto删除程序,来进行快速的数据删除,大致的删除逻辑是这样的
1 | class GetshardProc(Process): |
使用该程序删除bucket,每个bucket的删除速度大概1500 keys/s -2000 keys/s这样。
在删除进行了数日后,不出意外地还是有意外了,某天松鼠哥发现bucket的对象数量不下降了,但是删除程序没有退出。
调查了一番,发现是bucket的shard在index中都消失了。。。经过反复检查,没有发现python程序会导致shard丢失=.=
这就导致程序无法正常获取到key了,异常了。
这种情况下,radosgw-admin bucket list
是可以看到目标bucket,但是用radosgw-admin bucket limit check
则看不到,用boto通过s3来访问直接404。。。
在无法获取到bucket的key的情况下要删除这个bucket,就有点难搞了,由于shard存放的是bucket的key,不能对该bucket设置LC也不能通过S3删除,在不重建pool的情况下,只能从rados删除。
python-librados
在已知bucket id的情况下,要从rados的pool中删除bucket key是不难的,官方也有给出librados的多种语言的版本,可以通过调用librados的接口进行对应的key的删除,官方的例子是这样的
1 | import rados, sys |
稍微改造一下就变成了这样
1 | class DeleteThread(Thread): |
通过进程间队列得到key,然后调用libradaos去删除,该删除在线程中,所以可以通过控制线程数来控制删除速度,当然,在此之前,需要使用rados -p POOLNAME ls|grep BUCKETID
来获取到该bucket的所有key在rados中的名字,这个过程非常艰难,因为rados中的对象数量实在是太多了,达到了16亿+,导出来key都花了1个多小时。。
经过测试,该程序删除是没问题,但是速度太慢了~经过观察,只有100 keys/s ~200 keys/s,上亿的对象要用此方法删除的,得删到猴年马月。。。
最后实在没办法,把pool重建了=.=
总结
使用python-librados删除rados对象速度真的很慢,原因未知。
测试时将集群打满,是比较常见的场景,但是shard丢失导致bucket的key不可获取,是第一次见,这种情况下,无法使用s3进行删除,操作性就低很多了,本篇尝试用librados删除失败了,重建池解决,后续将探索使用c++的librados接口试试。
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2023/12/05/python-librados删除对象记录/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!