找回密码
 注册
查看: 1793|回复: 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) ]8 j* v" w$ L! U6 C" r6 ^
* A$ }6 z& I2 o" O; p8 x
: ~: V& U" m! O5 A6 P: ~
写在前面8 o4 M" q, U' u- d5 p/ |/ M, [+ D
最近更新是有点慢了,有读者朋友催更了,我也很抱歉,一个是事情比较多,另外一个是最近比较顺利,没有遇到太多问题,所以记录的没有那么多了-.-
1 |  k8 O1 ]1 w5 t& H* o! t9 c" V" [$ O$ |/ F' v
问题的提出! {- Z7 k* H+ U4 C
本篇要分享的是删除超大bucket的另类操作思路,ceph version 14.2.11) @! M' x; `! O$ A/ n
, i! X2 ]' ~  b% l  a) h8 b
我们有个测试环境,data pool的osd参数要做调整,不得已要重建某个data pool,它对应的有一个超大的bucket,其他pool不能重建,尤其是index pool,不能重建2 s$ \9 m6 Z0 Z& q, z4 f. U

" X, D8 v+ v3 a, ^! \" e1 [* S对于单个bucket来说,存放的对象数超过1亿的话,就算是比较大的bucket了,在大规模数据场景中,过亿对象的bucket并不少见。
9 t, a3 F, z! k; Y: F, }: `" U- [* K/ F9 ?6 K$ t
一般来说,生产环境中超大bucket的对象删除,是由客户端,也就是客户自己做的,主要途径有两个,一个是通过设置对象的lifecycle,让对象网关做自动的删除,另一个是客户端主动发起删除操作;而测试环境中的超大bucket,通常需要我们手工删除,那么问题来了,如何在短时间内删除超大的bucket?( Y) B% X2 o5 Z) c/ K$ E

; P0 Z: f( ], x" ], f/ [对于超大的bucket的对象删除,思路有以下几种:& N5 ]0 J  P# R* e. X

# l( C0 _; B! N6 M1、不赶时间,用radosgw-admin bucket rm删除,或者python的boto,bucket.list()后慢慢删除
/ C  ^& b$ ?7 c/ P7 Y- n6 {2、赶时间1.0,用python boto多进程、多线程同时删除,这种思路需要事先得到object的列表,一般可以用bi list获得,进程、线程数够大的话,速度也很快
! S  r% E* P( Q4 Y4 p& R$ E2 T3、赶时间2.0,某种情况下,要非常短时间内删除bucket的数据,最快的办法就是重建所有pool(如果允许的话),这种方法最快了,脚本一跑嗖嗖嗖~
- ]! ~* O. s; j; X  a4、赶时间3.0,在不能重建所有pool的情况下,要用最短的时间删除bucket的object,就是本篇要介绍的方法2 Y7 g0 |( E# r6 `, u9 K4 e
开始删除
4 M0 ~$ f7 v& u; D/ U: E查询一下需要删除的bucket的对象数
/ a  t7 e7 I$ v* F: A, R
3 c7 v0 v% H9 u% ]
2 q; R! k- k9 f0 Q# Y2 c- ?0 }1 `[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'num_objects'$ T* R. e0 y" A# }5 f
            "num_objects": 4754986551 e" g; j! k- M4 h
接近5亿,这要是用boto多进程多线程删除,得删到什么时候去。。。骚操作搞起来!; ^& m: X" a$ d1 t2 D; S' |

& P( a' R6 e0 U+ S5 H7 j$ v首先,重建目标data pool,这一步相对简单,osd批量destroy后,重建就可以了,这里不展开讲了5 R0 z+ D, D. e2 R& g
. J* h& ^4 S" r) X$ }
data pool 重建后,bucket实际上还在集群中,仅仅是这个bucket的object的数据部分已经不复存在了,接下来,我们要删除这个bucket的其他数据2 C' g# _. ^! r  d3 `

- {& f6 e. _) u, D/ \9 Y' [经过测试,这种情况下使用python boto不能删除bucket的对象,rgw的返回虽然是http 204,但是op结果却是返回-2,查看到bucket的stats,对象数量没有减少,同时,使用radosgw-admin bucket rm 的方式,也不能正常删除bucket" ]1 ^; L9 A1 t- h) \# B
& W' [* M" ]; _  F
这种情况下,只能继续强行从pool中删除数据对象,也就是直接将bucket的对应的全部元数据全部删除,然后重建这个bucket; B4 _( @* C2 [- @0 g- }/ r2 |) F

6 v" y  H' w1 T: f; h. j) d# n" F' X要将bucket的index中对象的object删除,首先要取出它们的名称,根据bucket的id来找到. d: `9 v7 U  H
: p8 }& d1 t! t% ]- h
5 e/ B3 _$ X9 Y+ L
[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket|grep -w 'id'& L2 w, ~( n/ N, _  p( B
    "id": "e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11",* c. s* u9 Q, g5 i- w* A
[twj@ENV-MON ~]$ sudo rados -p  moumouzone.rgw.buckets.index ls |grep 'e1908b0b-aa5b-40fc-87f1-dee312a028df.78323.11' > target-bucket.index.objs
- R# Q- U) ^- h+ V! M, w8 K3 ?# w[twj@ENV-MON ~]$ wc -l target-bucket.index.objs
: h' ], x" m9 `+ R/ Q. v" i1297 target-bucket.index.objs
- J  z% f1 P$ n) F9 x1297个对象,跟shard数量对得上,可以开始删除了( n8 ?  O2 D0 Q2 s8 j2 L% D
9 B" Y% w: j  a2 w4 W% J5 @# `6 L

6 {" ]3 F5 l" Z- c; u[twj@ENV-MON ~]$ cat target-bucket.index.objs |xargs -i sudo rados -p moumouzone.rgw.buckets.index rm {}
1 D. R# }; y( Y. c/ l; P- m/ B9 y: }这个过程比较久,按照这个bucket接近5亿个对象的量,删除index对象花费时间大概是40分钟' Q7 u5 P0 v" ~9 ]4 h8 l! _0 e% H5 x

3 M' I+ ?4 @+ z7 y删除进行时,注意到index pool所在的osd的IO繁忙起来, U7 F- ^4 z  `' w" F' W  E# }" y
& X8 @9 l/ T' w8 R0 A  e
, ~+ T, _+ Q$ l
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
7 x7 k# R: ]7 G/ a: }           3.11    0.00    1.05    7.91    0.00   87.93+ F8 V+ h- E4 r3 T$ _, T" j4 d

- y( w* f" `8 v3 v4 Z1 Q$ qDevice:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
# K3 Q1 O6 \. Z4 C- hsdb               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
; J7 ?( ^! |& Xsde               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
( x; F2 h" G$ @* B1 d% Z7 S/ A9 bsdd               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: B! Z! P$ P: I! i! e, K
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.407 V$ o# J7 M' I+ i1 V8 S9 M9 d9 ^9 ~
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
  x  z% O1 R3 T8 K7 M+ ~5 l/ x$ Msdc               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
7 w5 H* V  n( b) [/ a8 q8 Msda               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.002 ]& z) o5 S' e8 |- ~# v
长达40分钟左右的删除操作退出后,集群告警的large omap objects数量开始下降,观察到,实际上磁盘的空间仍然在进行回收,而不是删除操作完成后,立刻回收,这里额外需要等待一段时间,等到large omap objects都消失后,index osd的空间也回收完成了& t1 L* }  r% H
$ E3 b3 j5 y6 ~$ p, N0 v
bucket的数据部分和索引元数据部分删除完成了,此时,bucket的信息仍然存在,查询仍然可以发现,但是查看详情就会报错4 k- v1 Q, f: n; R1 r# M+ V2 w

# O0 `2 X' @. R) u0 c# _8 a" h& b0 f
[twj@ENV-MON ~]$ sudo radosgw-admin bucket list
* F  \( h2 g4 A$ n9 T9 R. E[1 c5 k4 V( V; L9 Z( H$ b! q9 x  O
    "cosbench-test-pool31",* p" O6 l4 ]/ V! o
    "cosbench-test-pool21",
5 v$ O2 `$ |6 Z6 Q- a    "cosbench-test-pool11",! v1 z# m. v/ M% f$ \- a% \
    "target-bucket"
5 Q3 a  X5 U5 o/ F3 u7 T]
# O3 r6 K9 M2 m) Q+ w3 B[twj@ENV-MON ~]$ sudo radosgw-admin bucket stats --bucket=target-bucket0 z3 b  X5 l% D. s% a4 w
error getting bucket stats ret=-2
! p# C# u3 w9 Z: S1 _" f) X# x$ ofailure: (2) No such file or directory:
( p* A1 M( K* g* z) _[twj@ENV-MON ~]$ sudo radosgw-admin bucket rm --bucket=target-bucket8 j( s; P6 L+ H! [0 `$ h. H
2020-10-10 15:52:07.178 7fc385dfa840 -1 ERROR: unable to remove bucket(2) No such file or directory
7 W7 Y: I: j3 x3 g0 J& v" }8 l( f, u[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket5 L* t6 z. w5 {9 `! `3 B
[' \: k8 S8 L2 z
    "cosbench-test-pool31",
4 n. j$ e2 M) e    "cosbench-test-pool21",
. c# e' V. Q% e) n4 V  c    "cosbench-test-pool11",0 q  x' B0 \: o( e' b
    "target-bucket"* ~; o" d6 t. `" f
]4 F6 T6 A/ f/ u# U$ N
我们需要从metadata中将这个bucket删掉,才能彻底地删掉这个bucket
$ h$ i1 O/ T1 H: V8 ^1 }  o* F
$ K2 Y4 {6 {2 s2 j" f7 m# Z9 o! f2 i5 k7 C
[twj@ENV-MON ~]$ sudo radosgw-admin metadata rm bucket:target-bucket" b7 _' O" f1 ]7 D
[twj@ENV-MON ~]$ sudo radosgw-admin metadata list bucket% F+ c, P% q2 z4 V) K4 [% i4 v, c
[! m  O) f$ w# k& b' ?1 b$ R7 I
    "cosbench-test-pool31",
* Y+ n+ X: y# X* L& m0 \- _    "cosbench-test-pool21",
, U% W" N7 b0 `( @6 Q6 g* Z4 l% M& {    "cosbench-test-pool11"
; C; e( {; P5 O0 `4 V; \]
! y0 t. X9 V& @+ k* i这样,就完成了这个超大bucket的删除,清清爽爽~" K1 [0 Q3 r3 q9 t# V: h- ^8 K$ K, I9 X

. N; ]1 N9 @) u! F7 j8 D4 ^总结' `  R; y2 r5 j, @* w3 a
实际上,日常我们使用最多的删除object的方式,还是使用python boto多进程多线程的方式,安全,速度也还可以,不过达到几亿对象的bucket,实在也无能为力,要么牺牲时间,慢慢删,要么重建所有的pool,一了百了,这次遇到了pool不能重建的情况,才使用了本篇介绍的方法,希望可以给读者一些参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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