这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下
rbd类型 | rbd rm 方法 | rados -p rm方法 |
---|---|---|
未填充很多 | 慢 | 快 |
已填充很多 | 快 | 慢 |
在rbd进行删除的时候,即使内部没有对象数据,也一样需要一个个对象去发请求,即使对象不存在,这个可以开日志看到
在/etc/ceph/ceph.conf中添加
[client]
debug_ms=1log_file=/var/log/ceph/rados.log
然后执行操作后,去分析每秒钟的操作数目即可,类似下面的这个,也可以用日志系统进行分析,这里不赘述
cat /var/log/ceph/rados.log|grep delete|grep -v ">"|grep 13:29:46|wc -l
原始的快速删除方法
rados -p rbd ls | grep '^rbd_data.25ae86b8b4567' | xargs -n 200 rados -p rbd rm
这个比上面那种方法好的是:
首先获取一个需要快速删除的rbd的列表 获取prifix
[root@lab8106 put]# rbd info testrbd|grep prefix
block_name_prefix: rbd_data.32c0f6b8b4567
获取列表
[root@lab8106 put]# rados -p rbd ls |grep rbd_data.32c0f6b8b4567 > delobject
这里可以看下内容有没有问题,检查确认下
删除的fastremove.sh脚本如下:
#!/bin/bash#####configprocess=5objectlistfile="./delobject"deletepool=rbd#####
delete_fun()
{
date "+%Y-%m-%d %H:%M:%S"
rados -p $deletepool rm $1
#sleep 1
} concurrent()
{
start=$1 && end=$2 && cur_num=$3
mkfifo ./fifo.$$ && exec 4<> ./fifo.$$ && rm -f ./fifo.$$ for ((i=$start; i<$cur_num+$start; i++)); do
echo "init start delete process $i" >&4
done
for((i=$start; i<=$end; i++)); do
read -u 4
{ echo -e "-- current delete: [:delete $i/$objectnum $REPLY]"
delob=`sed -n "${i}p" $objectlistfile`
delete_fun $delob
echo "delete $delob done" 1>&4 # write to $ff_file
} & done
wait
}
objectnum=`cat $objectlistfile|wc -l`
concurrent 1 $objectnum $process
上面直接把配置写到脚本里面了,根据需要进行修改
脚本见原文链接
指定并发数目,指定准备删除的对象的list文件,指定对象所在的存储池
然后执行即可
准备对象数据
rbd map testrbd
dd if=/dev/zero of=/dev/rbd2 bs=4M count=1200
获取列表
[root@lab8106 put]# rados -p rbd ls |grep rbd_data.32c0f6b8b4567 > delobject
执行删除脚本
[root@lab8106 put]# sh fastremove.sh
测试结果如下:
并发数 | 删除时间 |
---|---|
1 | 71s |
2 | 35s |
5 | 5s |
25 | 6s |
50 | 5s |
100 | 5s |
从测试结果来看在并发数为5的时候就能达到每秒删除200个对象了,根据自己的需要进行增减,也可以增减删除的间隔加上sleep
在ceph里面一些系统的操作默认是单进程去处理的,一般情况下都没什么问题,在数据量超大,追求效率的时候,我们可以通过加上一些并发加速这个过程,本篇脚本当中的并发同样适用于其他需要并发的场景