找回密码
 注册
查看: 1794|回复: 1

ceph 高级篇 RBD块设备回收站、快照、克隆

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-12-6 17:06:38 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 2 金钱 才能浏览

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-12-6 17:08:05 | 显示全部楼层
删除超大bucket的一种思路2021-12-130 ?/ ?: A% x) n+ X- V+ @
! q, d3 C; ^, \* G5 Y" G

( n6 Q$ Q. V; k" F写在前面
) V9 [% s) J5 \% R& j0 p" s/ N最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-
9 ~* y: m5 _* t0 B& R" K$ p4 o9 V7 Y& ?8 `& R2 T
问题的提出4 Q& R  n) j# V, X$ `* N# J. V
本篇要分享的是删除超大bucket的另类操作思路,ceph version 14.2.115 R/ R, q6 P+ {" S
" M7 G  S3 i9 d! ~" j) c
我们有个测试环境,data pool的osd参数要做调整,不得已要重建某个data pool,它对应的有一个超大的bucket,其他pool不能重建,尤其是index pool,不能重建% Q! n, o, Z/ q# y

9 U" c, Z' S. i5 Y5 i! D对于单个bucket来说,存放的对象数超过1亿的话,就算是比较大的bucket了,在大规模数据场景中,过亿对象的bucket并不少见。
/ u) ~* g' _& O+ |& G7 N; T0 d" R8 v2 N; l; x( ~/ S, r
一般来说,生产环境中超大bucket的对象删除,是由客户端,也就是客户自己做的,主要途径有两个,一个是通过设置对象的lifecycle,让对象网关做自动的删除,另一个是客户端主动发起删除操作;而测试环境中的超大bucket,通常需要我们手工删除,那么问题来了,如何在短时间内删除超大的bucket?
$ R. l8 f% r# F# b" N( }& f) _' i( S# n9 a. o; o
对于超大的bucket的对象删除,思路有以下几种:
6 C/ O' l  {4 n8 h; T8 f* _+ h% n( T0 u4 m2 T+ D
1、不赶时间,用radosgw-admin bucket rm删除,或者python的boto,bucket.list()后慢慢删除
" z- c' S5 S" v; O8 F# X2、赶时间1.0,用python boto多进程、多线程同时删除,这种思路需要事先得到object的列表,一般可以用bi list获得,进程、线程数够大的话,速度也很快
+ y3 M+ z% F; v, }3、赶时间2.0,某种情况下,要非常短时间内删除bucket的数据,最快的办法就是重建所有pool(如果允许的话),这种方法最快了,脚本一跑嗖嗖嗖~) f$ H& E& ~# X# l& {1 G7 ~1 j
4、赶时间3.0,在不能重建所有pool的情况下,要用最短的时间删除bucket的object,就是本篇要介绍的方法/ T" ~- G% v& P- o' l3 `; B0 o3 V
开始删除
8 l+ c7 Y8 ^# s+ E5 k查询一下需要删除的bucket的对象数: F& c; W; W+ I8 M, p
6 q4 @6 m! e' ^; t: j9 V- `

5 \- i) a  F) T[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects'4 V8 ]; ^# B: S, o
            "num_objects": 475498655
* O; l6 ?8 I7 q6 p) D6 M接近5亿,这要是用boto多进程多线程删除,得删到什么时候去。。。骚操作搞起来!; H8 N4 Y: I, K. F" ~* Q" Q- |: t1 h

+ X6 [0 J- f0 B5 W首先,重建目标data pool,这一步相对简单,osd批量destroy后,重建就可以了,这里不展开讲了
) Z3 c  X3 K1 W, x4 w$ a' t' X6 d( @; ~0 c+ J) D- r( {9 Y
data pool 重建后,bucket实际上还在集群中,仅仅是这个bucket的object的数据部分已经不复存在了,接下来,我们要删除这个bucket的其他数据
6 i% x5 X8 K$ M" E9 y. f- [7 k6 ?2 Y
经过测试,这种情况下使用python boto不能删除bucket的对象,rgw的返回虽然是http 204,但是op结果却是返回-2,查看到bucket的stats,对象数量没有减少,同时,使用radosgw-admin bucket rm 的方式,也不能正常删除bucket6 \1 L1 a- Y1 e0 n, h, U/ Z

, P' z  F% D% m  W这种情况下,只能继续强行从pool中删除数据对象,也就是直接将bucket的对应的全部元数据全部删除,然后重建这个bucket5 K: s% p! J/ u+ X% W! ]

/ [" w7 k& P6 X7 u+ q. [& e要将bucket的index中对象的object删除,首先要取出它们的名称,根据bucket的id来找到
& y" O  Y& r+ E3 Q$ b5 {6 w( }& B4 @" [4 S* a3 {& e5 m, a5 h

. r" e3 Z! H( N" o4 O[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id'
; X5 Z7 ~! e& v. W8 F. ?5 J    "id": "e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11",
( j: @5 i" k/ F7 r+ b+ M3 {[twj@ENV-MON ~]$ sudo rados -p  moumouzone.rgw.buckets.index ls |grep 'e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11' > target-bucket.index.objs+ t2 {% k0 }2 g
[twj@ENV-MON ~]$ wc -l target-bucket.index.objs: x. o/ a8 C5 B* I
1297 target-bucket.index.objs1 ^8 S; O0 U6 D
1297个对象,跟shard数量对得上,可以开始删除了8 r) r9 }5 P( G1 p) H2 s5 t/ T

$ j' i! Z) y* i- R- f
$ B# b: }) i6 S) D) M7 g" @2 c8 P. \4 |[twj@ENV-MON ~]$ cat target-bucket.index.objs |xargs -i sudo rados -p moumouzone.rgw.buckets.index rm {}+ Y6 a  \; k( U* ~
这个过程比较久,按照这个bucket接近5亿个对象的量,删除index对象花费时间大概是40分钟
% l2 E( {" S# x: O: h1 ^
: P3 U4 v& K+ ]6 c( `删除进行时,注意到index pool所在的osd的IO繁忙起来
+ O% `& O; U. d  T' f1 M- p/ Y- ?4 g! d

, p  b% S& d5 W" J9 S$ m) mavg-cpu:  %user   %nice %system %iowait  %steal   %idle2 V6 Y2 F' R9 W( |7 ~6 T
           3.11    0.00    1.05    7.91    0.00   87.93
/ k8 v% _$ ]% r3 r- K: N8 V6 `
# l" W6 V  m7 ?1 a& ODevice:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util/ _& H& D% S$ G/ y/ d! v$ p) r
sdb               0.00     0.00 5891.00   54.00 47524.00 23584.00    23.92     0.87    0.15    0.15    0.17   0.14  85.30' U  Z. l" j1 N6 Y$ Q7 P
sde               0.00     0.00 10441.00  101.00 125804.00 40992.00    31.64     0.84    0.08    0.08    0.23   0.07  70.40# C& @6 D5 K2 y: F" K' F& u" A' q
sdd               0.00     0.00 15868.00  147.00 125784.00 62668.00    23.53     0.77    0.05    0.05    0.31   0.05  72.10
6 |3 v2 @2 D9 k/ h* C1 L2 r# psdf               0.00     0.00 6336.00  140.00 192396.00 48820.00    74.50     1.33    0.21    0.20    0.25   0.13  81.40( m0 U6 z0 a6 V) O, @
sdg               0.00     0.00 16027.00  150.00 126920.00 63196.00    23.50     0.79    0.05    0.05    0.31   0.05  74.60
8 g( b' e* H4 Q5 S' wsdc               0.00     0.00 12653.00   69.00 193728.00 29736.00    35.13     1.25    0.10    0.10    0.36   0.07  89.60+ _# F0 J; @- ^6 Z! F+ X0 U- w' K
sda               0.00     0.00    0.00   29.00     0.00  1668.00   115.03     0.00    0.00    0.00    0.00   0.00   0.00! {8 K; E9 }, q2 |- G0 C
长达40分钟左右的删除操作退出后,集群告警的large omap objects数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects都消失后,index osd的空间也回收完成了
: R4 a; F2 P. B7 A) U
( S$ F% n7 Z6 D2 z5 |9 Obucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错, M# E# o6 K3 h$ j/ {
9 }% ~' g7 s$ z# |( ?* ?

& t$ ~/ W( b. s- _5 v[twj@ENV-MON ~]$ sudo radosgw-admin bucket list
6 d6 v3 K6 b+ V1 m) x% X[' F6 b" a8 t8 }2 G9 d- X
    "cosbench-test-pool31",
3 b" ?6 J" H5 _8 o    "cosbench-test-pool21",
4 A0 _; e; z$ m# l# X0 C$ _6 ?$ m) h    "cosbench-test-pool11",
& Y2 O: [, i7 W# {5 r" t    "target-bucket"
  p% z4 W, t: j. e) o$ ~]) [0 A& E5 L: U/ f& l
[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket6 K2 Z& B: F, S  }& M" Z
error getting bucket stats ret=-2  c( E6 L# p$ K. l
failure: (2) No such file or directory:; T  M+ Z3 N4 n. x2 D3 Y
[twj@ENV-MON ~]$ sudo radosgw-admin bucket rm --bucket=target-bucket
/ R5 a, e" d1 M/ o! Z* Q, w5 a2020-10-10 15:52:07.178 7fc385dfa840 -1 ERROR: unable to remove bucket(2) No such file or directory/ q! Q! d8 N2 _% N  Y
[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket; c# I5 V% U: M
[
# X; F% Y( b# P- y4 W, P* G    "cosbench-test-pool31"," ]8 c; i% |6 ~% a
    "cosbench-test-pool21",
; b! N: F  W. F    "cosbench-test-pool11",7 u* V$ A5 e! ^
    "target-bucket"
# Z) t6 z* K& b- U1 [0 a]
6 s, z6 u8 f. A0 \- Q- j我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket
+ T( p; M3 U) a
" v$ B6 k; l% l& i. \
; Z2 _. l% K9 w  T& q. Z: c[twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket
0 Q* K2 V* L3 C9 |) v[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket
+ c# F( V$ D0 T6 v4 K" b[9 V% W/ h$ s9 u, y/ i# \7 \
    "cosbench-test-pool31",
$ F, U( t% ]$ L, H1 L( P8 ~" t    "cosbench-test-pool21",
5 ^+ i0 `" Q. L    "cosbench-test-pool11"& n4 F! q- ]5 t4 N' e- E7 Z4 \
]1 J  p. k1 L2 D2 K1 g. t
这样,就完成了这个超大bucket的删除,清清爽爽~
: e$ l  V% o, X( {# {8 Z: p( f; c; A
总结
  G* G7 ~( C9 o* o2 p实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:05 , Processed in 0.024312 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表