前言
这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下
rbd类型 |
rbd rm 方法 |
rados -p rm方法 |
未填充很多 |
慢 |
快 |
已填充很多 |
快 |
慢 |
在rbd进行删除的时候,即使内部没有对象数据,也一样需要一个个对象去发请求,即使对象不存在,这个可以开日志看到
实验过程
开启日志的方法
在/etc/ceph/ceph.conf中添加
1 2 3
| [client] debug_ms=1 log_file=/var/log/ceph/rados.log
|
这个默认也会在执行命令的时候打印到前台,所以处理下比较好,最简单的办法就是做alias
添加下面内容到 /etc/bashrc
1 2
| alias ceph='ceph --debug-ms=0' alias rados='rados --debug-ms=0'
|
然后命令行执行
在做操作的时候就只会记录日志,前台不会打印调试信息了,但是这个会影响到ceph daemon的命令,这个可以用这种方式在线屏蔽即可
然后执行操作后,去分析每秒钟的操作数目即可,类似下面的这个,也可以用日志系统进行分析,这里不赘述
1
| cat /var/log/ceph/rados.log|grep delete|grep -v ">"|grep 13:29:46|wc -l
|
原始的快速删除方法
1
| rados -p rbd ls | grep '^rbd_data.25ae86b8b4567' | xargs -n 200 rados -p rbd rm
|
开启多进程删除的方法
这个比上面那种方法好的是:
- 可以显示当前删除的进度
- 可以指定删除的进程并发数
- 可以显示当时正在删除的对象
- 可以增加一个中断时间降低负载
首先获取一个需要快速删除的rbd的列表
获取prifix
1 2
| [root@lab8106 put] block_name_prefix: rbd_data.32c0f6b8b4567
|
获取列表
这里可以看下内容有没有问题,检查确认下
删除的fastremove.sh脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash
process=5 objectlistfile="./delobject" deletepool=rbd
delete_fun() { date "+%Y-%m-%d %H:%M:%S" rados -p $deletepool rm $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 } & done wait }
objectnum=`cat $objectlistfile|wc -l` concurrent 1 $objectnum $process
|
上面直接把配置写到脚本里面了,根据需要进行修改
1 2 3 4 5
| process=10 objectlistfile="./delobject" deletepool=rbd
|
指定并发数目,指定准备删除的对象的list文件,指定对象所在的存储池
然后执行即可
本次测试删除的性能差别
准备对象数据
1 2
| rbd map testrbd dd if=/dev/zero of=/dev/rbd2 bs=4M count=1200
|
获取列表
执行删除脚本
测试结果如下:
并发数 |
删除时间 |
1 |
71s |
2 |
35s |
5 |
5s |
25 |
6s |
50 |
5s |
100 |
5s |
从测试结果来看在并发数为5的时候就能达到每秒删除200个对象了,根据自己的需要进行增减,也可以增减删除的间隔加上sleep
删除rbd的元数据信息
因为只删除了对象没删除元数据信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [root@lab101 ceph] id_519216b8b4567 value (6 bytes) : 00000000 02 00 00 00 7a 70 |....zp| 00000006
name_zp value (17 bytes) : 00000000 0d 00 00 00 35 31 39 32 31 36 62 38 62 34 35 36 |....519216b8b456| 00000010 37 |7| 00000011
[root@lab101 ceph] [root@lab101 ceph] name_zp value (17 bytes) : 00000000 0d 00 00 00 35 31 39 32 31 36 62 38 62 34 35 36 |....519216b8b456| 00000010 37 |7| 00000011
[root@lab101 ceph]
|
这样就把名称为zp的rbd删除了
总结
在ceph里面一些系统的操作默认是单进程去处理的,一般情况下都没什么问题,在数据量超大,追求效率的时候,我们可以通过加上一些并发加速这个过程,本篇脚本当中的并发同样适用于其他需要并发的场景
变更记录
Why |
Who |
When |
创建 |
武汉-运维-磨渣 |
2017-07-27 |
增加前台调试信息的屏蔽 |
武汉-运维-磨渣 |
2017-07-28 |
更新元数据的清理 |
武汉-运维-磨渣 |
2018-04-12 |