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

ceph分布式扩容注意事项

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-1-16 13:00:30 | 显示全部楼层 |阅读模式
一、扩容条件
* [( m) R" ^9 oa. 一般可用容量达到70%,就要开始考虑进行物理扩容,部分由于部署不合理导致的问题,可通过调节pg和weight进行调整。/ g8 R6 {1 q/ U. f6 T. ^
  H( P6 @5 ~4 E6 ~9 I+ S' x
b. 扩容时需尽可能的评估当前业务规模,因为当集群达到一定规模后,累计的数据量是十分巨大的,所以尽可能的减少迁移操作。, W, O& F, B# \5 x5 O
' z0 g0 S( Y, l0 i7 u' c7 G
c. 通过 ceph df 查看 %USED 是否已经达到70%,并通过ceph osd df 查看osd 使用率最高的和最低的使用率。 %USED 是按照使用率最高的osd算出来的,而ceph在一个osd满的情况下(阈值一般为0.95,告警为0.85),集群就不可用了。
* i% l) T# ]. R: H3 z' p3 G2 J% o+ H+ p9 S; N/ e
例如,通过 ceph osd df | sort -k 8 查看到最低osd使用率40%,最高osd使用率为72%,误差32,这种情况很可能就是osd之间数据不均衡。( p' B$ H. k" o  m* {& {

- P5 c& T# H5 l; r. C2 g2 id. 导出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的显示,随着业务持续写入,很快就接近阈值,导致集群空间的浪费。
. `! d' ?/ i/ ~+ v" ^
7 p! V' c  S, l6 _2 d' N此时,应该调整池pg分布的均衡或者调节部分峰值的osd。
2 d9 Y/ `& g. y+ s
4 ^% G8 r( ?  @/ v* z$ Q* se. 若pg分布均衡且数据分布均衡,则考虑 物理扩容 。
7 K, S& b: e$ C. M6 \! }) i3 z5 X. V8 O7 V" Q
二、扩容流程
5 s- Q$ ~5 @$ Z3 S, g扩容的过程主要是添加osd的过程,添加完osd后,还需看情况是否调节pg,具体可查看文档后面 计算需要调节pg
: f! T4 t7 A. ]9 d$ J
5 z, Y6 Y. Q% K0 E* I6 s. w扩容过程主要分为4步(文档有具体描述):
: l: P1 l0 Q% J! R
% L$ F; s! e9 Q(1)业务规模的评估$ G+ }5 _0 z" O8 |

1 v# a3 A5 n/ t6 a0 s* E& n4 y7 @, [(2)扩容前的准备工作(包括环境的检查,pg数的计算,pg分布的统计)
' d0 }3 X" ~- y- p# a3 A# g( _9 W
" K. a  L; t6 W: L9 Y& M: M(3)扩容过程中的故障处理(mon、osd进程故障,pg状态异常故障)
5 n1 ]+ v9 _  b9 w) U7 i0 I7 n  \# v. m8 R. K- D2 M& R' ^: {
(4)扩容完的收尾动作(统计pg的分布图,调节迁移的速度等)
/ k4 j4 X* R6 |/ Z8 U- e. G. G2 K! [7 w4 Y# ?) m) l" O
扩容时候出现的故障主要从 现网组网 系统 集群 进程的这几个维度进行排查
/ \! e$ m' t2 Q" i+ N+ J
* e( N: F9 J4 v例如出现mon down时候,可通过mon进程所提示的err进行定位,从而转到集群的规模是否部分参数未放开限制,再到系统的内存不足或者网口负载太高,需调节系统参数,再到组网环境搭建进行排查,如交换机环路等。9 d5 u0 r" f# a

1 `0 i6 {; b8 |(1)由于pg不均衡或者weight权重不相等的,可以通过调节osd的pg数,或者 weight值进行初步腾出容量。
" g$ z, S8 r4 _$ ]; s* F* l# 调节osd weight值4 N: ?, K8 l' F& }' W9 e
ceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>
5 a9 R! i, N3 f% y% }+ D4 f
. b0 Y; R6 |9 z7 }% i) \& ~
& D6 o: l( D. k4 y& _8 X8 r# 调节pg数目
/ U% s2 Y0 M- [9 |+ S. }4 y$ A8 Wceph osd pool set <poolname> pg_num|pgp_num <int> #int为最接近2的幂次方
( D7 \% @3 ?1 c4 d. z4 W4 }  p若是由于池的pg不均衡导致,采用ceph balancer进行调整
5 E2 G# r% _8 L: Z6 L: N) ]
) n3 _$ Q7 M0 v3 O6 z# 查看集群得分' A4 A7 W8 ^+ N3 Q6 ]9 D+ z" G/ {% j+ a
ceph balancer eval# h0 r( ?$ L; A
3 s5 E! Z  P0 u9 _! L0 \8 n
5 a! l- f# t) w6 j3 S
# 设置均衡策略(crush-compat)- S' Z0 Y6 [5 x
ceph balancer mode <upmap/crush-compat/none>
- t/ s  H: s: D3 J) P8 qNone:表示什么都不做9 v- ]3 n8 N3 f
Upmap:通过重新映射pg来平衡pg
  U" N( A) T& o5 P% Fcrush-compat: 通过重新设置osd的weight值触发pg的重新分布
! Y, F* C$ h3 f, T% R8 g
9 H" {5 ?7 g$ l" h9 `# v7 B) W( {% a( U' ~
# 设置均衡任务3 Z" l* _' k; m1 r
ceph balancer optimize tune <pool_name>
- O& k1 b+ M" d6 V3 ^ceph balancer execute tune
0 \. N7 o( m$ l3 a3 s" U3 m2 X* f1 m+ s1 ^: @0 Y

9 P7 x5 Z' p: q0 p8 b  b1 u# 这时,在查看集群得分+ W1 U1 V4 I9 t' U: I0 _
ceph balancer eval1 X. g7 O' w; R7 n* l9 J
(2)通过增加osd进行物理扩容
& L( {- E5 H& @5 L( K处理流程可在web上操作,这里提供添加osd的命令
3 ^+ ^# f! M) i* O/ i* I8 }0 o3 y
# bluestore:
7 O/ F+ m3 r7 Q" c/ _  b1 }9 [ceph-deploy --overwrite-conf osd create node66 --data /dev/sdb --block-db /dev/sdd2 --block-wal /dev/sdd1: }+ c- O4 J0 B$ e0 Q6 z$ ]' G" C
ceph-deploy --overwrite-conf osd create node66 --data /dev/sdc --block-db /dev/sde2 --block-wal /dev/sde1
7 G0 y7 }  T9 z0 N6 u; ~5 J# R..., b1 ^5 c+ C. A% u) A
7 L6 S5 g6 D2 i5 i0 p2 ^! ?

& W% d: N: q# i8 x# filestore/ s- D- s8 T0 m" E9 K! o
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
2 R" m; w4 F. I0 R2 X8 \- N(3)扩容后,看情况是否需要增加pg,或者均衡池pg。pg均衡情况可通过脚本《pg均衡查询脚本》查看,脚本可私信获取。, t; R9 a# G/ N2 ?3 l8 W
pg的计算公式:
5 J# K: |/ l4 u7 Z" W' i- M/ P8 f: v" c, A. c, B0 x; h; f
1、输出的值取舍到最接近的2的幂(最接近的2的幂提供了CRUSH算法效率的少量提高)
- q  x8 v$ d% T, a: @2 Z
4 w9 Y$ D" Q8 n2 h5 Y+ D! H$ M2、如果最接近的2的幂比原始值低25%以上,则使用下一个更高的2的幂
0 c) S- \) j1 r  m" _/ b/ Y3 K, L: h! d4 q" b: l" ]* O
3、每个osd pg数目,建议值:+ a# n; f/ d4 [5 J: \2 e

( M/ A' Q7 h# H/ L; h100 如果在可预见的将来,群集OSD的数量预计不会增加。
4 U( W; R+ C% R+ b6 i  r3 T5 K9 u- ?- d! O; U+ u+ h
200 如果在可预见的将来,群集OSD的数量预计会增加(最多增加一倍)。
  Z9 D. y3 f! w; i5 t/ I/ h2 ?; C
5 U3 @$ U$ A2 \7 D4 v  Y算法:
! _' B: H! W- ]* g. A
7 h) z4 }1 r3 R5 R' W2 Y4 R(每个OSD的目标PG)x(OSd总数)x(数据量百分比)/ (副本数)$ F  J9 U- P* }: \

1 V* H  J$ e9 h; `# G4 }* n5 Nps:
* @% {8 x2 w' l+ U+ J: m7 d( z& S
如果以上计算的值小于(osd总数)/(副本数)的值,则该值将更新为(osd总数)/(副本数)的值。这是通过为每个池为每个OSD分配至少一个主或辅助PG来确保均匀的负载/数据分配
5 v% J: Z4 _7 ?  _/ A0 m: U: D5 z; v' X3 H
数据量(普通生产环境):9 C, y7 M% [8 I3 V5 o+ f, G/ ?

; W; p8 Q( E; ^: K' ]$ h项        .rgw.root        rgw.control        rgw.meta        rgw.log        rgw.buckets.index        rgw.buckets.data        rgw.buckets.non-ec
/ D9 U( B! a( \数据量占用率(%)        0.2        0.1        0.3        0.6        1        94.8        3
/ k& c- T! i/ Q三、扩容期间1 P8 _0 v7 v0 k4 d" l! r
(1)观察pg的状态(相关故障处理可根据《pg异常处理》处理)
9 E1 _: L- n3 B8 iPeering( H/ G  _. r5 X6 @& ]: }
peering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致
6 N$ p/ a2 g% v) P; X5 M" G8 E
: e9 P) j! ]9 l  J+ L. \6 N( _Remapped; D, Y1 x- _( i! a$ K9 C
当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped  m; m2 t0 ]" a) F# w( y% E! i

, V7 G& h( Q+ E8 N( l9 @- Y2 E# ZBackfills1 \7 m( v! C4 y9 H! x6 [- ^9 S
当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling4 M9 M+ c" u) F6 ]4 b  ^

$ m; Q: _+ I+ R# t% ]+ U* }- q. k. oRecovering
- a4 I! D9 f' L当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容8 W) Z1 l! I/ b* A8 `9 U) W
必须更新到当前状态,处于此过程中的PG状态便是recovering
; d+ b7 J5 B$ Y  _$ o3 k' l9 z
$ X4 n) w# F  a; p; o, p% h% QDegraded4 A9 H- P6 Z# {0 P3 ]1 f0 i
当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:. f& Z  O$ S3 O

2 m; h1 @( Z8 p2 T3 d' W/ a在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。
0 i3 B: `9 @8 [/ P: I5 p) j( C5 N2 }  `1 L! G2 a7 n' s4 L8 M
当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object
! k+ X) X& _- k" v8 o+ b  T8 H. W3 D% X
$ s6 w0 p8 p& n1 j3 _Active
, v' G. c# z) s  F处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作
; r' L. k9 k4 F1 v% x' D/ r! m# b0 N' }- [% L
Clean; M4 r: \3 I  w0 K
当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作
; M+ B$ r' h3 X. b$ F/ i
: e8 }: ~  M# W( t2 V% N# i
& q8 u& @1 u( V$ e- W: @
" |1 i  H$ I: c- u% ^(2)迁移参数调整
' p& E: U" y% u% U# p" q0 f
5 ?' g* {+ ~; _$ f; I1 D数据的迁移的相关参数,可根据业务数据流量的时间分布,进行适当的调整,加快迁移:) c/ R( }. |7 T
) q, j+ E- W+ C6 \  ^: m1 _! J& r7 b& i
这个值存在平衡点:具体可看:https://blog.csdn.net/tony_vip/article/details/100122104$ {; y, ]2 E) U6 U- `: ]2 ^
$ e" h3 ~9 U% I- V% I; K
思科参考值,具体视集群情况而定
- k/ p5 ]+ w& Y& X! Qosd recovery max active = 3 (default : 15)
" d) X: j2 Y& i2 S3 {, \+ vosd recovery op priority = 3 (default : 10)
1 b/ z- W  a6 @- i, ?! O% l" kosd max backfills = 1 (default : 10)4 h$ A6 x: t) o! H

2 \; J6 Y2 I0 g0 B- ^! x6 D/ E# m# l; j. v; K+ k: x8 T1 W- L7 N4 n
参数注意事项:) J/ ^- p" c( p' v' Y# j
osd max backfills设置为10时,假如一个pg 50G数据 需要迁移10个,那么基本是迁移500G左右的数据的时候开始删除而
% W: w: ?3 j1 m3 v, g; wbackfill为1的时候,就是迁移50G,开始删除一个,迁移50G删除一个,加大backfill反而阻碍了空间的释放。/ K' i8 y9 t# V2 q5 T/ Q0 h
7 c9 ]5 [" z4 o' D" T

7 i/ s( n* y. b7 B; E. t1 Qosd_recovery_sleep = 0 在luminous版本已经设置成ssd是0,sata变成0.1,相当于增加了一个延时的过程
1 a* a6 \7 l& z( n9 q' Y! q1 e. U, q) n/ p  W4 b# @

+ h: \' g/ h. n- m4 `9 a(3)slow request
# y  V1 V" B' C1 b$ X  d
$ Q  ~3 F/ p0 W4 L$ u, B' o" U若迁移过程中出现slow request的情况,一般为集群过载了。主要可能有以下原因导致。
  z. v/ {8 O' e7 J2 ?3 U* b4 n' y3 p, w1 x5 u& ~
a. 池的pg数太少,导致某个池阻塞osd的情况
& I& t3 B  M. K$ A& c3 \. Y4 K4 Z2 [( h/ v) Y
通过mon log日志,获取到阻塞osd的信息:
! I9 {0 k& o" L5 h# V1 ]- r  }) r3 x
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:5905 o! l2 ]; y  B* K1 n" j2 x8 A
这里可以看到osd.3阻塞了,pg序号为7.1a,查看对应的池(ceph df):
. D4 t' M2 V. C+ A/ R. X7 m) e4 @2 m' g1 x4 e
可查看到是default.rgw.log,在查看对应pg数目:% r, B9 S" r9 i/ e

  A* w  i5 T/ U+ L: e* L& p4 [ceph pg dump pgs|grep ^7.|awk '{print $1,$2}'. y' `: t( ~- ]1 a- h7 D9 H
环境上有80个osd,而pg只有32个,均摊到每个osd,平均一个都没有,并没有充分散列,假如维持单个osd承载10个相关pg,那么计算下来:% z# u1 g9 m. o
+ O) u) \! P+ T+ y& w9 F& p3 p
10*80/2=400 取最接近幂是512
1 E& K" G. X- \
5 T7 Z& G$ u5 G) w2 ^, B512*2/80=12.8
6 W, m+ S  _( w7 R. A: S4 }- ]  n( _4 f0 V! Z' P
平均每个osd上的为12.8个相关的pg,因为对象是207个,平坦下去每个pg只需要承担一个对象,平均每个osd承担不到3个对象,比现在的设置情况要好很多
. X7 M1 q! e' o- e4 _! K8 y3 @& P; S3 y3 [& Q2 l

9 C0 X$ L$ f6 c+ A# W
1 u( F" X) c7 r& F$ t* f0 Z7 Tb. 业务在某段时间突然触发增长
+ A" p# i( v/ U1 E/ U8 p/ h# s
/ P$ U5 j0 \) `例如项目在凌晨12点时,业务方进行批量删除过期文件的操作,这无疑增加扩容时候的压力,而且其中穿插着设备的批量遍历操作和ceph生命周期操作。
7 q% r9 o) q( |. x3 E# a( ^+ v5 c  p
6 C( H% `) u3 H  W, B( v, ~故可结合现场环境进行调节:; G6 e* y9 X  W; Y
2 n2 W/ t7 N$ G) M
a. 将ceph生命周期的迁移时间设置为:01:00 - 23:00,避开峰值时间段
! ~* I- r/ ^, {! j9 z. d: V' g  ~
rgw_lifecycle_work_time = 01:00-23:00/ m( P/ o* I- r! u" r
b. 降低backfill修复对磁盘的压力
$ k4 m1 i/ @8 K$ C/ s
: M' ?8 W% ]) q: @! ]ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.57 ?* F! g& Y# g4 X- ^3 K7 l
#默认为0.1# 效果recovery: 16.1MiB/s, 6objects/s8 O* r: d, U! F

9 o9 G0 O( t. c$ }6 V
; X5 J, }, u- ~: K; U% D8 Lceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.10 x7 ?! {" v1 u' D1 ?/ U' b
# 效果recovery: 82.1MiB/s, 32objects/s0 x) v- V3 c. W6 _" x; O. w6 U' a
c. 将池后端使用SSD代替
9 `' X! E: d3 `, D
; f8 }# D6 l$ d. z3 l* k% M若集群osd数目不能抗住大量元数据的操作,可将池使用SSD进行代替,缓解SSD的更新的时延,加大并发量。
2 m& b+ y0 A0 h2 S* o( ^
/ H8 t! n' d' G$ D+ e( W: z
4 `) G* p( y% E' R7 c, Z7 F/ f( h" R9 P: W- K
(4)盘容量接近阈值
/ j0 }6 _8 C% s1 s8 j/ M0 R. t/ U0 q
若存在扩容不及时,导致osd的容量还未释放,逐渐逼近设置盘满的阈值0.95,此时需手动操作,将阈值高的osd进行优先迁移。
; M' t. [: {; t8 u
+ J) l- b7 n( o. R9 I! I# 查看满盘osd 所需迁移的pg) |/ [! N' u' O' ~5 C/ u
ceph pg dump pgs | grep <osd.x> | grep backfill_wait
5 K6 u, w; r  Y6 L( H9 _. u+ p# ^1 U主要看UP 和 ACTING 列,可通过awk 过滤出来。8 i( S5 p0 v" }$ Y
+ H4 H+ m1 _6 m' n
迁移流程为: ACTING[0,1] —> UP[3,4] 尽量选取UP 为新加入的osd进行迁移。
9 V- m) Y$ d6 }' j  h( |  {+ t. S1 c& |* J# E( Z) `
尽量将 ACTING 中存在该osd 的pg进行优先迁移,同时设置该osd的backfill 为1,相当于加快迁移出去的数据,减慢迁移进来的数据。% z) c* P: _8 x) p- T' _3 L

3 j4 g' N' X9 @. }ceph pg force-backfill <pg_id>ceph tell <osd.x> injectargs "--osd_max_backfills 1"
; B6 _$ S5 V7 y3 L' @" D7 J9 ]6 [7 W3 q! o* E$ C; ]% a
" H' p8 X* L3 [; P6 G
(5)迁移所需时间1 o6 l/ u7 e1 m1 J9 k+ F! }
' u' D3 }+ Z6 n9 i6 [
迁移所需时间可通过下面脚本进行大致评估,ceph版本不同可能截取需要数据位置不同,需适当更改下脚本。
; y" D" k  `5 V1 j2 J# V  ?# `- y# C2 Z- l! }+ Y* c
#! /bin/sh
4 I7 u, Q5 P7 \: B7 [7 H0 s9 zwhile ( 2>1 )
( Z/ {4 e/ c! _  O! k& t4 @1 tdo
% X% h* c* {, r( l, Y* @. dstart=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`
$ q& B+ L* s  G" W4 ^sleep 5" @: Y, g8 U6 a6 l+ I4 |8 W+ J
end=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`& @) C. ]8 b) w% T- M3 [
speed=$((start-end))+ C7 B! Z5 R6 Y$ d* U- ]
#echo $end9 g  p# `5 I7 P) e
#echo $speed
, s& R5 {; \* s& isecond=$((end/speed*5))
. \* h" D/ C. l1 H$ o5 z7 [4 a1 Fhour=$(( $second/3600 ))
, r: C  X1 s/ Q9 y$ r' \1 {! M7 F2 rmin=$(( ($second-${hour}*3600)/60 ))+ o. Y- _& N. Y- S2 j4 A
sec=$(( $second-${hour}*3600-${min}*60 ))
0 o# D$ Q  t( Uecho 当前时间:`date`; r# h4 |% t# W
echo 迁移剩余:$end! D: Y: |1 @/ |2 B' u' _
echo 迁移速度:$((speed/5))
% h% X; X/ q, M9 X& w  V5 ~/ Aecho 迁移还需要:${hour}小时${min}分${sec}秒2 w, Y/ P& Q* K
echo "-------------------------------------"/ o% c+ K- k" E/ @
done* O3 X+ l2 j0 @' q
( W; S6 o! G2 q( i% t
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 23:57 , Processed in 0.015901 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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