找回密码
 注册
查看: 588|回复: 0

ceph分布式扩容注意事项

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-1-16 13:00:30 | 显示全部楼层 |阅读模式
一、扩容条件
/ r; {6 m0 ~* @" V8 z4 ^a. 一般可用容量达到70%,就要开始考虑进行物理扩容,部分由于部署不合理导致的问题,可通过调节pg和weight进行调整。
: q  e! A! _, L+ _0 A8 C- y) S+ e9 j( @- s
b. 扩容时需尽可能的评估当前业务规模,因为当集群达到一定规模后,累计的数据量是十分巨大的,所以尽可能的减少迁移操作。2 R* h! I. n. k4 v! X
; k: {; o  I5 s" G) n# n
c. 通过 ceph df 查看 %USED 是否已经达到70%,并通过ceph osd df 查看osd 使用率最高的和最低的使用率。 %USED 是按照使用率最高的osd算出来的,而ceph在一个osd满的情况下(阈值一般为0.95,告警为0.85),集群就不可用了。5 Q$ }, W( Q/ r. r' ]9 R2 R0 g

8 C, _' B1 Q/ t* G& O$ x% W例如,通过 ceph osd df | sort -k 8 查看到最低osd使用率40%,最高osd使用率为72%,误差32,这种情况很可能就是osd之间数据不均衡。
, d$ d2 y1 w, D% j
; f5 ]% n' m3 O; @4 ad. 导出osd 的pg分布,查看到部分池的数据很少(几乎没有),但给予了1024pg,data数据量多的池在每个osd内分布的不均匀,例如在osd 1 中,总pg数为120,但data池的pg只占用60pg,其他池meta池占用30pg,但实际上meta池数据量远远少于data池。查看osd 181,发现data池pg为90,而且其容量只剩剩余2T,而osd 1剩余3.6T。从而导致可用容量按osd 181的显示,随着业务持续写入,很快就接近阈值,导致集群空间的浪费。5 P0 O* s8 `  \( l( F2 x
& x, f. d' j/ ]* _( T, P
此时,应该调整池pg分布的均衡或者调节部分峰值的osd。/ f1 H: U1 S4 W' g! o: w: L* `

, k6 ^8 s" w2 ?  }$ ze. 若pg分布均衡且数据分布均衡,则考虑 物理扩容 。5 c& B3 z! i4 F4 O

+ s; V# Q& v- q二、扩容流程- y$ p) u0 y/ g
扩容的过程主要是添加osd的过程,添加完osd后,还需看情况是否调节pg,具体可查看文档后面 计算需要调节pg
( H5 i7 I  C- r) p8 v$ U! J; }( F7 D1 H1 s  M
扩容过程主要分为4步(文档有具体描述):
+ K8 c0 h! R' t% }3 g  T
9 Q% ]& J3 P9 _" b( P(1)业务规模的评估
+ c4 m1 V/ @9 W3 L$ t" H
+ `$ ^8 _+ o7 x+ y7 n(2)扩容前的准备工作(包括环境的检查,pg数的计算,pg分布的统计)5 w7 Q$ R" n2 u6 u% S

- G& ^, B: B9 s5 a( `7 g(3)扩容过程中的故障处理(mon、osd进程故障,pg状态异常故障)9 k; l/ d3 t* _6 Y8 V( n6 K! ?

# `3 b* {7 J) g; E, V" N(4)扩容完的收尾动作(统计pg的分布图,调节迁移的速度等)
# O0 V( k. m) ?2 X" Y6 v* V4 e/ h- c' y/ r7 E
扩容时候出现的故障主要从 现网组网 系统 集群 进程的这几个维度进行排查
+ g0 ~, o* e) ?! a: [, L
, {7 T. L0 q8 {* I. N$ M例如出现mon down时候,可通过mon进程所提示的err进行定位,从而转到集群的规模是否部分参数未放开限制,再到系统的内存不足或者网口负载太高,需调节系统参数,再到组网环境搭建进行排查,如交换机环路等。
& G" n1 X3 d6 ]: `$ `6 `
  g  o0 C) f' B% P0 z+ ~: \(1)由于pg不均衡或者weight权重不相等的,可以通过调节osd的pg数,或者 weight值进行初步腾出容量。
( B3 A. I" u6 K8 X  f6 d# 调节osd weight值3 B9 W* q0 C3 W/ ~) Z
ceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>9 F  C5 E6 [; n/ A

: |* c  Y9 k* Q# ?! \, f+ w* b4 M9 G; v) q
# 调节pg数目9 Q# B; N3 \* ^1 K  U
ceph osd pool set <poolname> pg_num|pgp_num <int> #int为最接近2的幂次方/ P- f/ `, H1 k) i( g& d" ^2 m1 O. W
若是由于池的pg不均衡导致,采用ceph balancer进行调整
  M" z8 r7 Y' y  Y- h7 R" Y& j% G0 n' t. Z0 b' B' l
# 查看集群得分
$ g* w' q; i6 ^5 x& e2 G% jceph balancer eval+ ]) j; Z- D* m( ~

4 p& T* U" {  N$ p
6 P" A+ f" F& K5 R# 设置均衡策略(crush-compat)
" q) Z, s! O2 L. q# q( D4 Uceph balancer mode <upmap/crush-compat/none>2 d  a9 Y8 l% ^% F2 Y7 [0 W. Q* G( T
None:表示什么都不做- `8 X* e7 w* T6 q+ ]. l
Upmap:通过重新映射pg来平衡pg
& D) Y0 M5 O9 k6 k# s/ ycrush-compat: 通过重新设置osd的weight值触发pg的重新分布, G; V6 {4 g5 E0 L4 ^
: O+ O! `* P& i

: _4 n, j3 s! m4 U; m# 设置均衡任务
  h4 \7 ~4 Y$ h. d. e* @ceph balancer optimize tune <pool_name>
0 C$ S. e8 _. y4 _  g. N: Qceph balancer execute tune) E0 L$ E2 R  x. A, U, f. J( ~7 o8 b

6 A  p- H0 n+ x: w+ ?- _9 P) }. Y* Y4 `+ f" W# j& ^7 \
# 这时,在查看集群得分
+ c: k+ w1 A  D6 {ceph balancer eval
" |! y9 I% F; h1 ~2 ~(2)通过增加osd进行物理扩容: t3 t3 v( d8 {4 l9 ~% Z
处理流程可在web上操作,这里提供添加osd的命令
2 \- \) I1 N0 W: B2 Q, K% B7 V  O, i, ]
# bluestore:
/ e" E; @% f) {7 j* ]0 eceph-deploy --overwrite-conf osd create node66 --data /dev/sdb --block-db /dev/sdd2 --block-wal /dev/sdd1
+ R$ H" u7 z- H0 o2 c, dceph-deploy --overwrite-conf osd create node66 --data /dev/sdc --block-db /dev/sde2 --block-wal /dev/sde17 t9 i  \3 }( \- l0 x$ Q/ h8 u
...4 J& ?& K' |( p& X6 r% O# e

1 l5 w+ Z, J7 K/ G4 C
) [- X* j2 l! T: n8 C. B- p  S# filestore! \, O' ?0 R4 l: C+ C! c
ceph-deploy osd create --filestore --fs-type xfs --data /dev/sdb1 --journal /dev/sde1 node66ceph-deploy osd create --filestore --fs-type xfs --data /dev/sdc1 --journal /dev/sde2 node66
4 d( T6 P9 D: ~. z9 ](3)扩容后,看情况是否需要增加pg,或者均衡池pg。pg均衡情况可通过脚本《pg均衡查询脚本》查看,脚本可私信获取。$ }9 {* x9 D2 n' h; ?+ g
pg的计算公式:
& P, X* w' b4 L# ~  i/ A" f
* ?+ m7 g7 ?7 E. A; [( \1 [5 Z9 g! [1、输出的值取舍到最接近的2的幂(最接近的2的幂提供了CRUSH算法效率的少量提高)
4 Q+ Y5 [9 R8 ?9 N& D9 w% _: l: U7 X- r5 U' Q
2、如果最接近的2的幂比原始值低25%以上,则使用下一个更高的2的幂3 t0 S' _7 I# t0 ?
3 q% f1 n. t' Y% c
3、每个osd pg数目,建议值:
9 ?/ S) L; a% d1 w& U& y: b  n+ @
* y& H3 B$ H% M7 V100 如果在可预见的将来,群集OSD的数量预计不会增加。" a( Q7 K* e+ @
' j& Y+ W0 K. S
200 如果在可预见的将来,群集OSD的数量预计会增加(最多增加一倍)。7 `; ~2 p) H8 S! r# ~3 l
- l% y/ ]" ^7 d2 A1 Z4 s$ i4 d, c
算法:* i& b; x% v. A
6 ?- G# r% s" |' ^, r4 o: E7 C5 h7 W$ C
(每个OSD的目标PG)x(OSd总数)x(数据量百分比)/ (副本数)
4 W: l$ y- F9 ^3 z* [" U
. p/ O! O1 k# ]ps:* {- u+ j# \/ D# }# S

. z4 L4 F( S7 T, d! P9 b如果以上计算的值小于(osd总数)/(副本数)的值,则该值将更新为(osd总数)/(副本数)的值。这是通过为每个池为每个OSD分配至少一个主或辅助PG来确保均匀的负载/数据分配
( [3 x( W  Y: A" G+ A2 ~, P5 U* `7 R0 Z4 l
数据量(普通生产环境):2 g; W7 ]+ D: z

) ]3 Z4 u: M9 h项        .rgw.root        rgw.control        rgw.meta        rgw.log        rgw.buckets.index        rgw.buckets.data        rgw.buckets.non-ec6 }, Z; \& X# `+ m" y" o
数据量占用率(%)        0.2        0.1        0.3        0.6        1        94.8        3
, P6 E" H1 R. F0 S( e# {/ g( C三、扩容期间
  \6 _2 n4 l! o( g(1)观察pg的状态(相关故障处理可根据《pg异常处理》处理)
7 ^% `* o. ~8 \; aPeering: f5 B+ z. K3 _+ v% y4 k% k
peering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致
- p; G  j. g7 }- t( W2 i: E
/ d% G8 \1 i5 [3 j( ~* ~) gRemapped
) \/ J4 L! x) \. M, V5 H当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped
) p2 r& Q- j! V2 I/ v+ J2 ~
# r& n- h5 O( O: d; _: j7 V0 LBackfills
$ K; e3 D9 R! T. O- ^# k# H当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling
! `2 Y9 m) H, N- p/ ?  t
" K( Y: V/ i) ]9 [" j7 vRecovering
6 C& d* @! i' Y; V, N+ b" R( w! ~当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容! G# @& N  G! G* x# t/ c
必须更新到当前状态,处于此过程中的PG状态便是recovering6 C: Z/ c. f; y+ f( Z  n6 v1 u2 r
. V; I! l. O* U2 |
Degraded1 Z1 O9 w1 k' r. X6 U$ N
当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:0 J0 z: i( V# [/ w
) X# N) x4 k5 p3 _
在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。4 ?% I" k( g; v" ]: O- }

$ D" _- w( e# B0 w6 V- n. g3 e当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object0 \& J/ w& |# |) P2 V) V

: X  D4 C) O5 _3 w( UActive$ D/ o% I$ V2 f9 q% o  }
处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作$ [( h- |0 n/ X" U' Y2 f3 a# I
6 f5 z% w, J* ?
Clean  O! H3 @: }% g
当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作$ G* E, o$ D4 @) \/ N

+ @) F& B& C4 H0 p) x4 p$ |* ^7 ?3 \# W8 ?6 W0 p

" m7 l) M. \, m2 R1 {4 n3 A(2)迁移参数调整& t0 `+ a: w7 T3 \, n5 K/ j' ?
5 Q' i' L8 i' \9 ?8 v! A
数据的迁移的相关参数,可根据业务数据流量的时间分布,进行适当的调整,加快迁移:8 Y5 O, [9 Q7 x/ j# P% p' _2 ~

: p' g+ E3 q8 m8 _这个值存在平衡点:具体可看:https://blog.csdn.net/tony_vip/article/details/100122104
6 @: F+ O+ M9 u! H, r0 _( G, g8 @2 N  X( l4 j) v+ K
思科参考值,具体视集群情况而定+ c+ ]6 f. k* }) s+ Z1 d
osd recovery max active = 3 (default : 15)& P, T8 m/ v( i/ W- u# B
osd recovery op priority = 3 (default : 10), w$ _9 Q3 \- a
osd max backfills = 1 (default : 10)5 _4 d4 w* C4 F4 ~0 j  I4 {' j& Q  j
7 c6 u" x. N0 T
+ d- R. M* Z5 `" v4 f
参数注意事项:
9 D" s& J* a% t) F+ G6 N4 o8 e+ iosd max backfills设置为10时,假如一个pg 50G数据 需要迁移10个,那么基本是迁移500G左右的数据的时候开始删除而7 Q' ?2 @% b( ]& K" g) h9 f5 B2 y
backfill为1的时候,就是迁移50G,开始删除一个,迁移50G删除一个,加大backfill反而阻碍了空间的释放。
6 P" j' r: k) v
' e  P0 w- N0 L2 \: g5 Y! _
/ U$ J5 g0 p6 B( qosd_recovery_sleep = 0 在luminous版本已经设置成ssd是0,sata变成0.1,相当于增加了一个延时的过程. j8 ^% h( Y. M3 Y1 E) R

, h9 ^3 @1 F! `3 G9 V. q; O, [; I% L+ N* m) Y
(3)slow request4 u  ]5 m2 b) R$ ]+ H: {; }- `3 [

& ^. g0 _  D5 c3 K  ?8 g( v( h若迁移过程中出现slow request的情况,一般为集群过载了。主要可能有以下原因导致。" U) m1 }: u) S' M5 x- o
$ o5 l6 Y0 C( U1 P, A2 J1 l7 h
a. 池的pg数太少,导致某个池阻塞osd的情况
9 g7 i% J! m& Q. v. ?; [
+ Q2 g3 [$ F4 R1 B通过mon log日志,获取到阻塞osd的信息:
7 J  X; J& i) |" d5 u# e1 q1 J, [+ S, S! h8 N  b/ M8 [
2021-01-12 00:04:05.257239 osd.3 osd.3 172.168.30.103:6801/908686 2976 : cluster [WRN] slow request 31.493678 seconds old, received at 2021-01-12 00:03:33.763381: osd_op(client.137288303.0:1137363 7.1a 7:590/ u% ~& Z7 P. |5 S5 F- S
这里可以看到osd.3阻塞了,pg序号为7.1a,查看对应的池(ceph df):, h  W% m9 W5 @  B1 e4 n
! y- F3 e* ]) l  R) |- x
可查看到是default.rgw.log,在查看对应pg数目:1 E6 I6 z9 O8 K: @  D+ x: F3 Q
- x# x$ D4 h% d1 y1 k: p. T' ]
ceph pg dump pgs|grep ^7.|awk '{print $1,$2}'3 U; E" k" p5 O. K
环境上有80个osd,而pg只有32个,均摊到每个osd,平均一个都没有,并没有充分散列,假如维持单个osd承载10个相关pg,那么计算下来:9 k5 k9 K, a& o0 b& p# r# p

/ A) Z/ f% O9 W$ S- g3 H10*80/2=400 取最接近幂是5128 a+ G: t9 c: W7 V0 H
6 c$ h2 D; r' X$ Y- K. Z, K& C
512*2/80=12.8
) ?4 A6 Z+ ~( B! T8 ?8 p; f$ @* C$ L) v  v
平均每个osd上的为12.8个相关的pg,因为对象是207个,平坦下去每个pg只需要承担一个对象,平均每个osd承担不到3个对象,比现在的设置情况要好很多  Z. Z* n8 c% L7 E7 y

& ~: e# }! n% C) N4 D  V% [& j. w  x0 h6 \) f2 D  @

9 v2 A- i) `, [, z: W" s# hb. 业务在某段时间突然触发增长' {# @5 u' I- }3 g

3 G2 W/ L- o2 ^" Y/ _. W! Q例如项目在凌晨12点时,业务方进行批量删除过期文件的操作,这无疑增加扩容时候的压力,而且其中穿插着设备的批量遍历操作和ceph生命周期操作。4 C- S, F4 B/ Z! q" X1 k

+ R/ Q9 f* {/ e. _$ D& s故可结合现场环境进行调节:
7 R' N' q4 M7 E& z( W5 b  X. O# N* n( e0 e9 @& i% ?8 e2 E2 B8 }
a. 将ceph生命周期的迁移时间设置为:01:00 - 23:00,避开峰值时间段
' \  J* R) Y, `8 X2 j6 u) f# J2 R
9 }) q- v# [9 T- `+ Nrgw_lifecycle_work_time = 01:00-23:00
( ~& X, p; P7 j5 `b. 降低backfill修复对磁盘的压力' ?0 M4 j) \$ f- `) c9 E$ h- e

. H8 b. B! B# L8 ^- R9 J9 _4 q* U3 \ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.5
, X. ?3 S1 N# p4 K; Y  H& L#默认为0.1# 效果recovery: 16.1MiB/s, 6objects/s, G$ Y3 ^" x6 S, w3 y

9 T" `  E' a/ L4 ], T$ l& H/ `: D- J1 E
ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.1' o( X4 R0 l6 H4 O) P( b
# 效果recovery: 82.1MiB/s, 32objects/s
& u( {8 D+ G3 Kc. 将池后端使用SSD代替( Y8 g6 R; d8 a7 w7 V
- m; k- i) x2 X5 D  A) N
若集群osd数目不能抗住大量元数据的操作,可将池使用SSD进行代替,缓解SSD的更新的时延,加大并发量。
+ I' @; I; b& P6 `; a1 c# D) v

; G3 w/ [: G- @# M& p: }0 x" z* y1 }: T' e" d8 h4 d
(4)盘容量接近阈值
) F" A# W1 B. m$ K2 ]) F& x: L4 L- C3 d/ n6 d; b$ q4 ?
若存在扩容不及时,导致osd的容量还未释放,逐渐逼近设置盘满的阈值0.95,此时需手动操作,将阈值高的osd进行优先迁移。3 C1 j2 h& u' F
. L, X: p" [- [' w+ j) J$ \, F
# 查看满盘osd 所需迁移的pg, i; M' M7 C+ J. T0 c
ceph pg dump pgs | grep <osd.x> | grep backfill_wait2 P- m. ^3 ~* A3 a& F
主要看UP 和 ACTING 列,可通过awk 过滤出来。
4 y! }* V" K( R! E0 |/ C5 A' e9 `, _
迁移流程为: ACTING[0,1] —> UP[3,4] 尽量选取UP 为新加入的osd进行迁移。: K; K0 ~8 d( k
& M. W9 F7 Y8 M! J3 V0 d" U9 m
尽量将 ACTING 中存在该osd 的pg进行优先迁移,同时设置该osd的backfill 为1,相当于加快迁移出去的数据,减慢迁移进来的数据。" x5 O' `- N' x% n# B

8 ?& N# ]+ n: v' q4 X( jceph pg force-backfill <pg_id>ceph tell <osd.x> injectargs "--osd_max_backfills 1"
- b  O! r4 T3 t; T0 F0 K+ X+ m/ G0 z& `
- C3 \8 S0 R; h/ X+ s: y
(5)迁移所需时间
/ m% X6 j' c4 O  g- m6 |! H( _( L5 f& z( J1 b
迁移所需时间可通过下面脚本进行大致评估,ceph版本不同可能截取需要数据位置不同,需适当更改下脚本。
; b+ e! |% a& a
$ c: ]8 y# J0 o/ c# I#! /bin/sh' |7 t8 n- J5 j/ |, G0 O3 q. Z
while ( 2>1 )
8 v$ w" p$ V7 T- vdo. ?0 c% b0 V6 |; R" o
start=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`
5 v6 |; a( D4 g3 W: o( Jsleep 51 V( D8 _& O, s( a
end=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`( B* E; ]5 a! w, c; d
speed=$((start-end))% k9 a0 S1 X) w  L$ O/ i
#echo $end
) F0 f) ~' B" v: }3 z#echo $speed
3 }$ D, g' X% P8 W" S/ ?: psecond=$((end/speed*5))
5 m; c2 F& n( phour=$(( $second/3600 ))+ f8 q: K$ V8 t; ?7 Y
min=$(( ($second-${hour}*3600)/60 ))) U( G' N. o' i8 @/ |9 @
sec=$(( $second-${hour}*3600-${min}*60 ))" e1 v) W: x" M- J6 x& ~
echo 当前时间:`date`2 B; l  ~, ?, l/ V! M% [  B4 v
echo 迁移剩余:$end7 P& x  f% R$ g
echo 迁移速度:$((speed/5))  v* b/ h9 @# [
echo 迁移还需要:${hour}小时${min}分${sec}秒( S1 w) w- e+ f( U
echo "-------------------------------------"
7 f6 H2 j3 B: Ldone
& h, p. E+ m& ~
! }2 |( l: l0 ^7 K2 |' q, N5 E# N& a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 01:17 , Processed in 0.019714 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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