zoukankan      html  css  js  c++  java
  • RBD快速删除的方法分析与改进

    前言

    这个问题在很久以前就有一篇文章进行过讨论 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
  • 相关阅读:
    c#声明数组
    【游戏物理】欧拉、龙格、韦尔莱
    当const放在function声明后
    【物理】AABB物理碰撞检测
    100 Path Sum
    Loop Unrolling 循环展开
    Unity Shader and Effects Cookbook问题记录
    【ShaderToy】画一个球体
    pymysql
    mysql表间的关系和查询
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575449.html
Copyright © 2011-2022 走看看