找回密码
 注册
查看: 661|回复: 5

ceph分布式存储 recovering速度控制

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-11 09:01:04 | 显示全部楼层 |阅读模式
集群中剔除了一个osd,没有新加入,进行了一次pg的均衡,做完均衡后集群出现· Degraded data redundancy: 256 pgs undersized
1 n% U# n$ j6 c1 h+ f) M1 s,为了保证集群的pg副本数为3,需要新添加一个osd来做pg的均衡; M2 F$ f+ a+ b5 h7 E+ M# m
/ J3 `5 f# \0 }' p9 `8 O
" p% N' l/ J4 u3 i1 {

7 h* j# D8 X/ f" l8 O5 K

2 c8 z+ Z* E7 j- M/ Hceph集群中osd的recovery的相关参数8 l: G) B, o5 u3 O
[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd4 I8 s2 |$ y8 n3 }. U. }
    "osd_allow_recovery_below_min_size": "true",
+ [4 U1 E/ j% b7 q    "osd_async_recovery_min_cost": "100",' Y/ y( x. x$ @: W! A: m
    "osd_debug_pretend_recovery_active": "false",
3 Z) f9 P6 u- B1 m    "osd_debug_skip_full_check_in_recovery": "false",$ {: v: U* ]8 M; F
    "osd_force_recovery_pg_log_entries_factor": "1.300000",
- k$ d) \- a* C: V8 q4 v    "osd_min_recovery_priority": "0",7 x! w' t& d! O1 O
    "osd_recovery_cost": "20971520",9 @# p9 ^6 S0 c4 _
    "osd_recovery_delay_start": "0.000000",% \5 e8 d3 T7 m/ A9 L$ X* i
    "osd_recovery_max_active": "3",( r( f$ |) K) W5 ]! _
    "osd_recovery_max_chunk": "8388608",
( N+ ~; Z# K/ k  T& v2 r( E* e+ X    "osd_recovery_max_omap_entries_per_chunk": "8096",
1 _6 x, |3 j% v; t    "osd_recovery_max_single_start": "1",
( O# h# O! l3 X: g8 d1 l3 {    "osd_recovery_op_priority": "3",5 e+ A9 W# f) D3 x5 W7 ~
    "osd_recovery_op_warn_multiple": "16",
+ O7 S5 u9 A- F1 {7 I    "osd_recovery_priority": "5",
5 G" \5 O$ u8 x8 {0 b; h+ |    "osd_recovery_retry_interval": "30.000000",: x1 N- j+ i5 C& E& _8 I6 b
    "osd_recovery_sleep": "0.000000",; N/ b! s, V7 @! N3 L- t
    "osd_recovery_sleep_hdd": "0.100000",
" |$ s# s* R: ]4 t. w+ Q7 F2 p) H# N    "osd_recovery_sleep_hybrid": "0.025000",! r1 y4 N+ ~4 q& g0 ?
    "osd_recovery_sleep_ssd": "0.000000",! Z, V. _  J6 L4 W9 _2 z
    "osd_repair_during_recovery": "false",/ B) Z/ i' G+ n  l' ^
    "osd_scrub_during_recovery": "false",, K8 {  O9 t# M* H

3 f' G4 ^: G# ]  D[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd
6 h0 j& w; I* g6 A    "osd_allow_recovery_below_min_size": "true",
  A) C0 }# f( a- ^' F- N/ L0 w    "osd_debug_skip_full_check_in_recovery": "false",
3 O- l) b3 M4 w, X    "osd_force_recovery_pg_log_entries_factor": "1.300000",# T/ }. [4 B* c
    "osd_min_recovery_priority": "0",
. j7 o7 i2 L- ]    "osd_recovery_cost": "20971520",
7 N  f0 I4 `0 S/ v5 Z    "osd_recovery_delay_start": "0.000000",: E/ N( J# S  h- N. {+ T
    "osd_recovery_forget_lost_objects": "false",# W3 J: F& N- J& j" E# Q
    "osd_recovery_max_active": "15",: E+ G/ V: _* e  Z2 ?) ^5 ]( f+ u& o
    "osd_recovery_max_chunk": "8388608",
6 a2 D2 ~6 U5 g' F    "osd_recovery_max_omap_entries_per_chunk": "8096",, y, k: Q+ N0 n- w8 W; x3 k
    "osd_recovery_max_single_start": "1",
5 p8 x& x# Z$ n9 l5 v+ L    "osd_recovery_op_priority": "3",
$ z, S6 S3 c# F4 \  t7 F5 ~    "osd_recovery_op_warn_multiple": "16",
( J' V3 |" S3 @" Z# Q# }) C    "osd_recovery_priority": "5",) q0 {- p# c4 e" j) o1 P1 Q
    "osd_recovery_retry_interval": "30.000000",
$ P( J5 ?8 T4 h  a5 ^# @3 f, L    "osd_recovery_sleep": "0.000000",( y. f$ t0 b- s, v" q" y
    "osd_recovery_sleep_hdd": "0.000000",
- |  a+ k5 W6 j1 @3 I1 w" u3 x1 y3 Q    "osd_recovery_sleep_hybrid": "0.025000",
0 q# Q% [; q# x/ a  U    "osd_recovery_sleep_ssd": "0.000000",
, T$ R( O3 e8 |3 `" M    "osd_recovery_thread_suicide_timeout": "300",
7 H1 k2 ~, |0 H    "osd_recovery_thread_timeout": "30",
- V8 B+ W6 |& U. `* f3 S    "osd_recovery_threads": "1",% O( K* e' ]8 \. e9 F
    "osd_scrub_during_recovery": "false",1 ?4 h  F8 y- f: U7 Q. @

2 ]$ `$ H7 A7 u6 [# b
* v# z3 B( P; h2 a$ F& U加快Recovery的速度
/ a; r, h' Q- X) W# [; O& x7 G// 集群中添加一个osd, ceph-deploy osd create  --bluestore node1 --data  /dev/sdg    --block-db cache/db1 --block-wal cache/wal1
8 b* [6 o. Z7 g4 X+ k1 j0 b1 n& k. e' Q0 w; W2 q$ H3 u0 \" j
// 查看每个osd节点的参数,或者通过  ceph daemon osd.x config get osd_recovery_op_priority 查看单个osd的参数0 F' m, V" L3 p% w
$ q  u# q6 e3 [
[root@ceph-1 ~]# ceph daemon osd.0 config get osd_recovery_op_priority . B2 O7 _1 {- U, U8 V! K+ T+ m, }' `$ k
{: P! V/ I6 i" [- d2 T
    "osd_recovery_op_priority": "3"& P. Q( u2 H0 \8 T+ K! L. k
}/ K' h5 c+ J' B0 D; C

6 M8 o( c/ m3 w. n7 M
  z' D. g$ T4 u) Q. d- ]
  W% ?6 ~: ], H, t, N3 B. B4 H) |4 E& F) b& W

; c. B( {$ o2 E" X# ?[root@ceph-1 ~]# ceph daemon osd.0 config show |egrep "osd_recovery_max_active|osd_recovery_op_priority|osd_max_backfills"1 ?* b2 w* \; o  Y$ z: }7 u4 Y
    "osd_max_backfills": "10",) ~$ E) e$ s. s
    "osd_recovery_max_active": "15",
+ e4 H! R; L. D1 {    "osd_recovery_op_priority": "3",
) P" z: ^9 b) L5 g( _, ?3 a+ P5 {$ l! P) f
//每个osd节点执行如下的参数调整或者通过
/ {+ x* `7 N, ]  L, k7 v8 B' hceph daemon osd.2 config set osd_recovery_op_priority 1
: I  O: t9 d  B4 A% G[root@ceph-1 ~]# ceph daemon osd.0 config set osd_recovery_op_priority 1
) l! d/ j- e* B$ ~{
6 Q# u! `# i  b) a1 g    "success": "osd_recovery_op_priority = '1' (not observed, change may require restart) "
$ A. h: u$ |# k. x3 F}
, M  N  O- Z. v0 ]; d& o1 u* r& ^9 g; }/ `

2 a9 U2 j6 k. a, k全部osd参数设置为0:& {/ w- V. V- j
[root@ceph-1 ~]# ceph tell osd.* injectargs --osd_recovery_op_priority=0" ]: \" b! h& j6 v
osd.0: osd_recovery_op_priority = '0' (not observed, change may require restart)
2 |3 G& _% N$ G+ P, O! z3 n+ sosd.1: osd_recovery_op_priority = '0' (not observed, change may require restart) " G2 S/ i  h8 [/ @+ _
osd.2: osd_recovery_op_priority = '0' (not observed, change may require restart)
$ g7 F' ?; a* V4 F8 `- h; E9 C& \osd.3: osd_recovery_op_priority = '0' (not observed, change may require restart)
4 S) s# |( h# a; B3 ~. ~. U9 u4 I* \osd.4: osd_recovery_op_priority = '0' (not observed, change may require restart) 2 f1 N2 n5 ?" R# R: K) _# @' s
osd.5: osd_recovery_op_priority = '0' (not observed, change may require restart) 9 ]0 `! g5 R8 H" @

. g1 @2 j. S" y: ?3 n% Zget osd参数值:/ }  ~; Q4 R3 q7 G* r
[root@ceph-1 ~]#  ceph daemon osd.0 config get osd_recovery_op_priority& J: ^; o. l: U' b# U) `/ D. Z
{
7 M  S. e/ j" U3 w8 u    "osd_recovery_op_priority": "0"
+ r- J+ K) ]6 R# G}
% b7 Y5 j3 A1 O! o! E' V! s/ K2 v& ~& g/ p# D) |" k, @
使用这种方式设置,不需要重启osd服务,直接生效:
2 |1 Z5 |) `+ P' ~来设置* F- T! J9 l+ \4 A1 i& }  _2 n
ceph tell osd.* injectargs --osd_max_backfills=128
0 T4 h) z5 G3 P/ mceph tell osd.* injectargs --osd_recovery_op_priority=0
0 L7 N& J/ R  N9 ~) R: B( W+ x5 Lceph tell osd.* injectargs --osd_recovery_max_active=64
' V5 ~7 _, I; |* B: r0 uceph tell osd.* injectargs --osd_recovery_max_single_start=64
/ E" F9 {$ ?" f/ P9 I$ u% G  qceph tell osd.* injectargs --osd_recovery_sleep_hdd=0
2 x0 W4 c& u' |
: S% [: @* Y; C
# B$ R6 l9 m, e+ ~
" o$ q5 S: Z$ J( y6 Z核心影响恢复速度的参数osd_max_backfills这个参数默认值10. 由于一个osd承载了多个pg,所以一个osd中的pg很大可能需要做recovery.这个参数就是设置每个osd最多能让osd_max_backfills个pg进行同时做backfill.recovery做修复,通过pull或者push的backfills的操作数一般是分开的,所以一般会考虑设置这个值大一些,用于primary osd通过push修复replica osd或者primary osd 通过pull方式修复replica osdosd_recovery_op_priority默认值10. osd修复操作的优先级, 可小于该值;这个值越小,recovery优先级越高。高优先级会导致集群的性能降级直到recovery结束osd_recovery_max_active默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。osd_recovery_max_single_start默认值5. 5 P3 R) {: M5 @# S. T+ }/ `- @
这个值限定了每个pg可以启动recovery操作的最大数。. y  J& Q( y6 K& m& x' q) M' c' e
第一种情况,配置osd_recovery_max_single_start=1,osd_recovery_max_active=3,这代表每个osd在某个时间会为一个pg最多启动1个恢复操作,并且最多可以由3个恢复操作处于活跃状态。; b) R8 Y. Y4 P2 H
第二种情况,配置osd_recovery_max_single_start=2,osd_recovery_max_active=3,这代表某个时间点osd会为一个pg启动2个恢复操作,并且最多能有3个恢复操作处于活跃状态。osd_recovery_sleep_hdd每个recovery操作之间的间隔时间,单位是ms# k! C' P5 I( e, B" l
: ^# Y2 P% O7 s9 c  F" s+ h
: r3 }/ G  F+ i3 c) B. q5 T

) m1 k/ x$ U7 {+ m( N

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:15:46 | 显示全部楼层
Ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?
% t5 a# N5 t, `& x) {. e本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。0 l' {+ x4 p9 p- w' M1 D1 |
后端的数据均衡IO会对client的IO造成影响从而影响到集群的业务IO,所以我们需要对数据均衡IO进行控制,主要是业务优先和恢复优先。
; j8 H/ p* s' ^+ k. s+ a7 D% X那么在什么时候PG会变化呢?& C* U& A$ H3 o& d; f1 D1 I% p
从用户使用角度讲一般有如下几种场景:
% z7 {. C( @" y& u7 H' O1、osd暂时下线,然后又上线2、osd硬件故障下线,更换硬盘重新上线
3 k; m' q, u: v% g! u
% a$ e8 A. r! d. E" e无论哪种情况,osd上线后通常会发现,自己承载的pg有数据落后了,需要进入恢复模式,从其它osd上获取新的数据达到同步。这个过程就是recovery。! k( t8 N5 ?4 R
recovery分为两种:$ d5 {1 X( m: J2 M
log-based recovery: 是说osd故障时间不长,需要恢复的数据可以通过pg log回放找回来。backfill recovery: 是说无法通过pg log回放找全数据,只能通过全量回填(backfill)拷贝。% t3 F% C+ d  M6 A
6 H; U6 c) G  L! E  U
操作前记得查看下默认参数值,操作完后记得恢复到原先参数4 q& ~3 G: [) {( Y& Q4 c

/ E! e( O. m' s/ @+ C业务优先:5 ?( G; [1 Z0 C! a/ h2 Y. z* g0 g
ceph tell osd.* injectargs '--osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-max-single-start 1'ceph tell osd.* injectargs '--osd-recovery-sleep 1'
' p2 l$ [2 R- M6 K+ s6 [
5 N, x. N# u% y9 B& U1 c) e% C% }恢复优先:
2 a: t# T+ v: j( `9 f2 K$ zceph tell osd.* injectargs '--osd-max-backfills 5 --osd-recovery-max-active 5 --osd-recovery-max-single-start 5'ceph tell osd.* injectargs '--osd-recovery-sleep 0'
3 p; N6 A! k5 @& z* d, L: u, k) P) v( x

" M5 d5 {$ J% W( |还原配置:
, N! E  V1 J: U( yceph tell osd.* injectargs '--osd-max-backfills 1 --osd-recovery-max-active 3 --osd-recovery-max-single-start 1'ceph tell osd.* injectargs '--osd-recovery-sleep 0': L* L) {, Z) B4 m1 R

0 Q8 e( R9 Y! p- B3 L" X% w. p/ e+ A+ J$ k
场景三:完全保证client带宽2 H% B% Y# m8 f* Y
在极端情况下,如果网络带宽及磁盘性能有限,这个时候为了不影响用户体验,不得不在业务繁重时段关闭数据重建及迁移的I/O,来完全保证client的带宽,在业务空闲时段再打开数据重建及迁移,具体操作如下:+ O% K: ~9 K3 h
" H+ R" b+ O3 S9 C
在业务繁忙时,完全关闭数据重建及迁移:: G% j/ R7 o: x5 d0 m" C) @& k
ceph osd set norebalanceceph osd set norecoverceph osd set nobackfill
4 F4 o9 R; ~& v4 T4 o# n" ?- K1 ]/ }7 f- j+ ?

0 n' o* Z% I8 L8 R* u) H
% c" T: _4 x3 c* _. K在业务空闲时,打开数据重建及迁移:
: [$ P6 o5 o! w7 |* x, Oceph osd unset norebalanceceph osd unset norecoverceph osd unset nobackfill$ N  k/ H3 O" C. Y5 P& ^! i
$ K/ Y$ x2 z. i" \6 M3 I4 Z6 }
) l' I  D8 B: ]2 x0 d; q3 y) _

9 }( E. T0 L/ L7 |! a% {* h以上前两种方案操作配置均为立即生效,且重启服务或者重启节点后失效,如果想长期有效,可以在进行以上操作立即生效后,修改所有ceph集群节点的配置文件。: G. C$ e  m/ o1 ^
注:查看现有recovery配置信息,这里的133为具体osd的id号
[url=][/url]
9 b: |5 r: K. B3 i' oceph --admin-daemon  /var/run/ceph/ceph-osd.133.asok config show | grep -E "osd_max_backfills|osd_recovery_max_active|osd_recovery_max_single_start|osd_recovery_sleep"    "osd_max_backfills": "1",    "osd_recovery_max_active": "1",    "osd_recovery_max_single_start": "1",    "osd_recovery_sleep": "0.000000",    "osd_recovery_sleep_hdd": "0.100000",    "osd_recovery_sleep_hybrid": "0.025000",    "osd_recovery_sleep_ssd": "0.000000",[url=][/url]
7 H8 Y: c/ R; s1 i' V1 Y# p0 k
* S7 Q' Z* U/ d1 E$ {, c" l$ z
) Q9 t# K9 S& g; o7 W) u7 e- t
扩展:参数解析
! ^) X3 I/ C8 \) T# @, ]- j) o
osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2;osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;( ]* u# b1 E& ?# x9 L

8 j& n5 B( w7 z6 U/ {" ?& W$ u1 v7 r
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;
; B, s; e: Q" r# t6 P' J0 P& {2 W4 t+ j- O- x1 b- l1 X8 c
这两个参数需要结合在一起分析:
a.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。
2 f, w7 L$ E: h. k$ O% c2 O7 E7 {+ ]% \/ a8 k5 h( A
recovery相关参数
[url=][/url]
2 J, d! n. a" v& |5 yosd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。osd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。osd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。osd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞osd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值osd_recovery_sleep: 默认值0. revocery的间隔[url=][/url]
/ }# Z4 q! `* r( e( O: ~* s: T

. r1 _9 T* T  r4 e9 ?" E8 E! H
4 |+ l4 T8 h5 G2 k  e# y默认配置参数:
4 o- s5 M' t5 S1 p- x2 ~* G"osd_max_backfills": "1","osd_recovery_sleep": "0","osd_recovery_max_active": "3","osd_recovery_max_single_start": "1",6 t7 g0 O- p. A8 Q# y# |/ |- z7 o

& V  P5 z  l; o4 |1 Y, ]! o1 a推荐配置参数:
5 v/ ]! M/ g$ {0 P0 m+ D级别:
. p/ S4 w5 E0 f5%是业务优先,对业务影响最小;
& W- a& o; t4 O1 G: T& S; k100%恢复优先,对业务影响最大;
* b) h( ]4 ?+ M& v3 a其他介于二者之间;
- H' W  N+ ]4 w- o& h2 }+ }+ _3 n- a/ C: {% y8 o
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,2 K/ v4 v! [& k# q
osd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作
5 E5 x- I5 j: [/ u7 {  Z) F, o5 J6 X2 h
! {0 G/ g' [$ X2 M

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:21:52 | 显示全部楼层
部署一套可供生产环境使用的ceph集群,考虑的问题比较多,特别是配置文件的配置量参数。这里记录调试后的配置参数:
6 A  O8 x2 h# `- A* ?8 |
" v* v" W7 `! r  n& o: I5 ][global]7 U9 y  ^" o4 Z: V  r* R

. V8 O# p( P* T8 A) rfsid = 1235bE62-8ae1-difg-893a-892a675757c6
/ l! f5 T% H7 x% J8 }/ W$ n% b8 x3 v/ w) {  g% o, Q
mon_initial_members = ceph-node01,ceph-node02,ceph-node039 M$ b/ H2 N  P3 X  V5 ^9 _
/ X+ z6 \2 N$ E: Y
mon_host = 192.168.170.11,192.168.170.12,192.168.170.13
* ?4 X, i7 ~7 C8 l" ?3 u, v. b. b% q+ p9 O* K3 B0 c
auth_cluster_required = cephx
* P1 H& Y: o  }; ~' ~- G# k' k0 P( C3 f% C2 H
auth_service_required = cephx
3 b5 H- M0 a7 I1 b
8 f2 c0 X( N2 q; b8 vauth_client_required = cephx
6 D! T& a" J$ V( r  \" o
) d  s0 [' O& G' P7 ~public_network = 192.168.170.0/22 #管理网络
/ M) l1 i5 r8 i7 A- b
- \, I( j2 d( j( R* B3 P' K: xcluster_network = 192.168.180.0/22 #集群网络
+ c, p( D5 S% m" M' e3 n/ W4 U# o, `* v2 r6 r. W2 D3 \+ L
mon_pg_warn_max_per_osd = 1000 #每个osd上pg数量警告值,这个可以根据具体规划来设定
5 t3 e& F% O; H) W4 h  c" F, k4 u7 T  y0 C
osd_pool_default_size = 3 #默认副本数为3
4 ~' `, C4 c  C& Z
& N* m. ^: j# r3 R9 posd_pool_default_min_size = 2 #最小副本数为2,也就是只能坏一个+ c0 ~) y5 q0 {+ K+ O/ d
) [4 {/ ?& M+ J3 o" R
mon_osd_full_ratio = .85 #存储使用率达到85%将不再提供数据存储
2 r5 c, ~- ?! i; o- C! h  S8 J8 C% c
mon_osd_nearfull_ratio = .70 #存储使用率达到70%集群将会warn状态2 c) X2 O& ]' n0 x

4 l- V3 F  |* g2 b# cosd_deep_scrub_randomize_ratio = 0.01 #随机深度清洗概率,值越大,随机深度清洗概率越高,太高会影响业务
- v/ s0 P7 E+ S8 S: m! O% J5 C( D! n! T, r- A
[osd]
- d$ P" y7 A- o" Z. g5 Y) p6 `" Z4 g. v# Y7 x
osd_max_write_size = 1024 #默认90M,一次写操作最小值
/ t1 F$ e  G1 l& y/ s- `! I. z% L) s- i1 @
osd_recovery_op_priority = 1 #默认为10, 1-63 osd修复操作的优先级, 。值越小,优先级越低* h2 T- u% l9 a4 S8 n% A

0 q; }" r/ @+ {" yosd_recovery_max_active = 1 #限定每个osd上同时有多少个pg可以同时进行recover! f; b, z! A  l9 j" }2 X

& p' L. ]- c" V* g. x$ Hosd_recovery_max_single_start = 1 # 和osd_recovery_max_active一起使用,要理解其含义。假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有三个恢复操作同时处于活动状态。
+ h* {, C/ H* ?4 t5 S* j; G
# H, d% M# o3 v& k) W8 Oosd_recovery_max_chunk = 1048576 #默认为8388608, 设置恢复数据块的大小,以防网络阻塞: G: C; S) e7 F3 R! G, q

" C' Q# ^0 B8 I5 S$ l; I0 B! ?7 josd_recovery_threads = 1 #恢复数据所需的线程数
6 Q# I% o" M  x% }( a, X. S0 i" S- i# ]1 }% N" J7 n
osd_max_backfills = 1 #集群故障后,最大backfill数为1,太大会影响业务- @8 {& B- \$ g0 D
) X, r+ |5 C9 q; }; `/ r. T
osd_scrub_begin_hour = 22 #清洗开始时间为晚上22点6 E+ M: ?5 b" ]

, t4 `; M- S5 d+ Q' J: Z: bosd_scrub_end_hour = 7 #清洗结束时间为早上7点
' `& Y+ j" b' ]6 U& S! }+ ^' v2 D7 e) @  z; |. K
osd_recovery_sleep = 0 #默认为0,recovery的时间间隔,会影响recovery时常,如果recovery导致业务不正常,可以调大该值,增加时间间隔3 X% l+ S: \7 H. _$ Z
& ~& t$ @7 X; U# o( F9 {: W
osd_crush_update_on_start = false # 新加的osd会up/in,但并不会更新crushmap,prepare+active期间不会导致数据迁移  z( p+ Y! j" f( Z+ h1 }

* @) [4 t5 d, m: s) z- {) ?5 b$ h1 x' L: i

% ~2 X1 G5 z- L& Z- R* m

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 11:35:51 | 显示全部楼层
参数解析& O: m4 w) ?5 Z

$ r( x1 x# K4 ]9 O6 F& P   q& ~2 a$ x+ m, ^

7 {* A# x9 `+ {7 l: m) g$ m' d# ~osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2;+ k* W6 f! C1 e  ~( v
osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;
8 Y/ x: @5 C, N
0 C4 S: Y, H8 F; y$ N9 i" U6 B* Q" h) |5 c1 B
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:# \6 K2 ^7 J, M  U, n# U& o! V- L

3 {0 {& \' R! f. c4 Iosd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;, w+ s8 v/ @9 c, E7 O
osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;
& \4 f1 d! _. j) C1 `2 E
, C  \4 t+ J1 _8 X/ E$ w- r
& i9 ^+ v" D/ t这两个参数需要结合在一起分析:
, g8 v, J* u8 s, y+ T/ D& J* L' s! Y
5 t3 {, i# g$ I# _% u5 I5 s" X: j5 Za.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。- m% A) \; y2 o2 P# _
b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。/ o9 Z4 D9 T8 U- q$ \; ^& G

; K& F4 _3 V5 e  U' [7 ?1 c4 ~4 ]' w1 f
recovery相关参数' Z: e& W% D+ E7 v0 d2 L
4 E+ k; U9 T$ C1 a
复制代码( U5 D# P& s6 E# T
osd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。5 j8 \4 P+ O4 ]7 p
osd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。
9 r( O5 }+ k: ?/ v) mosd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。
  C  S! a9 k' qosd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞
4 V6 X/ x* |9 h3 w8 ]+ f) aosd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值% m$ m  j' _" Q0 k1 y. J
osd_recovery_sleep: 默认值0. revocery的间隔0 \7 k4 r$ G! b9 ^
复制代码
- I* j. R) B& v, i% Y' H8 f
% C7 J' N. \- }
. B! [' C) h4 {+ X+ }默认配置参数:' Z0 k) K3 o0 n' I8 g0 `; G
"osd_max_backfills": "1",
$ T- z) w& J2 O/ j' i. k"osd_recovery_sleep": "0",
$ `- T$ C3 L7 q& V- j"osd_recovery_max_active": "3",
* H0 @" `* i/ }1 w3 U"osd_recovery_max_single_start": "1",' m! s* O! l, p; ~

9 O: y& s7 b5 E; m/ d6 s; `, ]' {
8 T: t+ k& U$ f推荐配置参数:
9 J2 K/ \" a6 I' t4 {, ~7 c级别:
# ~1 L6 S# D! p1 o5%是业务优先,对业务影响最小;
. b( S; {! l1 d100%恢复优先,对业务影响最大;
) ~2 S0 B2 b- w2 B* V( _其他介于二者之间;* B/ K7 j/ E' i2 j/ j6 w) C
9 C* C, y* }& D4 w4 r, x5 F; ]
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,
& b3 W; ]  d1 R. losd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-13 16:18:32 | 显示全部楼层
15.1 服务相关3 ^4 L4 |) C( Q6 B4 X
systemctl status ceph*.service ceph*.target #查看所有服务9 R0 [* v! g  p" ?' L6 X
systemctl stop ceph*.service ceph*.target #关闭所有服务! y5 f* d( V% n: x* W; j5 o- q
systemctl start ceph.target #启动服务- Q  ^; M, O0 y
systemctl stop ceph-osd*.service # 关闭所有osd服务6 w, _: w* O- P$ O$ _* Q
systemctl stop ceph-mon*.service #关闭所有mon服务
2 }2 A6 l3 b: F; K' [+ B% tsudo systemctl start ceph-osd@{id} #启动单个osd服务
& e2 F) W4 K! r! h7 esudo systemctl start ceph-mon@{hostname} #启动单个mon服务' ~6 b% K$ a9 a
sudo systemctl start ceph-mds@{hostname} #启动单个mds服务9 [0 D( @& a; D0 U: [3 Y3 E* S
15.2 查看' J  |/ }4 a$ j/ A5 c3 ]' [
ceph -help #查看命令帮助
% j5 A; |9 |+ M' V0 uceph -s #查看状态: z. K& P/ E+ I
ceph osd pool set rbd pg_num 1024 # 修改pg_num数量
+ h) N  Y) Z$ q) c; uceph osd pool set rbd pgp_num 1024 # 修改pgp_num数量1 u$ Q1 w. A; ^( L
ceph osd tree #查看osd树列表0 S) f& H) F9 _, I0 a5 U" N2 ^, |( Z
ceph osd pool ls #查看所有的osd池7 X3 ?6 @2 y% Z3 W' q8 v
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show # 查看指定的osd运行中的所有参数
- L8 w# E, J( m* A1 vrados df #查看储存池使用情况
& Z( P$ Z9 c2 Grados -p rbd ls |sort
- u5 @- P7 G) r, [* b" r# Q+ Tceph osd pool get rbd pg_num
  f( b, d! s( P# z9 ?ceph osd pool get rbd pgp_num
; [, N/ T% ?% o# ^- S+ ^ceph osd pool set rbd pg_num 1024
8 Y- j' O5 f8 |8 gceph osd pool set rbd pgp_num 1024
. D$ ?$ J- L3 k15.3 rbd相关
& m9 l- O) ^. `5 v! P' q& T; arbd create --size {megabytes} {pool-name}/{image-name}5 `; b: N: `  U9 E& z
rbd list
* j8 J7 N% i1 J: U( Y% Z2 W5 M% Orbd info RBD_NAME
  b# r; t; {  Mrbd feature disable RBD_NAME FEATURE1 FEATURE1 …
$ d$ N7 U+ \  m% c8 @/ Q  }) Wrbd map RBD_NAME #映射到系统内核1 P2 W0 ~2 L: W+ [
rbd showmapped #查看rbd映射条目
, r& J. M6 c& \rbd unmap /dev/rbd0 # 取消内核映射
, v9 X8 o$ H5 Z! _  Zrbd resize --size 2048 RBD_NAME # to increase/ P; m- J4 I, G+ m9 ?; V1 y
rbd resize --size 2048 RBD_NAME --allow-shrink #to decrease6 h: i" K/ r; l$ ?
rbd du {RBD_NAME} -p rbd #查看某个或所有Image的容量,-p 指定pool名7 }- h  Q! w' }
rbd diff RBD_NAME | awk ‘{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }’ #查看rbd image当前占用大小
' y0 I, d  |; A6 E+ q15.4 修改# a- `5 T# j0 f7 U3 }
ceph tell # 使用tell命令手动临时修改组件的配置2 }9 E0 ?+ X. n4 W/ K3 G3 E) n3 M! i& V
[例如:集群状态恢复涉及数据回填时,加速回填速度]
5 u+ L" H7 I4 C/ N
/ E% b- P3 `7 P# Dceph tell ‘osd.*’ injectargs ‘–osd-max-backfills 20’ #默认为1
: L% k1 o3 x9 Q8 E7 Y+ |ceph tell ‘osd.*’ injectargs ‘–osd-recovery-max-active 10’ #默认为3
0 `! q& Z/ Q$ {0 R5 L& x3 T
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 23:53 , Processed in 0.023599 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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