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

易陆发现论坛

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

ceph分布式扩容注意事项

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

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

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

x
一、扩容条件
- I3 C* v  x% h$ Ba. 一般可用容量达到70%,就要开始考虑进行物理扩容,部分由于部署不合理导致的问题,可通过调节pg和weight进行调整。
7 T! B: h( p: a- f' k/ L: c  C/ b1 |  X; J& F+ \! @' q- e
b. 扩容时需尽可能的评估当前业务规模,因为当集群达到一定规模后,累计的数据量是十分巨大的,所以尽可能的减少迁移操作。
; _8 N* {8 u' ]0 H- C2 d! |2 m* B. s! _8 W: w1 c$ _
c. 通过 ceph df 查看 %USED 是否已经达到70%,并通过ceph osd df 查看osd 使用率最高的和最低的使用率。 %USED 是按照使用率最高的osd算出来的,而ceph在一个osd满的情况下(阈值一般为0.95,告警为0.85),集群就不可用了。( ]! O* v3 X  H% @/ D9 G, t0 J
( Z9 J9 Z0 S- C( K  p2 W: R
例如,通过 ceph osd df | sort -k 8 查看到最低osd使用率40%,最高osd使用率为72%,误差32,这种情况很可能就是osd之间数据不均衡。& G% }( |- O$ P' q! e0 o
: X% j) X. W& F* l& g
d. 导出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的显示,随着业务持续写入,很快就接近阈值,导致集群空间的浪费。! k, Z2 v+ `0 M, _) ~

$ _! U; f$ \, E$ R8 m1 b" C此时,应该调整池pg分布的均衡或者调节部分峰值的osd。
' H/ C& ~0 V" B# O% V; y6 g- M9 T( ]7 v. X
e. 若pg分布均衡且数据分布均衡,则考虑 物理扩容 。) P9 V2 J& E+ [* z0 \- s! H( S
2 }7 P' _7 u% J
二、扩容流程
& u! L7 R6 p% n/ F扩容的过程主要是添加osd的过程,添加完osd后,还需看情况是否调节pg,具体可查看文档后面 计算需要调节pg# X9 U7 h6 @3 b$ U; F6 i

  ~! e1 D) a; i扩容过程主要分为4步(文档有具体描述):/ Y7 k# f& d& ~  f3 {  ?8 B+ \0 u. M

* @6 w- X: O% t8 {(1)业务规模的评估
/ ]; X( B; `; u. Q% C  K; f8 V" p1 c
(2)扩容前的准备工作(包括环境的检查,pg数的计算,pg分布的统计)! S' g% B& \+ ]/ \! R  W
8 {9 u2 `9 i  a6 y8 Z! T6 L7 L
(3)扩容过程中的故障处理(mon、osd进程故障,pg状态异常故障)
! e# I& x7 M, Q, v+ a/ h& f) Y! |! x0 {1 |4 B
(4)扩容完的收尾动作(统计pg的分布图,调节迁移的速度等)
; l5 }, P  Y3 t0 z: ~( T; J" y/ g6 S
扩容时候出现的故障主要从 现网组网 系统 集群 进程的这几个维度进行排查+ O$ s8 N0 `: p! ~: q
' _9 V# d  y" Q% I2 y
例如出现mon down时候,可通过mon进程所提示的err进行定位,从而转到集群的规模是否部分参数未放开限制,再到系统的内存不足或者网口负载太高,需调节系统参数,再到组网环境搭建进行排查,如交换机环路等。
% L' \2 z; y+ B& O" h6 Y) i1 I/ ?% e0 T- o
(1)由于pg不均衡或者weight权重不相等的,可以通过调节osd的pg数,或者 weight值进行初步腾出容量。1 F# r% ^+ A' p9 W$ D0 q! `# {# {
# 调节osd weight值
& c2 }, B* O/ ?7 u4 Sceph osd reweight <osdname (id|osd.id)> <float[0.0-1.0]>; |/ i6 }- K" b3 ]
$ I0 V. _4 q1 N$ v* g) ]0 j0 l: j

& M' Z3 T, ~  D- {- Z  g# 调节pg数目
( }2 o. S, e2 Q" R/ j) vceph osd pool set <poolname> pg_num|pgp_num <int> #int为最接近2的幂次方: P: r5 i7 L, t% z! a
若是由于池的pg不均衡导致,采用ceph balancer进行调整3 j& {, Y3 ?2 }+ m" A; \
2 n+ _2 W% V! T9 E0 m3 w$ _0 |
# 查看集群得分
8 E8 Y* o" a) t* cceph balancer eval7 K) I- L" t7 ^2 z4 p1 T* z  J( h5 v. G
# s& x# ^$ L) s& m+ Z
& C' `5 r+ z8 j3 @' m5 G: U- R: P
# 设置均衡策略(crush-compat)' i+ Y# ^1 X* D% S7 k5 i# y. d
ceph balancer mode <upmap/crush-compat/none>
# M- k" Z& M' O" U8 T1 C. [  {None:表示什么都不做
1 T( b0 P. h, g- I% c5 bUpmap:通过重新映射pg来平衡pg
1 s6 |! M+ \* ~5 t0 lcrush-compat: 通过重新设置osd的weight值触发pg的重新分布8 W9 ?; Q5 z% Q/ u, Q9 y

3 R2 \; k7 I, v4 m5 ]2 s, R2 R- y8 r# b" F6 J/ h; h7 z9 A- E
# 设置均衡任务8 v$ \: m6 N1 V9 {
ceph balancer optimize tune <pool_name>
  L& [0 m# {2 O: K3 g3 y' H$ qceph balancer execute tune& x( ^- L2 K& o9 W! `, q
0 Y* k8 J% q* _: C
6 T8 ?8 E0 {) S0 y3 I
# 这时,在查看集群得分$ ~4 n" |" x2 t' _- o* \
ceph balancer eval2 r8 }: R6 Q2 b) ]1 `
(2)通过增加osd进行物理扩容3 r6 @& p# u4 w. ?# y8 F  X. }/ i/ n
处理流程可在web上操作,这里提供添加osd的命令5 w0 U/ n8 h. M& C1 p+ H; E0 Z
0 u4 m- B1 W! ^5 O! y# C9 d
# bluestore:2 r% \+ ]* M' ^# @+ |# J1 S4 [4 r/ r! G
ceph-deploy --overwrite-conf osd create node66 --data /dev/sdb --block-db /dev/sdd2 --block-wal /dev/sdd15 B: p/ g$ F4 a6 X, p
ceph-deploy --overwrite-conf osd create node66 --data /dev/sdc --block-db /dev/sde2 --block-wal /dev/sde1
% i; C, q5 m& q...
8 e6 z6 w  y/ a" }: I8 _, ~. [7 G7 [, t, V- A
" R6 [; W4 `, l. _
# filestore7 d. S3 Q) B/ q6 b
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 `: ?' x, j2 {+ P2 P(3)扩容后,看情况是否需要增加pg,或者均衡池pg。pg均衡情况可通过脚本《pg均衡查询脚本》查看,脚本可私信获取。
$ [& m4 t6 K9 n& l: W3 ~9 spg的计算公式:( }0 W$ {  l" G' N5 ~% G9 R

6 \* ~+ j( M. T8 v) G: A* U/ H) o3 y1、输出的值取舍到最接近的2的幂(最接近的2的幂提供了CRUSH算法效率的少量提高)7 Q2 k' r' ~# g2 r

8 y7 y1 I1 C2 s2 H6 {, `! c1 g2、如果最接近的2的幂比原始值低25%以上,则使用下一个更高的2的幂
$ z1 I1 L) l8 V8 I( L  s' V3 J! ~5 J+ l* Y. \* R; F  ^
3、每个osd pg数目,建议值:- V# ?7 k- O  q" ]4 ~: X
! t  K" `/ G4 ]& W" q
100 如果在可预见的将来,群集OSD的数量预计不会增加。; T2 B  A# P/ ~! Y4 t1 R" ?

! D3 T1 s4 e2 L, }0 L200 如果在可预见的将来,群集OSD的数量预计会增加(最多增加一倍)。5 i+ g( G: U2 D5 d' J

2 E$ c. q% M+ t9 q算法:' ?! t) R8 B# o% Q4 j/ G; F( m
& \: {4 B. b6 T
(每个OSD的目标PG)x(OSd总数)x(数据量百分比)/ (副本数)
5 g3 C9 i0 F% X8 O8 e$ ^0 Q( n0 O
ps:  T+ e+ H$ G+ @2 M# `. m. ~& C% p$ B* j+ i

! F7 [' E- k: P, m: `如果以上计算的值小于(osd总数)/(副本数)的值,则该值将更新为(osd总数)/(副本数)的值。这是通过为每个池为每个OSD分配至少一个主或辅助PG来确保均匀的负载/数据分配
4 n6 d9 M& ?  n# ]: r4 t$ w+ O$ v. w! e, s
数据量(普通生产环境):; w3 o+ O: r6 O7 b' Z
% S! R4 B8 |' ?8 g- M' }  n1 Y! a! y
项        .rgw.root        rgw.control        rgw.meta        rgw.log        rgw.buckets.index        rgw.buckets.data        rgw.buckets.non-ec
8 I# C" {; v1 }6 o' f) q" L数据量占用率(%)        0.2        0.1        0.3        0.6        1        94.8        3: i# ~# _8 Q1 i" b8 U8 `0 H5 P: G
三、扩容期间
, {  F4 m; `  d" @+ P- b. W. ~(1)观察pg的状态(相关故障处理可根据《pg异常处理》处理)
* ^) V: M" t1 ePeering
' E- _3 w6 z. P, S3 Mpeering的作用主要是在PG及其副本所在的OSD之间建立互联,并使得OSD之间就这些PG中的object及其元数据达成一致
' y+ P1 @* w  ^0 W1 u9 R: k$ H' ^: m9 h
Remapped4 T! h! ~2 y" s  j9 v
当负责维护某个PG的acting set变更时,PG需要从原来的acting set迁移至新的acting set。这个过程需要一段时间,所以在此期间,相关PG的状态便会标记为remapped& _3 u+ h$ I; T; r4 L$ H

& T5 y: x. h! mBackfills
7 V$ W' k3 m; `0 i: W3 ?1 t当有新的OSD加入集群时,CRUSH会把现有集群内的部分PG分配给它。这些被重新分配到新OSD的PG状态便处于backfilling6 a' K  ?& g$ i; `- @4 n0 f

0 B9 n$ x9 M2 M- c+ C& CRecovering
, O/ K" Z5 w7 q# z# [6 e; `) V当某个OSD因为某些原因down了,该OSD内PG的object会落后于它所对应的PG副本。而在该OSD重新up之后,该OSD中的内容$ _( \0 q, u1 C( G5 C
必须更新到当前状态,处于此过程中的PG状态便是recovering1 z- z* P+ E% n" f% P) E
! k3 Y, r' G1 Q8 ?+ G* C
Degraded
0 }5 P2 w- [  @% |  J  G" Q当某个PG的副本数未达到规定个数时,该PG便处于degraded状态,例如:5 D$ o4 N' G. _. P! a% x

0 ?; u1 _' n8 e7 l在客户端向主OSD写入object的过程,object的副本是由主OSD负责向副本OSD写入的,直到副本OSD在创建object副本完成,并向主OSD发出完成信息前,该PG的状态都会一直处于degraded状态。又或者是某个OSD的状态变成了down,那么该OSD上的所有PG都会被标记为degraded。; ]& k& {; D9 B! E9 h

- j6 N9 \1 ~/ Z, y6 Y9 E0 b当Ceph因为某些原因无法找到某个PG内的一个或多个object时,该PG也会被标记为degraded状态。此时客户端不能读写找不到的对象,但是仍然能访问位于该PG内的其他object% S9 [: S, C) Z6 X9 N7 X

1 z2 u) |; ]8 q1 m6 Z: c! R# TActive6 V% q7 v  O) s% J' m( T
处于该状态意味着数据已经完好的保存到了主PG及副本PG中,并且Ceph已经完成了peering工作# I/ r4 h7 k) O' s1 r# b& O/ _3 q

* g; u1 h3 L& a# J" m" z% s8 t& u3 gClean
3 s, V9 ?" b( M* {4 ]# t, T" Y当某个PG处于clean状态时,则说明对应的主OSD及副本OSD已经成功互联,并且没有偏离的PG。也意味着Ceph已经将该PG中的对象按照规定的副本数进行了复制操作
& w1 P$ z5 B' _
+ A. H* q9 G5 b9 w1 M
* f. B; s) _; q$ c7 i* _) g8 {  G6 r
(2)迁移参数调整
+ i9 m( z7 w" @) y" g
6 o8 E; I, ~2 i数据的迁移的相关参数,可根据业务数据流量的时间分布,进行适当的调整,加快迁移:
" i  O, l2 F& y1 S2 X
( O  S; T5 l+ o5 a! w5 A这个值存在平衡点:具体可看:https://blog.csdn.net/tony_vip/article/details/100122104( H" N, U( p! ~; k/ C) @
: \! a; J0 [- _( x4 v. E" C: w
思科参考值,具体视集群情况而定
' i: ?" O4 u5 tosd recovery max active = 3 (default : 15)
; p( g1 ^7 a$ u' h5 j# Kosd recovery op priority = 3 (default : 10)3 h" F, O: D* \1 U5 b5 f' R$ d9 O: ?
osd max backfills = 1 (default : 10)
4 {$ j: Z8 }5 H. l8 |) o
: q: t+ y1 |& n- R$ C1 J# A& w5 H8 P! ^* r2 U0 t# G' M3 _: Z5 i
参数注意事项:: W( i# b- C3 o3 @4 Q% `* @
osd max backfills设置为10时,假如一个pg 50G数据 需要迁移10个,那么基本是迁移500G左右的数据的时候开始删除而, ]8 A! F& ^0 V. |" I2 ?# O# h
backfill为1的时候,就是迁移50G,开始删除一个,迁移50G删除一个,加大backfill反而阻碍了空间的释放。* z" Q0 n$ v3 U' ]

  `; g5 M8 }) ]# W: M
4 Y% Z, k3 {) Fosd_recovery_sleep = 0 在luminous版本已经设置成ssd是0,sata变成0.1,相当于增加了一个延时的过程9 w8 E( Y6 ~& n

1 q3 i1 ^: Z: V9 I6 {6 _+ u
+ g5 }" f, [0 N- j8 g) J& K7 c(3)slow request/ S; A/ P+ E% `/ R
2 b2 c* f' D$ Y
若迁移过程中出现slow request的情况,一般为集群过载了。主要可能有以下原因导致。1 c6 O( R) y4 o/ A! F

$ R: S' _6 P$ Ya. 池的pg数太少,导致某个池阻塞osd的情况$ E. [* a$ H$ f( u, _  F' ~) y

5 Q5 A0 z. G. I通过mon log日志,获取到阻塞osd的信息:- i7 _/ S7 K+ k6 ]9 j  o/ X5 d  |

; S  P3 [  Q. U3 C- Y% ]5 @9 f2021-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
5 [+ i' S/ u  h这里可以看到osd.3阻塞了,pg序号为7.1a,查看对应的池(ceph df):( z% z- W7 H2 `4 J- E: l% z
9 s! _: K$ t! N
可查看到是default.rgw.log,在查看对应pg数目:+ K6 F3 S8 Z: l" b0 `9 {4 S
% n1 r$ L2 t9 N/ X: t
ceph pg dump pgs|grep ^7.|awk '{print $1,$2}'2 a3 X1 D- D/ R1 {) U8 m* o) w3 D
环境上有80个osd,而pg只有32个,均摊到每个osd,平均一个都没有,并没有充分散列,假如维持单个osd承载10个相关pg,那么计算下来:
. {* [4 m" ^& g1 ?. _' [9 z7 v  F
' R9 k2 [( t, C1 W3 c, }' J/ O$ E10*80/2=400 取最接近幂是512
2 g4 ]1 B# }, z" y9 ~
5 {5 |* O8 ]- d$ m% |! S; p3 h512*2/80=12.81 ^! R6 Y' ^, d

+ P' H; b* @' {; _$ S6 D( _/ p平均每个osd上的为12.8个相关的pg,因为对象是207个,平坦下去每个pg只需要承担一个对象,平均每个osd承担不到3个对象,比现在的设置情况要好很多
7 M' G! ?' U! H/ _$ q& w2 W+ r3 ^4 Q" u' n/ q7 q
5 ^. K' ?1 u+ E5 v% o
$ O2 J/ I  K3 H2 k" U
b. 业务在某段时间突然触发增长( ~2 ~5 K+ X" `1 a

- r0 Y. f$ I' G) p+ Q例如项目在凌晨12点时,业务方进行批量删除过期文件的操作,这无疑增加扩容时候的压力,而且其中穿插着设备的批量遍历操作和ceph生命周期操作。$ J' p3 w+ \) C# K1 I

" V' E9 D( N1 \2 \( {; R故可结合现场环境进行调节:
) V  i6 h7 |6 d9 \% m
6 |- N1 R1 m; c: b6 K2 Oa. 将ceph生命周期的迁移时间设置为:01:00 - 23:00,避开峰值时间段! z/ E. q& ]3 g+ c$ k3 L3 R! K

6 p+ w  {0 @8 Z6 `( K. srgw_lifecycle_work_time = 01:00-23:00
! {; u7 _, {* d; L, |7 a( X4 Pb. 降低backfill修复对磁盘的压力
. ~, D6 D% Z6 ]- D. s  s4 h; Q$ |# t
ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.50 U0 O6 t, ~8 m/ x: ~) e5 J: p
#默认为0.1# 效果recovery: 16.1MiB/s, 6objects/s
* E4 j1 H% V1 B) N
( E) @: t3 v* Z" p) s
% E* j9 s5 i% n6 ?! n8 _ceph tell osd.* injectargs --osd_recovery_sleep_hdd 0.1( q  U3 j6 ?2 T  A5 K
# 效果recovery: 82.1MiB/s, 32objects/s% k, n! z7 x8 _" w' w9 X
c. 将池后端使用SSD代替
; [- N4 v4 k8 j2 }8 {$ `9 O  K+ a+ p7 \& _
若集群osd数目不能抗住大量元数据的操作,可将池使用SSD进行代替,缓解SSD的更新的时延,加大并发量。2 r) d; }, {$ G* g( {6 p1 d6 }- [

/ U8 h4 ~6 |) f+ D+ F; k7 U3 ^
: M' E6 C+ M, S$ T5 B" U. w+ Y# |: p2 I# o2 ^, O/ _
(4)盘容量接近阈值
+ [& a/ T& j0 f6 J# T
% _  ]5 C# P  _& H" O5 b若存在扩容不及时,导致osd的容量还未释放,逐渐逼近设置盘满的阈值0.95,此时需手动操作,将阈值高的osd进行优先迁移。
, a4 V& O9 j; S, u+ R- Q" X& n3 V
# 查看满盘osd 所需迁移的pg
4 j; q7 ?' ?% w) T% A7 g/ oceph pg dump pgs | grep <osd.x> | grep backfill_wait; A: ^' U* ?9 u1 ~
主要看UP 和 ACTING 列,可通过awk 过滤出来。9 `9 W" m/ ?/ i; L% S) u
; f0 o! n! D' z& H+ |  H
迁移流程为: ACTING[0,1] —> UP[3,4] 尽量选取UP 为新加入的osd进行迁移。$ j9 ?5 j: r6 r% P: p* W! h

+ e: O' A' R/ C7 v* u: p3 Z/ V尽量将 ACTING 中存在该osd 的pg进行优先迁移,同时设置该osd的backfill 为1,相当于加快迁移出去的数据,减慢迁移进来的数据。, c6 B) T% y. ^7 c

& d$ D$ g( H8 S5 pceph pg force-backfill <pg_id>ceph tell <osd.x> injectargs "--osd_max_backfills 1"& P5 e4 ~) W1 z7 J& s

0 V: f6 P5 z3 y4 [8 k7 j1 m+ ?
9 F  k7 u4 H: B* m3 f(5)迁移所需时间
+ a7 l, q, W) c5 k  A" r
! M% [' E8 }+ ~, X1 [0 F迁移所需时间可通过下面脚本进行大致评估,ceph版本不同可能截取需要数据位置不同,需适当更改下脚本。
% z. g8 f% J3 z) ?& U
6 w' |5 a2 J( H4 {# a9 m#! /bin/sh
/ s) h: [) ]' g- P- j& {while ( 2>1 )+ I- B' X0 Z' k! s" w* t" G$ L
do
4 _9 M; M+ E! B% r  nstart=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`6 k, K7 |/ A) L- m" `! b
sleep 5
0 b$ Y0 Q' l7 N$ V- bend=`ceph -s|grep pgs|grep mis|awk '{print $2}'|cut -d / -f 1`
- @6 L/ n+ a$ P- W; t% Bspeed=$((start-end))1 u5 C. g$ I, a) p
#echo $end; B) j* Y8 h- f
#echo $speed% w4 k5 x1 x$ ]" r$ ~1 n5 Z: P0 o
second=$((end/speed*5))3 F- S7 U+ b. U8 {2 L
hour=$(( $second/3600 ))
) D% S9 b9 j4 K# Z, [1 wmin=$(( ($second-${hour}*3600)/60 ))! U4 s  t: F0 ]' [' L% ~
sec=$(( $second-${hour}*3600-${min}*60 ))3 H9 V- m5 V& Q" |/ C
echo 当前时间:`date`$ e: ^  r! }( D* T: B1 K
echo 迁移剩余:$end6 m# R# H/ ~: w( p1 U3 U
echo 迁移速度:$((speed/5))' D) Y  ?3 i. o: o
echo 迁移还需要:${hour}小时${min}分${sec}秒
3 G8 ?. X6 t  l" {6 U" X' \echo "-------------------------------------", N& ~# Y9 S0 L+ U
done
4 w1 }5 m: m& G! J" M  }1 B! I; m5 A- _
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

如有购买积分卡请联系497906712

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

GMT+8, 2023-2-9 14:05 , Processed in 0.045177 second(s), 22 queries .

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

© 2012-2022 Comsenz Inc.

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