|
|
一、扩容条件) q' k8 J$ Q" b* E. y2 {
a. 一般可用容量达到70%,就要开始考虑进行物理扩容,部分由于部署不合理导致的问题,可通过调节pg和weight进行调整。
x3 z4 W3 U2 f7 x) n
5 z! |3 x# }; sb. 扩容时需尽可能的评估当前业务规模,因为当集群达到一定规模后,累计的数据量是十分巨大的,所以尽可能的减少迁移操作。" G3 R* Z% X' l6 Y* M! @
6 u# R; I3 H. n7 rc. 通过 ceph df 查看 %USED 是否已经达到70%,并通过ceph osd df 查看osd 使用率最高的和最低的使用率。 %USED 是按照使用率最高的osd算出来的,而ceph在一个osd满的情况下(阈值一般为0.95,告警为0.85),集群就不可用了。5 `0 `. r: [( t+ w8 q+ L
5 ?4 b( P, l# Y/ S( `例如,通过 ceph osd df | sort -k 8 查看到最低osd使用率40%,最高osd使用率为72%,误差32,这种情况很可能就是osd之间数据不均衡。: f9 Y, `! i5 _ Z. e. S6 @9 v
& C' E1 S! r. d$ y: G' l# o3 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的显示,随着业务持续写入,很快就接近阈值,导致集群空间的浪费。
" V) j6 J& ]; q+ {2 p' B i+ W7 c: a$ v8 E) X. S" _: o' d
此时,应该调整池pg分布的均衡或者调节部分峰值的osd。6 w- i/ `- N3 I8 k$ E$ Z
% \# X+ n1 O& [, v' le. 若pg分布均衡且数据分布均衡,则考虑 物理扩容 。9 k7 m7 M2 A; q. {! d( ~
5 u4 I0 f* g9 L, _8 r9 x
二、扩容流程
, H) U( l9 D* d1 f* c: w; Y' |, ^扩容的过程主要是添加osd的过程,添加完osd后,还需看情况是否调节pg,具体可查看文档后面 计算需要调节pg9 b6 l5 s. T# L; K. P! Z+ m
$ Z6 F/ N* j0 y0 B P' G
扩容过程主要分为4步(文档有具体描述):
! i# U: f; }1 m& u. |- N3 A3 x W
. ^; O) g8 O: C" M5 T b( j(1)业务规模的评估
# D" u. ]- L( E) y! }: T# c
: x: i# h, C r+ b- @(2)扩容前的准备工作(包括环境的检查,pg数的计算,pg分布的统计)
5 a7 Z6 q8 H0 `' P
5 b+ E% z' F' F0 n1 Q6 i6 ^' V! U1 z(3)扩容过程中的故障处理(mon、osd进程故障,pg状态异常故障); I! o& } S1 w* Z- p
# C G9 P9 P5 i' [ p
(4)扩容完的收尾动作(统计pg的分布图,调节迁移的速度等)6 S! ^9 p* }& D8 C' h0 p( r( L6 ^
" z6 @& J' s! G4 y扩容时候出现的故障主要从 现网组网 系统 集群 进程的这几个维度进行排查# ?9 C. c- F/ X+ @, y8 S( i
+ g: E" I+ I9 `( Z. } \9 b( v# M例如出现mon down时候,可通过mon进程所提示的err进行定位,从而转到集群的规模是否部分参数未放开限制,再到系统的内存不足或者网口负载太高,需调节系统参数,再到组网环境搭建进行排查,如交换机环路等。
) K9 u {3 X* \2 g5 @9 l# ^
& e2 U% N6 ~+ |6 X, B' @+ n' ^(1)由于pg不均衡或者weight权重不相等的,可以通过调节osd的pg数,或者 weight值进行初步腾出容量。
% p3 m( D! I' o4 @/ Z8 L# 调节osd weight值- a- t7 z' [* x
ceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>- U9 v9 e: X4 R3 x. O
$ g0 i8 [- L. ^( ^) u- a( Q% M/ \" S3 Z
# 调节pg数目/ [/ m" d: y! n: H N
ceph osd pool set <poolname> pg_num|pgp_num <int> #int为最接近2的幂次方
* O" |4 G6 U6 b6 z% b4 R4 D若是由于池的pg不均衡导致,采用ceph balancer进行调整 z4 K& Z* S! X, c
; Z; |" r2 G" p) b1 p# 查看集群得分) l! B4 }$ w# R' g& |0 {* |3 J
ceph balancer eval3 H, t% z8 V( R
' D# D. `/ c7 l$ x' s
6 N( H. C {2 m
# 设置均衡策略(crush-compat)
* @0 Q- @9 E, \7 j1 r2 Nceph balancer mode <upmap/crush-compat/none>2 d) a/ a" R4 J* a; s3 s$ L/ b
None:表示什么都不做8 T1 m, x2 a% j8 M! h
Upmap:通过重新映射pg来平衡pg Z0 j& Q# j/ T# Z
crush-compat: 通过重新设置osd的weight值触发pg的重新分布
3 I" Y4 F& D; J4 G( s! a
0 C+ {% \8 N/ |2 N) l% l
& r: P1 e8 r( l$ I( p+ G7 E# 设置均衡任务1 H, E3 e* O% Z4 m0 v. J- Z1 o
ceph balancer optimize tune <pool_name>
7 X7 l) \0 _/ kceph balancer execute tune+ P: t, I- C" m) K- p1 b
' \$ ~, l6 B; ~
; O$ D4 K$ W; I! W' T$ U# 这时,在查看集群得分8 S0 I0 M" o* u
ceph balancer eval
0 e R/ X3 ^- v1 G: c6 f! g! T4 D2 o(2)通过增加osd进行物理扩容 D% L; N% ^" P% ]4 v/ s, f1 t8 b( T
处理流程可在web上操作,这里提供添加osd的命令
1 {1 }/ l0 a1 ?" }7 f
$ P* M/ J, E) s: ?# bluestore:
" y9 Z; O+ O7 r* n5 Kceph-deploy --overwrite-conf osd create node66 --data /dev/sdb --block-db /dev/sdd2 --block-wal /dev/sdd1% p3 o' q( W% s7 J* ^. f& h7 g. b
ceph-deploy --overwrite-conf osd create node66 --data /dev/sdc --block-db /dev/sde2 --block-wal /dev/sde1
) K$ w1 C' i p, S" a7 |2 L...8 f t0 I: e$ g# o4 S+ ^/ Y- {# q
& J3 @; u0 d( o% n* ?6 U, t
/ E" S) i; M/ J4 y: d9 o
# filestore
6 y, u% ]. L- rceph-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+ }* h9 S1 @0 y s( ]
(3)扩容后,看情况是否需要增加pg,或者均衡池pg。pg均衡情况可通过脚本《pg均衡查询脚本》查看,脚本可私信获取。
4 R5 G& v \4 h* C* A5 W$ dpg的计算公式:
- _. g2 h: m* Q1 B; h& [5 n$ z
( K& o5 u) X+ Q6 n1、输出的值取舍到最接近的2的幂(最接近的2的幂提供了CRUSH算法效率的少量提高). C$ _3 _6 p! z6 Z( F8 `
0 s+ Z+ m0 K7 G1 B/ S1 ^# L2、如果最接近的2的幂比原始值低25%以上,则使用下一个更高的2的幂
* U; F2 R |5 P3 z: ]3 v! Z6 h) O/ c
3、每个osd pg数目,建议值:
- V- K4 A- A3 \, ~, k' l5 g* M; M5 ?3 \/ d
% S9 z+ M9 E9 j100 如果在可预见的将来,群集OSD的数量预计不会增加。1 U) T: P) v. n$ \+ e+ S0 _
3 S! C/ h$ I& j P- M
200 如果在可预见的将来,群集OSD的数量预计会增加(最多增加一倍)。- N% d+ u9 B$ w
2 `$ R3 e3 ?! s% I, j8 F! B% j算法:
+ D6 G( ] g9 j7 t% M# B7 @3 h" B
* Z8 b% E- w; m5 o+ M(每个OSD的目标PG)x(OSd总数)x(数据量百分比)/ (副本数)
) ?; J4 r7 s: N% y! q' z
% L+ c( O' A; A. Tps:
# M9 V' Q% g g
) a% q* G# D) S6 i7 k8 w9 m如果以上计算的值小于(osd总数)/(副本数)的值,则该值将更新为(osd总数)/(副本数)的值。这是通过为每个池为每个OSD分配至少一个主或辅助PG来确保均匀的负载/数据分配
5 `( B: q* t$ b' s+ R s5 ^. }/ E9 x: T2 P
数据量(普通生产环境):9 W6 L3 {+ F, l
' `" w# y) {. s9 R. C
项 .rgw.root rgw.control rgw.meta rgw.log rgw.buckets.index rgw.buckets.data rgw.buckets.non-ec
+ D6 ^- O/ q. k# ?1 ~数据量占用率(%) 0.2 0.1 0.3 0.6 1 94.8 3
% ]8 u# g' P4 @三、扩容期间
8 _$ V9 U. o- ]# J+ I9 q) f$ v(1)观察pg的状态(相关故障处理可根据《pg异常处理》处理)
* H* n/ O% C& ?- E$ W9 zPeering
% w0 R8 Y& g. j9 W8 Fpeering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致
2 k1 a$ f i. j. ~; R
9 ^, `9 _2 P' O' RRemapped7 A( U3 s& C7 p7 q) L0 C1 o0 T) P
当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped% t0 z- \ t3 }& a, }9 x+ X) f
! m/ w0 C6 Y( ?/ g1 iBackfills
# ]/ T1 U" o6 W, B3 @$ q- N( i当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling
% b" E0 O9 `5 x9 A8 O
$ L9 W1 b1 R% H) d0 X4 f% jRecovering4 |! N& P! f; K( F' q5 o* Y
当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容' a: }9 v# H+ \0 |- n& f/ } t m
必须更新到当前状态,处于此过程中的PG状态便是recovering5 y& Z, D& k( f7 h
9 g1 K1 Y/ Y6 y! |! _Degraded% v0 `" {; L1 E8 Q& s C
当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:
- u% [' R! S+ ^3 Z1 r$ `6 ]( J& h+ ]# J. H
在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。
0 d7 t* w/ Z1 |0 g& @0 U. s4 m- \5 }2 G& ^2 N
当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object5 \3 o" b4 `: O6 V
2 j& b' a( K, O
Active
9 ~6 }8 [$ [: E1 C$ D% F+ ?处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作
( w& ~3 n2 z0 C2 ]5 C
/ g1 C3 W8 s9 C8 s/ s$ Q: CClean
6 C6 P0 e" n8 K& ?' K3 e当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作. E: B8 y$ o) W
* R, Z& l7 v; i) r& |& u
0 H! |0 _4 H% o4 x. D* K
9 H2 R# s8 F- h9 Q) K
(2)迁移参数调整# E' @* [: k! d( n) L2 A
& s6 _$ _! K( G2 [# c, `1 s @数据的迁移的相关参数,可根据业务数据流量的时间分布,进行适当的调整,加快迁移:
: [" I4 R# @' f! }) a; `0 k/ R
" B- f* r3 B3 p) r, W0 N$ H5 {这个值存在平衡点:具体可看:https://blog.csdn.net/tony_vip/article/details/100122104
2 L6 l2 C9 C" N3 o- \6 s1 S
) v- T* H& H' B! f! p% |/ q! A思科参考值,具体视集群情况而定
, B. P" R- w& O' y+ g9 ?osd recovery max active = 3 (default : 15)
2 ]2 P' y4 h. _5 Z- sosd recovery op priority = 3 (default : 10)
- ]" B# M9 J7 S$ ?1 N1 k& gosd max backfills = 1 (default : 10), _, U( ?3 u4 ]. R* v; i# Y* |6 Q
* f( U' _. L2 X! p
2 w% p3 A3 y( T$ R! s
参数注意事项:
5 g! t+ q. U9 A# q. dosd max backfills设置为10时,假如一个pg 50G数据 需要迁移10个,那么基本是迁移500G左右的数据的时候开始删除而
% W0 G( P! l5 fbackfill为1的时候,就是迁移50G,开始删除一个,迁移50G删除一个,加大backfill反而阻碍了空间的释放。* ~7 D9 Z- T s) n" W r+ G+ r( [
& d+ X4 m0 z* ?: Y. q3 {% z& z7 m% G# B. l1 v. Q/ X2 V
osd_recovery_sleep = 0 在luminous版本已经设置成ssd是0,sata变成0.1,相当于增加了一个延时的过程+ l' }9 h# x; W- X' h) f$ {
0 b9 }+ w$ D$ [# T
/ O" ?; f$ Q4 ]; i(3)slow request' R6 i2 t2 b7 w7 H Z: @' l
% i3 v4 z, Y+ l% |! a$ A若迁移过程中出现slow request的情况,一般为集群过载了。主要可能有以下原因导致。
7 h4 Q" D! A3 e8 i' m' r0 H1 q! e* Z$ I9 n
a. 池的pg数太少,导致某个池阻塞osd的情况- I. r5 u" R2 r/ W. r8 z* f
/ |! ] {6 R6 r9 l0 A通过mon log日志,获取到阻塞osd的信息:
3 U. Z+ V' ~- R. h# h; c* a; s+ _! @7 m5 R o3 Y- Z
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: T1 I. t+ j% \# z2 M
这里可以看到osd.3阻塞了,pg序号为7.1a,查看对应的池(ceph df):
4 \8 O2 `6 ]3 n- X9 @9 g6 J {3 s! z! Q8 J' j) e, L. N8 O
可查看到是default.rgw.log,在查看对应pg数目:
1 d9 [7 A' d/ i, @
' p5 z& |# m7 B0 V/ ~( Q+ g# t0 b: hceph pg dump pgs|grep ^7.|awk '{print $1,$2}'- y; s+ D1 z% Z0 O9 R; m) t$ z
环境上有80个osd,而pg只有32个,均摊到每个osd,平均一个都没有,并没有充分散列,假如维持单个osd承载10个相关pg,那么计算下来:
- b1 u! l. E4 [9 j/ Y1 j) b: h m* m- \/ d2 t! ^
10*80/2=400 取最接近幂是512
7 A0 D% w/ `+ |) o" I
, S3 D5 {- x( S0 @512*2/80=12.8 K% I+ c7 `. U$ t1 |( g
: s. f% q% W0 y- Q, d! |! ^ |平均每个osd上的为12.8个相关的pg,因为对象是207个,平坦下去每个pg只需要承担一个对象,平均每个osd承担不到3个对象,比现在的设置情况要好很多
8 f; X3 M( k$ Z
+ u6 A, K) P$ O6 B) y
# z+ l. R, T1 s9 P
) _, v9 A$ D* ?/ L% u0 Rb. 业务在某段时间突然触发增长
& C3 c( s# r( H4 V- F0 l' o4 A1 T( z' P: v
例如项目在凌晨12点时,业务方进行批量删除过期文件的操作,这无疑增加扩容时候的压力,而且其中穿插着设备的批量遍历操作和ceph生命周期操作。
6 c+ u. B6 V6 e G" h& U* d" [. ]4 f" Q* J+ n7 R
故可结合现场环境进行调节:
$ x' L$ l9 T; H/ ^& v J- g+ v8 \1 j( o, B1 r6 t- I
a. 将ceph生命周期的迁移时间设置为:01:00 - 23:00,避开峰值时间段
. H' P! [5 q6 @& m0 C/ @; }
V& `' B- l/ prgw_lifecycle_work_time = 01:00-23:00* E$ P: c+ @* m% D& F! C' q
b. 降低backfill修复对磁盘的压力" I2 N2 ?) N% ~+ _
; t9 k, ^$ S" o8 F' Cceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.5, f4 f! ?& J0 r* p
#默认为0.1# 效果recovery: 16.1MiB/s, 6objects/s
- T9 K1 E" p2 P( V" F4 h7 e1 d! \: |) E
7 ?2 R: G- e6 y7 ^5 A
ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.1" B4 ]! {9 x) P0 o# l
# 效果recovery: 82.1MiB/s, 32objects/s5 Q* G) y. H0 Q2 _: C. b
c. 将池后端使用SSD代替
, Z6 [8 a) q7 _4 C; `$ U" [
' u; q" ~2 s& E' X0 R' |& W若集群osd数目不能抗住大量元数据的操作,可将池使用SSD进行代替,缓解SSD的更新的时延,加大并发量。- w5 o2 _; p. j+ Z h. Q
7 F7 C) e# E- a4 p
- J5 i5 l; V5 \6 F Z9 a
0 M! B3 e& }! ?, f# ?3 b# r$ h(4)盘容量接近阈值
& A- i7 I$ u" A9 L
& {2 m3 I* }+ @4 E$ G* N5 F若存在扩容不及时,导致osd的容量还未释放,逐渐逼近设置盘满的阈值0.95,此时需手动操作,将阈值高的osd进行优先迁移。. z9 A/ S5 w3 ?- N% j/ l K. j
0 `! }; L0 r9 ^ F w% T* E# r9 Y- J# 查看满盘osd 所需迁移的pg: i7 Z: v p, V6 }) [: B
ceph pg dump pgs | grep <osd.x> | grep backfill_wait
! Q+ o: V: q, U, s2 Q- |主要看UP 和 ACTING 列,可通过awk 过滤出来。
" a4 N/ d7 Z' S. D' m! i9 m
; T; n, j1 @. H4 b4 a迁移流程为: ACTING[0,1] —> UP[3,4] 尽量选取UP 为新加入的osd进行迁移。
% L/ X2 p7 Q9 V; y( U7 e" K; T% q* H1 Z* m" k0 P
尽量将 ACTING 中存在该osd 的pg进行优先迁移,同时设置该osd的backfill 为1,相当于加快迁移出去的数据,减慢迁移进来的数据。
3 T. `6 R5 O4 b- [* u* _4 g- C% o5 V
ceph pg force-backfill <pg_id>ceph tell <osd.x> injectargs "--osd_max_backfills 1"
& z7 h& ~+ F* d
9 g+ j5 V. l1 } I, m/ O, P$ M' z5 k5 T; a
(5)迁移所需时间
8 _% Y J7 T4 D" \& o: I& k4 o
# c( P+ J9 l2 X- J迁移所需时间可通过下面脚本进行大致评估,ceph版本不同可能截取需要数据位置不同,需适当更改下脚本。
" G8 {, U6 O2 F9 |9 `" y* A& Q7 ~# N4 @6 t
#! /bin/sh0 d: S: j- O, X6 g* l
while ( 2>1 )! p4 C1 k' e, O9 j- v2 _/ Z% `& }
do
9 S4 ~; g" M; F. [3 o. Mstart=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`/ j/ o2 C2 t4 L' v3 P* D
sleep 59 ?$ f' A1 P0 A) F# Q8 w
end=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`
4 |- {) U) h( H. g0 r6 r0 _speed=$((start-end))
, t, j$ I. X2 z& m B% c4 s#echo $end
1 [+ c; @# I( J+ C. _: l( n1 a, C#echo $speed
% p# a$ X" z% G" I# {2 e0 a% Dsecond=$((end/speed*5))# g" _ w0 L/ ^: E
hour=$(( $second/3600 ))
$ V7 v7 ^2 T% U7 P/ b; jmin=$(( ($second-${hour}*3600)/60 ))0 D7 k4 A' K; b4 Y* \! I$ r
sec=$(( $second-${hour}*3600-${min}*60 )) W% B$ t: r: V/ u
echo 当前时间:`date`& r/ g( U" N/ M* O
echo 迁移剩余:$end
0 d, [. N& m& j! ^echo 迁移速度:$((speed/5))
! c1 N# r8 `7 }+ U- Y% Techo 迁移还需要:${hour}小时${min}分${sec}秒6 k8 ~4 Z6 E5 x4 O% y) l4 ]
echo "-------------------------------------"! u- T% \: o: a5 J3 p1 |5 E3 p
done+ C+ n4 y* U7 ^2 ?/ z- h+ Y0 {: L
# t4 b! D1 i" G' Z( @7 j+ O
|
|