|
|
集群中剔除了一个osd,没有新加入,进行了一次pg的均衡,做完均衡后集群出现· Degraded data redundancy: 256 pgs undersized. |, G. t" e* N* s" Y
,为了保证集群的pg副本数为3,需要新添加一个osd来做pg的均衡
& ?8 A1 S# @! K0 _% x! _ Z2 D' Q$ [1 k7 G, b. @9 b
8 S2 Z/ C0 l* E5 Y* b o- L4 q
' n7 O' q1 ?! I8 U( O" H1 T4 x
$ m' r; K$ I4 D- @ceph集群中osd的recovery的相关参数- k& z- m$ x3 U, e7 |9 t9 f6 ^
[root@ceph-1 ~]# ceph daemon osd.0 config show |grep recovery|grep osd7 I$ H7 p8 Y2 }- f. |
"osd_allow_recovery_below_min_size": "true",
1 m; ]" ^" ?: E. q) b' b! b4 e "osd_async_recovery_min_cost": "100",
4 R! z: W }5 [8 F "osd_debug_pretend_recovery_active": "false",
0 ~2 U3 _/ d5 \2 f "osd_debug_skip_full_check_in_recovery": "false",
+ ~8 j( X4 f( K; V "osd_force_recovery_pg_log_entries_factor": "1.300000",7 V: I$ Z3 G% u9 x3 N; H# t0 h" w
"osd_min_recovery_priority": "0",1 _% a+ o, I% f: B# \9 b9 E
"osd_recovery_cost": "20971520",3 _- W: d3 G0 d5 |0 W# e
"osd_recovery_delay_start": "0.000000",
6 O7 l% J, c$ u0 v s "osd_recovery_max_active": "3",
9 J" T5 B! A; f) V8 K "osd_recovery_max_chunk": "8388608",
0 \- d" z+ ^$ N "osd_recovery_max_omap_entries_per_chunk": "8096",
8 I& q. Y+ @! m! Y# x7 g "osd_recovery_max_single_start": "1",
, r4 c! J' w7 @5 k "osd_recovery_op_priority": "3",( i* `" s& t* T9 |! i; M" @' a% u
"osd_recovery_op_warn_multiple": "16",# Y$ G, L. f$ m" y& J
"osd_recovery_priority": "5",
0 N1 F. E* H1 R1 m8 X "osd_recovery_retry_interval": "30.000000",& h+ w# ^, J$ v7 e' _5 w
"osd_recovery_sleep": "0.000000",+ s$ {% R& x! L( I# e
"osd_recovery_sleep_hdd": "0.100000",# Y! N% b# v7 x
"osd_recovery_sleep_hybrid": "0.025000",
6 i: r4 A% j+ v: n5 l9 L: l "osd_recovery_sleep_ssd": "0.000000",/ Z0 O4 b- a% |' [
"osd_repair_during_recovery": "false",
) G% ^. L" [, x "osd_scrub_during_recovery": "false",
: m9 x* d9 R. j7 K% A8 q ]7 h6 p: I0 V- U+ K4 c) F) T2 c4 W4 p
[root@ceph-1 ~]# ceph daemon osd.0 config show |grep recovery|grep osd0 v/ @! l' J/ k( G$ @+ t
"osd_allow_recovery_below_min_size": "true",
; h n; |* e, a2 D5 K3 ^ "osd_debug_skip_full_check_in_recovery": "false",% Z" j- q6 ]. o* {6 o
"osd_force_recovery_pg_log_entries_factor": "1.300000",* [: A( k& G0 o( x+ k) Q
"osd_min_recovery_priority": "0",6 o" n. u K1 O# I2 I
"osd_recovery_cost": "20971520",
4 ?( k I/ Q3 E "osd_recovery_delay_start": "0.000000",
% {' L# B4 n# p* |1 o "osd_recovery_forget_lost_objects": "false",- |! o, ?" b) t( F' ^
"osd_recovery_max_active": "15",
% E% A8 v' N* x8 K, H5 a "osd_recovery_max_chunk": "8388608",9 C/ R8 B+ [- N: P H
"osd_recovery_max_omap_entries_per_chunk": "8096",5 b" |- k( o' W, V' U
"osd_recovery_max_single_start": "1",1 B. b- {# W6 A6 u; A* k6 X
"osd_recovery_op_priority": "3",. d9 D0 s* Q$ V& U/ N2 h7 e0 n( }
"osd_recovery_op_warn_multiple": "16",4 i4 {& m9 \. z+ W3 J) _
"osd_recovery_priority": "5",
6 U) _" W) k0 [' n "osd_recovery_retry_interval": "30.000000",
# n5 K% w6 s9 J5 U) t "osd_recovery_sleep": "0.000000",
* V+ B5 {! I& A "osd_recovery_sleep_hdd": "0.000000",5 j3 |' q8 H( k. p& _
"osd_recovery_sleep_hybrid": "0.025000",/ e4 i( g2 H% g, m+ J# o7 m- S
"osd_recovery_sleep_ssd": "0.000000",
8 N2 U O n7 _0 E "osd_recovery_thread_suicide_timeout": "300",' z, ]. H$ V" W/ m; [
"osd_recovery_thread_timeout": "30",6 y- k( W1 M: e$ _) j+ k* r
"osd_recovery_threads": "1",1 X! B) X! t) `3 ]0 m
"osd_scrub_during_recovery": "false",
z9 k, u) \% [ j+ z' z
' ~( r1 G- ^% l/ [
& X) _& U" { b. K加快Recovery的速度
g6 _ r* q6 c- y% N// 集群中添加一个osd, ceph-deploy osd create --bluestore node1 --data /dev/sdg --block-db cache/db1 --block-wal cache/wal1; o6 x; t# u1 d! @, b8 q
) m7 N4 W. j9 |
// 查看每个osd节点的参数,或者通过 ceph daemon osd.x config get osd_recovery_op_priority 查看单个osd的参数7 @) |3 i2 I$ N2 {; ^7 W
/ V' q0 r; D( Y& ^! b5 q X[root@ceph-1 ~]# ceph daemon osd.0 config get osd_recovery_op_priority # j& W: d, l) w8 v- x2 z' K O z5 F
{" U# N% {$ \6 J1 Y% o! U5 b; \* S: c) Z
"osd_recovery_op_priority": "3". L: M. D3 ]% j& q
} ^, Z/ y9 L+ G/ }" V- R
9 h, e& _; w% N
8 J! X( m# x4 X" F) W2 u& e1 |
! Z- {" M& V) {, E8 _( K( r" L% T: m" R/ z
3 |" ?+ h" H" W6 t& u[root@ceph-1 ~]# ceph daemon osd.0 config show |egrep "osd_recovery_max_active|osd_recovery_op_priority|osd_max_backfills"
9 s; N4 p' B* }& d- Y2 @ "osd_max_backfills": "10",
p8 o1 P- @, ^ "osd_recovery_max_active": "15",
8 l. D9 G/ {! Q% d& L g ^5 M0 r "osd_recovery_op_priority": "3",1 l5 q, \" r6 b% X4 {; {
2 A, I8 K( ^: r$ `5 J/ v//每个osd节点执行如下的参数调整或者通过
; C& R) G6 r- |$ N( d5 `ceph daemon osd.2 config set osd_recovery_op_priority 1 & q6 s) C7 Q2 N# e. x
[root@ceph-1 ~]# ceph daemon osd.0 config set osd_recovery_op_priority 1 - L. d& E5 H5 }
{
9 y# [ L1 e* u1 j% k+ | "success": "osd_recovery_op_priority = '1' (not observed, change may require restart) "
) r: T: R& [% j- Z1 N}: G3 E3 L8 X3 x1 d0 a/ H8 D; O
7 q9 L; {* [7 |: O
9 m3 q, S& i% _/ S4 x; p全部osd参数设置为0:7 J5 E$ S4 v0 Q/ Y2 ?' Q
[root@ceph-1 ~]# ceph tell osd.* injectargs --osd_recovery_op_priority=0: W% k+ T8 `+ _; n# q
osd.0: osd_recovery_op_priority = '0' (not observed, change may require restart)
! m, g% g# N# o3 u6 Cosd.1: osd_recovery_op_priority = '0' (not observed, change may require restart)
( V/ t# i/ @% A7 a0 H. y, N) `osd.2: osd_recovery_op_priority = '0' (not observed, change may require restart)
; v+ j8 J9 c% T6 Tosd.3: osd_recovery_op_priority = '0' (not observed, change may require restart)
# k2 A0 h* U& ^& t8 A5 mosd.4: osd_recovery_op_priority = '0' (not observed, change may require restart)
7 @/ w7 o2 r* j8 C; Y: bosd.5: osd_recovery_op_priority = '0' (not observed, change may require restart)
% w7 h4 \2 ^, S
9 p' a' ]3 g1 n8 l9 f" oget osd参数值:
2 [9 w* `( b \: _+ d! W[root@ceph-1 ~]# ceph daemon osd.0 config get osd_recovery_op_priority: I6 j4 c+ F; M; ]9 |
{
! t6 j4 A) ^& R( |, W "osd_recovery_op_priority": "0"
8 L* R4 c4 Z/ Z) H/ A}
/ T3 m$ X# ^5 a8 v) f8 c0 q8 g8 W' T/ Q# }; O2 T9 m
使用这种方式设置,不需要重启osd服务,直接生效:' s1 g' F$ b( }" R" Z
来设置
2 @! k* p+ E# n+ b+ O2 Tceph tell osd.* injectargs --osd_max_backfills=128
$ L7 O$ G: _9 F- M4 Y' bceph tell osd.* injectargs --osd_recovery_op_priority=0
# \3 }! ~) H3 M% P* q! \ceph tell osd.* injectargs --osd_recovery_max_active=649 h$ A3 y8 m# \/ ~3 @: ?3 F. J k
ceph tell osd.* injectargs --osd_recovery_max_single_start=64' x* O6 h/ c2 h8 @2 M* z9 a- X2 _
ceph tell osd.* injectargs --osd_recovery_sleep_hdd=0
8 N/ q# L" _6 Y/ C( \' B8 o" Z9 `; B6 h2 _* Q
( W$ h) o$ |% c5 j8 G \% f
8 R* H0 B8 _# U核心影响恢复速度的参数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.
/ E# W0 }5 g6 P4 c+ Y }这个值限定了每个pg可以启动recovery操作的最大数。( N. H* F, M+ @5 g" r& R; ^
第一种情况,配置osd_recovery_max_single_start=1,osd_recovery_max_active=3,这代表每个osd在某个时间会为一个pg最多启动1个恢复操作,并且最多可以由3个恢复操作处于活跃状态。
% a: z- k9 m& H第二种情况,配置osd_recovery_max_single_start=2,osd_recovery_max_active=3,这代表某个时间点osd会为一个pg启动2个恢复操作,并且最多能有3个恢复操作处于活跃状态。osd_recovery_sleep_hdd每个recovery操作之间的间隔时间,单位是ms9 s5 h: B7 K9 b3 }. T
' D, z6 c$ Y% j y7 g: ]
4 Q& r: b+ }0 a- o2 w
W- j- W; m5 | |
|