找回密码
 注册
查看: 1791|回复: 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-13" g0 U+ I0 I' {& d4 E6 {- c
9 ~% ^+ v- e# P3 O  @& U- P
8 }- I1 @6 t7 g3 p3 |
写在前面
& x9 F/ b( }, D  _, p最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-
; |2 \0 ~& a* `. k- p
4 o  R, U) c4 p2 \2 u问题的提出, e& X0 q3 H  e* b& C' x
本篇要分享的是删除超大bucket的另类操作思路,ceph version 14.2.11
) t* b- S0 L+ m* A- Y; b, r3 G' j3 X
我们有个测试环境,data pool的osd参数要做调整,不得已要重建某个data pool,它对应的有一个超大的bucket,其他pool不能重建,尤其是index pool,不能重建
! t/ v. v/ F7 _% Y( a& C) s& ]% z: s$ p' j: H% H; s
对于单个bucket来说,存放的对象数超过1亿的话,就算是比较大的bucket了,在大规模数据场景中,过亿对象的bucket并不少见。
. J5 a; M. I; f: @! J& P& m
8 @8 H" K& z# K! G8 o7 c, t一般来说,生产环境中超大bucket的对象删除,是由客户端,也就是客户自己做的,主要途径有两个,一个是通过设置对象的lifecycle,让对象网关做自动的删除,另一个是客户端主动发起删除操作;而测试环境中的超大bucket,通常需要我们手工删除,那么问题来了,如何在短时间内删除超大的bucket?
3 j' O  |0 z" i; G; V- E  \5 I6 t# D$ g2 k9 f6 o. e& R2 z
对于超大的bucket的对象删除,思路有以下几种:0 U8 Y% n% y4 S% @  ?' j; E" a( j7 G
3 G/ f: d6 s1 j- h# u: L2 g+ w
1、不赶时间,用radosgw-admin bucket rm删除,或者python的boto,bucket.list()后慢慢删除
6 z6 {0 I6 T( f. N2、赶时间1.0,用python boto多进程、多线程同时删除,这种思路需要事先得到object的列表,一般可以用bi list获得,进程、线程数够大的话,速度也很快
7 Q; U) E, O8 q8 L( Q3、赶时间2.0,某种情况下,要非常短时间内删除bucket的数据,最快的办法就是重建所有pool(如果允许的话),这种方法最快了,脚本一跑嗖嗖嗖~
+ h1 {7 D* u) _) p. H4、赶时间3.0,在不能重建所有pool的情况下,要用最短的时间删除bucket的object,就是本篇要介绍的方法
2 Q- q4 T6 l# T3 }- W) G; i  `开始删除
' Y8 t' i; F0 Z) J: K/ J+ ^9 M1 q查询一下需要删除的bucket的对象数
2 s: y# ~$ J0 ~- d) b7 q' w( S6 d# T

  N7 r# r# L9 f+ ]1 D2 F[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects'
4 O2 R) L3 t% i! r            "num_objects": 475498655
& @6 w# y! y5 o* o) i0 s接近5亿,这要是用boto多进程多线程删除,得删到什么时候去。。。骚操作搞起来!$ {# m3 \* |$ j* E' Y# F
. x0 k' {. a5 ]/ ^# t7 n
首先,重建目标data pool,这一步相对简单,osd批量destroy后,重建就可以了,这里不展开讲了4 N$ C; {6 I: f6 A$ g6 t

+ N6 x# U/ J5 b* y  v, l/ w: ddata pool 重建后,bucket实际上还在集群中,仅仅是这个bucket的object的数据部分已经不复存在了,接下来,我们要删除这个bucket的其他数据
. P7 ?( d: @$ s" ^% B/ b7 N3 h% k; n
经过测试,这种情况下使用python boto不能删除bucket的对象,rgw的返回虽然是http 204,但是op结果却是返回-2,查看到bucket的stats,对象数量没有减少,同时,使用radosgw-admin bucket rm 的方式,也不能正常删除bucket
* c2 N- z0 h7 @, X8 V3 [2 M; E5 ]/ ~4 ^, L9 m7 n3 E
这种情况下,只能继续强行从pool中删除数据对象,也就是直接将bucket的对应的全部元数据全部删除,然后重建这个bucket
2 c/ `4 I2 @' U: \8 i+ i" r+ P2 V* T- K' l: ]* m. O
要将bucket的index中对象的object删除,首先要取出它们的名称,根据bucket的id来找到
" Q% p, m8 Q# ~0 N3 p- l; q
: F: I! H5 t: n9 w  m0 W9 V% K
0 d. L7 F, ?7 F2 I[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id'
' l8 I7 Y2 f# ?4 Q5 i) s    "id": "e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11",8 |2 W* ?1 V: i# |/ y) _
[twj@ENV-MON ~]$ sudo rados -p  moumouzone.rgw.buckets.index ls |grep 'e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11' > target-bucket.index.objs
, a4 A, G$ ^3 H$ G8 b4 A[twj@ENV-MON ~]$ wc -l target-bucket.index.objs
$ E& G; r8 O# f3 F& @# R1297 target-bucket.index.objs
3 W9 O8 |8 }* M/ r5 b" i1297个对象,跟shard数量对得上,可以开始删除了
. x: W" C* R& K" K
# D6 w' J/ m- @( w3 p8 J' U/ ^+ E# b7 ^5 u7 D" U: T3 n
[twj@ENV-MON ~]$ cat target-bucket.index.objs |xargs -i sudo rados -p moumouzone.rgw.buckets.index rm {}  k, d/ A' s' G% k9 x) c
这个过程比较久,按照这个bucket接近5亿个对象的量,删除index对象花费时间大概是40分钟
) r1 L/ p. ?2 Z8 @
  L: u: O5 o. t3 `删除进行时,注意到index pool所在的osd的IO繁忙起来
% g. X" Y* Z; R( m' n
" {9 [; J! m3 [4 X8 w  i, ?" Z. M$ f; w' ]  u' N
avg-cpu:  %user   %nice %system %iowait  %steal   %idle1 H- E+ V% W% j( y
           3.11    0.00    1.05    7.91    0.00   87.93
4 i+ _3 c+ \0 @. o$ p* |( u0 g. \
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
. `3 L& S0 O4 N5 B' m' |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: Y- o7 D. osde               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% S$ }+ z1 A& }
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+ G8 [" T4 k+ K6 V2 m9 q* l
sdf               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' m7 ^" Z& D( v1 C1 k7 T
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
& [9 d) ~  D( t5 Y1 w7 h' Bsdc               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
  X; a& w: K1 v) ^5 t% l  s9 ]- \1 esda               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- D. \6 n2 t9 c6 L7 L% s
长达40分钟左右的删除操作退出后,集群告警的large omap objects数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects都消失后,index osd的空间也回收完成了
8 ~, @. ]1 c& D/ B  r* B7 S. T: H) b6 M1 K$ }2 d. q
bucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错
9 k* ~3 Z& Q: n6 h- ]. A% F/ R4 h5 Y" g" [8 l1 {
% B$ \& j' z. I; `
[twj@ENV-MON ~]$ sudo radosgw-admin bucket list
& i2 [# d  p; @: [/ `1 ?[; _, h" P, o$ D- l$ Y
    "cosbench-test-pool31",
! S1 i2 v7 c" R) T! D# D: U  }5 v$ ^    "cosbench-test-pool21",
! ]1 n: Y3 k4 m$ `" J    "cosbench-test-pool11",  v  @3 l1 ~# G# l2 w* m. c) k2 F
    "target-bucket"
# u( O% Q; x3 O- d6 u) B! |]6 K: Y4 U. M4 D8 g$ y/ e
[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket# Q9 C, R1 N' B8 _
error getting bucket stats ret=-2. O$ X" K# k" C
failure: (2) No such file or directory:0 v/ m1 W5 p: A. b
[twj@ENV-MON ~]$ sudo radosgw-admin bucket rm --bucket=target-bucket
  v* @, l' x) Q( x1 H) W2020-10-10 15:52:07.178 7fc385dfa840 -1 ERROR: unable to remove bucket(2) No such file or directory4 G4 h! v! \& P, |5 e! E
[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket
( K* m( D  v7 A0 U. K( w[
: h" y5 c# h0 N3 G( B    "cosbench-test-pool31",
2 x1 X9 r3 U$ u5 l& }# P2 N    "cosbench-test-pool21",
9 i# F, E$ E1 \    "cosbench-test-pool11",
8 o7 N2 @. X8 ?, k8 c7 e1 L7 {    "target-bucket"' z) B; X" I% j1 G
]0 r% n: {" @6 I1 z. E% R" K
我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket
  s0 c$ [& L8 G$ N6 l/ E3 P1 A+ J; t
. c2 `. l; @3 ^: m2 o7 i5 I
[twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket
+ Q; u" ], Y% F8 }[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket+ X( T: q& E  v1 H, }! X* r
[
5 ?- @6 ]; A  {0 b! z+ \1 F5 b; e    "cosbench-test-pool31",
) o7 Z4 ~+ u0 `0 U/ D4 D9 N; i    "cosbench-test-pool21",2 K* a) \/ a# m% C# r9 f0 C
    "cosbench-test-pool11"3 \  U/ z8 X% `3 u6 B
]
$ ]/ B* W7 w4 _- A这样,就完成了这个超大bucket的删除,清清爽爽~
( I7 Y* N% }% `& Y; F* {* |! Q: M. F! {) [: N* j
总结
$ {3 n4 t! h0 W6 b实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:07 , Processed in 0.022723 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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