将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

 找回密码
 开始注册
查看: 16|回复: 0
收起左侧

ceph分布式扩容注意事项

[复制链接]
发表于 2023-1-16 13:00:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?开始注册

x
一、扩容条件" F6 ?# }5 ?) ]( u; [: Z
a. 一般可用容量达到70%,就要开始考虑进行物理扩容,部分由于部署不合理导致的问题,可通过调节pg和weight进行调整。
- e( ?; p% F: O! s
6 ]3 H& M' s$ u, ~$ E  P+ Yb. 扩容时需尽可能的评估当前业务规模,因为当集群达到一定规模后,累计的数据量是十分巨大的,所以尽可能的减少迁移操作。
' @7 v- X& k$ N
. \3 u' S! U) B) l" U, u4 cc. 通过 ceph df 查看 %USED 是否已经达到70%,并通过ceph osd df 查看osd 使用率最高的和最低的使用率。 %USED 是按照使用率最高的osd算出来的,而ceph在一个osd满的情况下(阈值一般为0.95,告警为0.85),集群就不可用了。, ^# B, T5 z! h' _% J( X7 O
. A0 E- V" h" \- ]0 k: n; m# C
例如,通过 ceph osd df | sort -k 8 查看到最低osd使用率40%,最高osd使用率为72%,误差32,这种情况很可能就是osd之间数据不均衡。
5 F6 R* j8 x7 W0 y/ P4 D7 @
. \4 @6 c. O% R9 g  p- A8 Yd. 导出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的显示,随着业务持续写入,很快就接近阈值,导致集群空间的浪费。& u8 V2 G6 @' D4 t* w; J, u

# H6 D/ P6 H1 {# W+ {, W( t& E, ^此时,应该调整池pg分布的均衡或者调节部分峰值的osd。$ S$ ?; u) x' N& B! |6 [

0 S1 U' Y* {: g" Z( e9 Y6 d# Y7 l9 We. 若pg分布均衡且数据分布均衡,则考虑 物理扩容 。4 u  v9 W, N+ |0 F" K9 U1 j

. |* D9 f" q: v; |& T2 ]- N二、扩容流程$ r' J1 t1 C. @
扩容的过程主要是添加osd的过程,添加完osd后,还需看情况是否调节pg,具体可查看文档后面 计算需要调节pg  F4 Z9 ~( r0 k) W
3 O" h3 x% D' ^5 p: a9 }  @! T( j2 p
扩容过程主要分为4步(文档有具体描述):
1 @8 U" }& Y0 @+ @6 b/ E9 _- A  O( |; y- b2 L* C2 a* r
(1)业务规模的评估" g2 z4 D" W6 f$ g1 ~
9 p7 d; A* i) S( V9 p
(2)扩容前的准备工作(包括环境的检查,pg数的计算,pg分布的统计)
8 N! u- r" }4 I9 G- |3 i0 d. p8 @
(3)扩容过程中的故障处理(mon、osd进程故障,pg状态异常故障)
7 F3 D' e" X2 V0 s; c& N8 A3 f+ e7 Z2 n, l1 I! P
(4)扩容完的收尾动作(统计pg的分布图,调节迁移的速度等)
9 ^: @. r' H0 C( L/ U# d1 [6 D3 [" L7 ~2 s" {  H5 n3 w
扩容时候出现的故障主要从 现网组网 系统 集群 进程的这几个维度进行排查
% X+ b% X  W( e$ D
. ^- l, G1 V8 t. z例如出现mon down时候,可通过mon进程所提示的err进行定位,从而转到集群的规模是否部分参数未放开限制,再到系统的内存不足或者网口负载太高,需调节系统参数,再到组网环境搭建进行排查,如交换机环路等。
5 E" U2 O/ R' m% o3 o5 w3 m! N( R2 a9 `9 M$ o% c/ j( y
(1)由于pg不均衡或者weight权重不相等的,可以通过调节osd的pg数,或者 weight值进行初步腾出容量。! x6 y$ o; a, K! Z3 t" c  o5 c
# 调节osd weight值8 E1 L" H' C7 W/ F- w/ B4 A% q) m
ceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>6 Q6 v# H. P) g/ N* {& f

& m% ?+ i9 h+ l- {6 }5 A) u' X5 e1 s+ h" v) s) h( X# G
# 调节pg数目) v% E( d' s' j5 U  f; t8 q
ceph osd pool set <poolname> pg_num|pgp_num <int> #int为最接近2的幂次方; O/ k! r6 {1 j( s$ C
若是由于池的pg不均衡导致,采用ceph balancer进行调整, o) [1 S* N8 J0 O- p; p5 C  T

4 }' R; P' g6 a' u# 查看集群得分( Q, l$ w0 q* f2 p; o4 `  k* ~
ceph balancer eval
) h. C: e% z8 O! o) y
+ d# `9 P; {' [) g* }9 d3 _( X, I0 o2 P- ?! w) E
# 设置均衡策略(crush-compat). y/ k4 G- ]4 U
ceph balancer mode <upmap/crush-compat/none>
, D9 G- c3 F" a% T  c/ dNone:表示什么都不做4 N& i% z  V6 `; L9 h6 b4 Q
Upmap:通过重新映射pg来平衡pg3 U1 S# g3 _% t
crush-compat: 通过重新设置osd的weight值触发pg的重新分布% A* E4 @/ G3 F3 r8 K( H

$ `/ |& m; H1 q7 J9 H0 W, Y' e/ `, d/ R
# 设置均衡任务
& w. h% v+ \0 P) @4 b. iceph balancer optimize tune <pool_name>
' t: `3 I+ j! M( t7 S6 e- k7 `ceph balancer execute tune; n% J! ~# D( Q8 G/ Y+ w
% T9 p9 t' D7 w$ t; |2 n

) n" Z9 W  |0 F9 X+ F& M# 这时,在查看集群得分
6 m9 P* _# t) X0 Uceph balancer eval3 @- T2 J7 K) [' i# J: B+ h1 K
(2)通过增加osd进行物理扩容
7 z, H- c/ a: G' X7 r, d处理流程可在web上操作,这里提供添加osd的命令9 Z. U( s- q8 P# G7 Z

; H8 V8 h; |8 m- E# bluestore:
8 ]2 Y0 P$ T/ x. R! gceph-deploy --overwrite-conf osd create node66 --data /dev/sdb --block-db /dev/sdd2 --block-wal /dev/sdd1
$ ?& ^2 M- J/ g. w& Vceph-deploy --overwrite-conf osd create node66 --data /dev/sdc --block-db /dev/sde2 --block-wal /dev/sde1
. P# X% v1 l7 Y) P1 T...+ R( T3 D! S3 W  Q* Q; H

; y3 y- W  a, \' a  ]+ M: K0 w. x0 D- h# H) [
# filestore
: _3 K% C# d! lceph-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
- J4 y: m/ y3 K4 k+ s, i(3)扩容后,看情况是否需要增加pg,或者均衡池pg。pg均衡情况可通过脚本《pg均衡查询脚本》查看,脚本可私信获取。& c8 d) R5 l5 C3 g
pg的计算公式:. i0 k7 k, r( \0 n* a* l
2 C7 {, W9 U/ P( _+ ~# j; C
1、输出的值取舍到最接近的2的幂(最接近的2的幂提供了CRUSH算法效率的少量提高)
9 F( G' X% k9 ^4 V+ R1 X
3 b- ~7 J  R$ i1 f7 F5 {7 v2、如果最接近的2的幂比原始值低25%以上,则使用下一个更高的2的幂" ^: x9 Q& N6 G6 O0 F& A

6 h, g1 s; a( C& Q( B, _5 ^5 r4 F3、每个osd pg数目,建议值:" u" Z# d9 q4 m3 Y  w' z% m
' M& W. J# f& |
100 如果在可预见的将来,群集OSD的数量预计不会增加。
; k# i. q" l* I1 m1 a) t4 ?+ T
, u* O( r( l+ [9 b3 K200 如果在可预见的将来,群集OSD的数量预计会增加(最多增加一倍)。
2 `. B7 `- ^7 Q) O* r  E
6 _: i& J2 u7 x6 C! w算法:" D$ m/ q) C% L

4 O! \) x" [2 Z, d" x' K(每个OSD的目标PG)x(OSd总数)x(数据量百分比)/ (副本数)$ E; r" n4 U% K) }

* O: ]/ V0 }1 ?2 eps:
8 u2 {) Z, z- c. M; w. l+ e' v; t% c+ [. E. l
如果以上计算的值小于(osd总数)/(副本数)的值,则该值将更新为(osd总数)/(副本数)的值。这是通过为每个池为每个OSD分配至少一个主或辅助PG来确保均匀的负载/数据分配: {7 Q$ R3 }3 x; d' v6 |
$ Y$ Q/ m: b2 M6 C$ Y5 k* y6 ]
数据量(普通生产环境):9 X9 e) |1 x' R
0 a% Y, e  }$ Z% L5 J3 b* H
项        .rgw.root        rgw.control        rgw.meta        rgw.log        rgw.buckets.index        rgw.buckets.data        rgw.buckets.non-ec) E$ \# T1 ^0 v5 t+ a; x
数据量占用率(%)        0.2        0.1        0.3        0.6        1        94.8        3+ A# m/ l' @( M8 [- Y+ l
三、扩容期间
5 y3 Y8 o" Z, Q) v! I(1)观察pg的状态(相关故障处理可根据《pg异常处理》处理)+ O5 [' j& _# i7 v7 w4 r
Peering
8 H6 A) }: Z  S% H+ ?* tpeering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致
5 Q- ?0 T" u1 K' C) z( L$ s9 H1 S
  q, U8 l$ a( g) H7 ORemapped
% x. E- K: u; z& a当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped% \2 m4 x* z0 l
& K8 E8 r- k5 a+ K8 ]
Backfills
, b1 d0 ?2 E, T6 i& ^2 h当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling8 O, b( i1 n9 o5 P6 d% _

9 M" s) E% H9 q" ^+ H4 ~Recovering& M6 R" w7 {/ E2 u/ D+ z0 j
当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容* L4 n  o) g3 B
必须更新到当前状态,处于此过程中的PG状态便是recovering
# J; C5 }& v) E; N
& f) k+ u2 o* U/ gDegraded2 u( Y8 f$ K0 s8 f/ _& Q: x, B
当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:. B- n" U( z* K' J( F4 d# ?9 m; X

9 ?/ `0 X( _0 ?在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。
+ f+ ]! ?5 s* B1 }) Q- k7 w  ]* {6 ]+ w. F# b# M
当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object
) N* G) K3 g" L1 f7 f7 v
" N8 {8 i% d% B2 r! E" GActive
+ n7 m- k) i# j' t( d1 Y处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作- n) U1 ]8 s& P& x2 s/ c

; Y# K6 y  p8 @, @Clean
  `* ]& b" T1 G& |# D$ n当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作" n8 e* Y8 \7 o( u/ ^. Y2 b
" i2 [: H$ M, `0 T) G# `' e8 J, [7 H

" z0 ^! I; a* U+ F, {: G
  G4 @  A% W& I5 {! O6 _( q(2)迁移参数调整( D3 W8 P, [0 v( O
: U$ N8 C+ S# d  U& o  I
数据的迁移的相关参数,可根据业务数据流量的时间分布,进行适当的调整,加快迁移:- f5 u3 c4 N6 f% E/ h! c8 Z
4 j' H- _4 B4 B1 K( k- y
这个值存在平衡点:具体可看:https://blog.csdn.net/tony_vip/article/details/100122104
3 ?+ T' E/ q2 ]( O! u6 E" [. K/ I8 C
思科参考值,具体视集群情况而定
6 |* W) l( F3 _+ h) l4 ~osd recovery max active = 3 (default : 15)
5 U" N( Z) Q: fosd recovery op priority = 3 (default : 10)4 e; |4 U5 w  ]& p6 D
osd max backfills = 1 (default : 10): p1 H) Y/ w0 f  v! @) d

7 W4 F* o. L  n4 V5 @. ^, }
& Z8 P  g) ~2 j" u( R. e9 e参数注意事项:
, z' g5 v8 E, L! X0 dosd max backfills设置为10时,假如一个pg 50G数据 需要迁移10个,那么基本是迁移500G左右的数据的时候开始删除而+ @* W$ s* C# T6 p9 C
backfill为1的时候,就是迁移50G,开始删除一个,迁移50G删除一个,加大backfill反而阻碍了空间的释放。
* I  v! J2 E( U) t5 p3 A2 R7 w6 Z8 o9 P- O$ v, a! J+ G

9 U& E: r+ [$ z2 d2 qosd_recovery_sleep = 0 在luminous版本已经设置成ssd是0,sata变成0.1,相当于增加了一个延时的过程
# R/ J" o. Q- m) j) ~' J  e0 J+ L' q% M4 W
, S" s* [3 X$ m% X- D8 Y$ v
(3)slow request
0 @. P% l0 {) A  @  b, ]: w( X6 Q2 F% N- g
若迁移过程中出现slow request的情况,一般为集群过载了。主要可能有以下原因导致。
8 ]" d6 L& N# W2 ?5 ~4 H2 Z& V% y, J2 I+ E7 M% E; c( H
a. 池的pg数太少,导致某个池阻塞osd的情况5 g: |$ s% x6 r+ b4 g& ^& y
/ P/ @# _1 o& T9 O5 t9 w; M$ {
通过mon log日志,获取到阻塞osd的信息:
6 L6 b6 @3 g4 X1 A" N
. e9 R  n4 X$ x% F, s. t2021-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
1 S. y! S# E% V* U/ Q. K/ G这里可以看到osd.3阻塞了,pg序号为7.1a,查看对应的池(ceph df):% y8 L6 k2 B0 _# g9 v9 \/ {
  F' r2 T" g( i9 G. z6 w  a/ c
可查看到是default.rgw.log,在查看对应pg数目:4 L) _1 q: l8 l: ^" e0 Z, K2 }
9 n0 `! I! D( L* x
ceph pg dump pgs|grep ^7.|awk '{print $1,$2}'
6 m" Q, c+ a# ~3 a% q+ s( b环境上有80个osd,而pg只有32个,均摊到每个osd,平均一个都没有,并没有充分散列,假如维持单个osd承载10个相关pg,那么计算下来:
, I  _, D8 ~+ I
( ?2 E% `& d1 l6 X3 y# ]10*80/2=400 取最接近幂是512
- b+ {( S  |6 [0 Y# ]4 b9 B3 I5 ]3 B; ^& n1 n
512*2/80=12.8
- [# i* L* d. j$ V4 T; i- i+ E, }: o$ L; [1 x
平均每个osd上的为12.8个相关的pg,因为对象是207个,平坦下去每个pg只需要承担一个对象,平均每个osd承担不到3个对象,比现在的设置情况要好很多: X5 u2 E1 Q& L- n7 z3 A$ N! ~

* G3 T3 [/ y+ g8 H. l
! C0 ~  R2 b( Z9 Q! _) U  \9 K
# ~1 b  w9 J6 q! E2 H$ rb. 业务在某段时间突然触发增长0 ]- k8 n  F: I" r; G
, }" _; Q* \. E* R/ v* M
例如项目在凌晨12点时,业务方进行批量删除过期文件的操作,这无疑增加扩容时候的压力,而且其中穿插着设备的批量遍历操作和ceph生命周期操作。
- P7 J- G  C3 ]0 t1 i1 @, S, T6 r4 S. O8 x' ^
故可结合现场环境进行调节:
( Y# r" X; c+ h9 ^2 X' I1 }. Y4 E5 s: B/ x8 }2 Y) h
a. 将ceph生命周期的迁移时间设置为:01:00 - 23:00,避开峰值时间段
; E! f7 r% m0 e$ I2 j
6 z+ T, K* n5 N) R8 \6 krgw_lifecycle_work_time = 01:00-23:005 ]2 x7 D; ]* S5 m
b. 降低backfill修复对磁盘的压力5 c- W$ D  |2 E
0 \8 c' f+ e5 @6 J+ J
ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.5
! O; n6 E  l/ c9 R6 A3 e#默认为0.1# 效果recovery: 16.1MiB/s, 6objects/s+ c$ H1 D0 c& a5 _* n: y
; p+ h- ]1 t, X) ^
- ]6 R  X3 E2 y. [: H
ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.1
9 o6 G0 a. f  s, {# 效果recovery: 82.1MiB/s, 32objects/s+ `1 }2 V4 z( I
c. 将池后端使用SSD代替
4 Q2 U1 S8 [- T/ M  J1 C7 z
" h) B& u% e* j! ?' N$ J若集群osd数目不能抗住大量元数据的操作,可将池使用SSD进行代替,缓解SSD的更新的时延,加大并发量。
8 I, o1 F6 C5 _7 c7 _
3 M$ V& Z1 A- `- }* @; m+ X) J. b0 D. ^0 `+ [
: f7 Z$ A4 `& p  R
(4)盘容量接近阈值$ i: a* [! m; }8 O  O) R

: M0 R" [6 X" E+ Q0 u若存在扩容不及时,导致osd的容量还未释放,逐渐逼近设置盘满的阈值0.95,此时需手动操作,将阈值高的osd进行优先迁移。% ^6 o/ [9 d" b7 T5 l1 h% p

. d( l! J  E$ m4 p5 F, c2 _# 查看满盘osd 所需迁移的pg
) B. Y0 H; J, ~& F7 Nceph pg dump pgs | grep <osd.x> | grep backfill_wait
+ ?% X  ]# ~; ~1 s1 m主要看UP 和 ACTING 列,可通过awk 过滤出来。$ Y! M) L: ]* c1 ?
- O& z0 I5 a2 e7 q# W
迁移流程为: ACTING[0,1] —> UP[3,4] 尽量选取UP 为新加入的osd进行迁移。
$ m5 h! S' M/ `) R: h/ Z8 O- t; ^! C( v) x( v9 z9 W: T
尽量将 ACTING 中存在该osd 的pg进行优先迁移,同时设置该osd的backfill 为1,相当于加快迁移出去的数据,减慢迁移进来的数据。0 x$ O% S: n' g

' t5 b3 t! Q9 |! b$ mceph pg force-backfill <pg_id>ceph tell <osd.x> injectargs "--osd_max_backfills 1"
, S0 `" S" v! \( l% x1 x8 V5 Y- R! s) q- p; K

; Y6 j) R8 D- D. E, }* V(5)迁移所需时间0 |4 c3 D. u! h$ P

2 h1 ~8 K/ ^( o6 t6 F; f迁移所需时间可通过下面脚本进行大致评估,ceph版本不同可能截取需要数据位置不同,需适当更改下脚本。0 E( `4 W* i1 Y* s1 `1 x
$ w" m% n8 p! C
#! /bin/sh3 N8 R7 @; ?. y" N- ^. Q
while ( 2>1 ). C# [9 D0 a  i* p
do& C  _$ \3 F' b9 z2 `9 z" u
start=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`
- L2 P" N9 y. s5 ssleep 5
5 `0 x5 i* c/ I& Z; gend=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`# s6 X) T: W" F
speed=$((start-end))
! P2 j' p! ^6 [3 h, C7 w#echo $end
  Y7 {6 c3 D1 I#echo $speed% Z7 u6 T+ v* B/ v/ W1 T
second=$((end/speed*5))
& Q$ I7 K+ J) d# }% S( Zhour=$(( $second/3600 ))' i( N2 o/ ~7 U1 V% ?' L) @
min=$(( ($second-${hour}*3600)/60 ))& O1 V0 M+ K) M3 z- n6 J
sec=$(( $second-${hour}*3600-${min}*60 ))& \# {) w% I+ u4 `
echo 当前时间:`date`6 a* G/ @2 V7 W( V6 y# }- Z
echo 迁移剩余:$end
# E. W$ _# ]/ o8 Techo 迁移速度:$((speed/5))
' A9 U* N) a8 s& x% \( h: |- z/ r: Cecho 迁移还需要:${hour}小时${min}分${sec}秒
& B: x  K" i. ]/ w3 mecho "-------------------------------------"2 Z3 v9 `$ E3 s( m$ `) Y% E# F; ]
done) Y! `- P4 o3 O7 X! T
0 i& `+ i3 i9 d3 x! C$ z7 P  ^
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2023-2-1 01:54 , Processed in 0.049866 second(s), 22 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

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