|
|
楼主 |
发表于 2021-12-6 17:08:05
|
显示全部楼层
删除超大bucket的一种思路2021-12-13& [1 x" ]- h$ A3 @8 n. ^$ q
% S- Z P9 o: Z _3 U* |
* b0 f7 U/ i }) e写在前面
. _/ W5 b+ }- f7 [最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-. v! C$ d: O" m, c" y
2 x' R3 a& K* r: h. }. C问题的提出7 }1 Q A2 _; W, U0 A8 P
本篇要分享的是删除超大bucket的另类操作思路,ceph version 14.2.11
. O9 }2 ^1 i, ^$ C6 E. O8 F9 D; B
& q; l- d0 Q( o我们有个测试环境,data pool的osd参数要做调整,不得已要重建某个data pool,它对应的有一个超大的bucket,其他pool不能重建,尤其是index pool,不能重建
( W8 ?0 J" [/ i% A9 i! R' X! a' Q2 `- L( B1 J
对于单个bucket来说,存放的对象数超过1亿的话,就算是比较大的bucket了,在大规模数据场景中,过亿对象的bucket并不少见。$ C/ b) ?' M6 I( P( S/ ]* w
+ [4 F9 S/ ? L$ M! y) W3 w一般来说,生产环境中超大bucket的对象删除,是由客户端,也就是客户自己做的,主要途径有两个,一个是通过设置对象的lifecycle,让对象网关做自动的删除,另一个是客户端主动发起删除操作;而测试环境中的超大bucket,通常需要我们手工删除,那么问题来了,如何在短时间内删除超大的bucket?
. G6 v9 }& e. x8 E" S; ^4 Y9 Y5 S' M6 _. r( s1 s
对于超大的bucket的对象删除,思路有以下几种:
6 y: y p- o# \/ C+ P* `& a
/ ^, t& V: c6 ]- N1、不赶时间,用radosgw-admin bucket rm删除,或者python的boto,bucket.list()后慢慢删除" ` b4 t/ P5 Z! D+ e
2、赶时间1.0,用python boto多进程、多线程同时删除,这种思路需要事先得到object的列表,一般可以用bi list获得,进程、线程数够大的话,速度也很快6 x" i# v+ ?; e0 y6 A, A
3、赶时间2.0,某种情况下,要非常短时间内删除bucket的数据,最快的办法就是重建所有pool(如果允许的话),这种方法最快了,脚本一跑嗖嗖嗖~
9 s. j6 b3 ?1 E, Z4、赶时间3.0,在不能重建所有pool的情况下,要用最短的时间删除bucket的object,就是本篇要介绍的方法6 @# C8 Y" ~1 g; s8 C9 c
开始删除
5 [: ]# n- c, r6 t查询一下需要删除的bucket的对象数' Z4 _# f* P# L; m- D
9 _: @! P! y! ~" K6 `/ D
! y; i# g; G. q" l" [- W[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects'
, R9 G( J) y: g# l& p/ m' {) `$ L "num_objects": 4754986553 b$ V5 M5 |4 u5 ]0 E5 ^
接近5亿,这要是用boto多进程多线程删除,得删到什么时候去。。。骚操作搞起来!) N5 m+ T1 ?- I4 J1 Y
* X( B5 j9 x6 }3 g+ K* O5 d# f; t
首先,重建目标data pool,这一步相对简单,osd批量destroy后,重建就可以了,这里不展开讲了
0 |$ K7 [* i, w1 ^$ z2 u$ v% d" Y! W% w5 \6 x; j9 j
data pool 重建后,bucket实际上还在集群中,仅仅是这个bucket的object的数据部分已经不复存在了,接下来,我们要删除这个bucket的其他数据& S2 E0 g: Z6 P" v3 w2 K. I: @
$ r4 ~8 F. ^0 g% H经过测试,这种情况下使用python boto不能删除bucket的对象,rgw的返回虽然是http 204,但是op结果却是返回-2,查看到bucket的stats,对象数量没有减少,同时,使用radosgw-admin bucket rm 的方式,也不能正常删除bucket; i0 y! |. g2 {' g7 V3 J
0 ]8 G E: Q& g
这种情况下,只能继续强行从pool中删除数据对象,也就是直接将bucket的对应的全部元数据全部删除,然后重建这个bucket
# t# s6 `9 i1 d
2 M' E, R. D3 B4 ~要将bucket的index中对象的object删除,首先要取出它们的名称,根据bucket的id来找到
" h- w% \2 k7 `) a+ H
% N) q |7 z7 z- F$ m
) b% l; H4 Q* I( n$ m[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id'
" z& e5 x5 w; Q% y "id": "e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11",
0 E0 ^6 c9 C' ~& O4 B% Q, T& L[twj@ENV-MON ~]$ sudo rados -p moumouzone.rgw.buckets.index ls |grep 'e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11' > target-bucket.index.objs
; W9 |* c2 J# S[twj@ENV-MON ~]$ wc -l target-bucket.index.objs! Q; z) N7 Y9 j+ y
1297 target-bucket.index.objs
9 i1 t' p8 H+ p: f/ X1297个对象,跟shard数量对得上,可以开始删除了+ t0 |5 W2 _6 _
, Z+ Z* e/ j# l8 ^/ P9 w# s
z% C9 D/ `$ f[twj@ENV-MON ~]$ cat target-bucket.index.objs |xargs -i sudo rados -p moumouzone.rgw.buckets.index rm {}
: j% [* C, y. @5 M! B+ T p; o% p这个过程比较久,按照这个bucket接近5亿个对象的量,删除index对象花费时间大概是40分钟
+ e/ T2 l3 ~" o. w& \. Y; |, Z0 L& p7 T; Z& Q1 ~4 d
删除进行时,注意到index pool所在的osd的IO繁忙起来
3 n; y7 `7 y2 D a( ]( t* R7 n- Y+ e) |: F l# P4 H; m+ F
9 G1 P$ f# R, V: b& s+ `3 j+ g+ ^avg-cpu: %user %nice %system %iowait %steal %idle
/ `+ B5 }$ I, V5 _( Z 3.11 0.00 1.05 7.91 0.00 87.93
7 {2 j% }. x- g* ?( B
, v" I6 e) F( [4 N) _ K2 MDevice: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util$ l2 H" s; D H2 K4 F: n) H$ O( Y
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
T+ X7 m/ {; N0 Tsde 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! S% D; }+ O5 A1 y
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
% M/ l# Q5 u# X; ssdf 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$ c' l% J Q1 e4 @4 g
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
/ N8 x$ S8 ]4 C9 U2 s* [) Tsdc 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
+ v/ R5 m' k! ]/ x' m' |/ C3 Y& qsda 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.001 P- x8 a: K0 T3 m. E8 R
长达40分钟左右的删除操作退出后,集群告警的large omap objects数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects都消失后,index osd的空间也回收完成了
j% \! F" p4 }. x+ _( A1 Z6 `8 K% E4 g3 y
bucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错
9 U0 ] n* N( b4 F! [
0 m3 Z8 C e, x7 ^ ^! `& L6 m! F; F6 @5 h0 R
[twj@ENV-MON ~]$ sudo radosgw-admin bucket list* m. ~3 i6 {5 t. K( T
[9 T! Q$ V; w7 @2 W) Y# E
"cosbench-test-pool31",7 g! ~0 P! ~" s. R
"cosbench-test-pool21",
0 O- {6 x4 a2 N! M5 ^+ i ?% V "cosbench-test-pool11",0 `8 J. `0 q/ I) {1 _4 K/ a" p
"target-bucket") _- p$ G0 Y; G# a* Y: U
]+ G- A+ F" V. M9 }
[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket
6 k l. @' K2 o! n/ U a* p% v6 Eerror getting bucket stats ret=-2, A* }% S' c3 |4 m+ M6 R: V
failure: (2) No such file or directory:0 d8 z8 P, o8 o: W- I% D: b# o
[twj@ENV-MON ~]$ sudo radosgw-admin bucket rm --bucket=target-bucket+ a K/ p' W$ Z. o5 `/ x
2020-10-10 15:52:07.178 7fc385dfa840 -1 ERROR: unable to remove bucket(2) No such file or directory
; _) s3 T/ T" c7 W; `5 Z. r0 a[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket8 S4 E* V8 D* V( ]2 h8 D
[
7 k& i" w5 C2 S/ J "cosbench-test-pool31",
/ g T7 c; S/ ?' W! w0 ~1 Y "cosbench-test-pool21",7 i! L, B) [& i, h& p
"cosbench-test-pool11",
& n* r- q4 d. C$ r, b9 |1 u1 K "target-bucket"3 Q/ r2 h* Y2 q8 o$ h
]" p: N' b; G0 v# ?4 g
我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket/ [* \, S9 e0 T/ U E- m# j. }4 h
^* ~3 p3 ~6 F8 B
" L9 e6 n9 ] ~4 ]6 D- M0 G* _[twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket
/ V- d$ W- o$ |4 ?9 n[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket
. ?+ k. t* ]5 T& U6 `) n[
) }% @& E2 R4 l& h% q! {1 N. N+ D "cosbench-test-pool31",
5 H& J' a, q" I7 C! _ "cosbench-test-pool21",* l7 k/ }( D- k4 M2 r5 J
"cosbench-test-pool11"5 S# D7 m( f* o" Y$ b! H
]: f& b8 g. m( K0 U8 I& W8 {) T* o
这样,就完成了这个超大bucket的删除,清清爽爽~
& x& t7 [' [4 M4 q
9 A( s7 k9 v: N( N. J- s总结
4 V2 Z! N' Q# f8 E6 h8 Z实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考 |
|