前言

这个问题在很久以前就有一篇文章进行过讨论 remove-big-rbd,这个文章写的比较清楚了,并且对不同的方法做了分析,这里先把结论说下

rbd类型 rbd rm 方法 rados -p rm方法
未填充很多
已填充很多

在rbd进行删除的时候,即使内部没有对象数据,也一样需要一个个对象去发请求,即使对象不存在,这个可以开日志看到

实验过程

开启日志的方法

在/etc/ceph/ceph.conf中添加

[client]
debug_ms=1
log_file=/var/log/ceph/rados.log

这个默认也会在执行命令的时候打印到前台,所以处理下比较好,最简单的办法就是做alias

添加下面内容到 /etc/bashrc

alias ceph='ceph  --debug-ms=0'
alias rados='rados --debug-ms=0'

然后命令行执行

source /etc/bashrc

在做操作的时候就只会记录日志,前台不会打印调试信息了,但是这个会影响到ceph daemon的命令,这个可以用这种方式在线屏蔽即可

ceph --debug_ms=0  -s

然后执行操作后,去分析每秒钟的操作数目即可,类似下面的这个,也可以用日志系统进行分析,这里不赘述

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

#####config
process=5
objectlistfile="./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

上面直接把配置写到脚本里面了,根据需要进行修改

#####config
process=10
objectlistfile="./delobject"
deletepool=rbd
#####

指定并发数目,指定准备删除的对象的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

删除rbd的元数据信息

因为只删除了对象没删除元数据信息

[root@lab101 ceph]# rados -p rbd listomapvals rbd_directory
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]# rados -p rbd rmomapkey rbd_directory id_519216b8b4567
[root@lab101 ceph]# rados -p rbd listomapvals rbd_directory
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]# rados -p rbd rmomapkey rbd_directory name_zp

这样就把名称为zp的rbd删除了

总结

在ceph里面一些系统的操作默认是单进程去处理的,一般情况下都没什么问题,在数据量超大,追求效率的时候,我们可以通过加上一些并发加速这个过程,本篇脚本当中的并发同样适用于其他需要并发的场景

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-07-27
增加前台调试信息的屏蔽 武汉-运维-磨渣 2017-07-28
更新元数据的清理 武汉-运维-磨渣 2018-04-12

最新文章

  1. JavaScript 事件
  2. 集群中配置多台计算机之间ssh无密码登录的一种简便方法
  3. vijos 1037 ***
  4. QTEmbedded VCN实现
  5. DIV+CSS规范命名
  6. SQL整理2
  7. 【JUnit4.10来源分析】0导航
  8. 【UVA】580-Critical Mass
  9. HDU 4052 Adding New Machine(矩形面积并)
  10. How to create a zip file in NetSuite SuiteScript 2.0 如何在现有SuiteScript中创建和下载ZIP压缩文档
  11. UVa 10132 - File Fragmentation
  12. Win7(64Bit旗舰版) 安装 PL/SQL Developer图解说明
  13. hdu 5137(2014广州—最短路)
  14. HBase replication
  15. Java数据结构之堆和优先队列
  16. leetcode — populating-next-right-pointers-in-each-node
  17. Django学习笔记之数据库-模型的操作
  18. C++重载Level蓝图
  19. 01-VMware-workstation14安装
  20. MySQL笔记(7)---事务

热门文章

  1. .NetCore 异步编程 - async/await
  2. 什么是C和C++标准——小白必看
  3. ImageMagick实现图片加水印(ImageMagick6.9.10)
  4. JavaSE学习笔记05面向对象编程01
  5. 远程Jenkins新增Mac电脑节点
  6. git -- Authentication failed for 报错如何解决?
  7. router-link 使用精确匹配
  8. altium designer使用小技巧,记录
  9. python中拿不到字典value值得问题解决
  10. linux系统软件安装及软件包管理