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

ceph分布式存储 recovering速度控制

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-11 09:01:04 | 显示全部楼层 |阅读模式
集群中剔除了一个osd,没有新加入,进行了一次pg的均衡,做完均衡后集群出现· Degraded data redundancy: 256 pgs undersized
; a% ?" i1 V5 \8 M2 y,为了保证集群的pg副本数为3,需要新添加一个osd来做pg的均衡5 h2 i4 ~( d1 N5 D: N, ]
2 J6 G2 s, U+ A/ n' |  l

2 I2 g. X3 C. Q
+ W, A/ i0 c9 D) E

  N- @5 e8 x8 ^; Z0 f7 Cceph集群中osd的recovery的相关参数
- C8 `2 }7 n* R  F9 Q: k[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd  Z" {+ P) `5 |/ M+ c- L
    "osd_allow_recovery_below_min_size": "true",
2 Q- z: w7 `7 l! A    "osd_async_recovery_min_cost": "100",
" M' M; k$ J1 l7 N; z1 `    "osd_debug_pretend_recovery_active": "false",; d1 D# p9 C; B1 q6 c9 c5 r' C
    "osd_debug_skip_full_check_in_recovery": "false",5 L. W  E+ S' P% H6 F
    "osd_force_recovery_pg_log_entries_factor": "1.300000",
; V* z4 t# h( M3 r, d    "osd_min_recovery_priority": "0",9 q/ k1 e) |/ L1 L7 b* Y
    "osd_recovery_cost": "20971520",* b# n# b. y: B) ?' J
    "osd_recovery_delay_start": "0.000000",
5 F# F. E! Z6 I    "osd_recovery_max_active": "3",
' K5 S( e1 [/ F+ ~. P* M1 c' y    "osd_recovery_max_chunk": "8388608",
: b8 f" E; S6 F: K8 Q, \    "osd_recovery_max_omap_entries_per_chunk": "8096",# R# v" S7 c  D) p( k' X
    "osd_recovery_max_single_start": "1",
- u4 X3 a3 I4 b    "osd_recovery_op_priority": "3",0 ?5 ~. |! Z* }
    "osd_recovery_op_warn_multiple": "16",8 t: f) ~" U" d
    "osd_recovery_priority": "5",# j/ c* u4 z& l4 _
    "osd_recovery_retry_interval": "30.000000"," ~' V, L. ^" |* y- F& w) r7 N6 g
    "osd_recovery_sleep": "0.000000",3 J2 D! Y1 u( E. c1 O' e3 k
    "osd_recovery_sleep_hdd": "0.100000",
2 l3 ?9 {$ W7 I. W: `    "osd_recovery_sleep_hybrid": "0.025000",& n* q# K& g/ D+ a+ |( H
    "osd_recovery_sleep_ssd": "0.000000",
4 K: S8 R6 h0 Z& Z, S9 _    "osd_repair_during_recovery": "false",: O9 R; Z1 W9 q0 u# q
    "osd_scrub_during_recovery": "false",& E3 Z2 G7 [, D) }0 O" }
! d" J7 B1 J8 I& M! }$ f/ I
[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd
; X7 l! Z5 @0 s    "osd_allow_recovery_below_min_size": "true",- i& y: {% y: Q' C# C  i
    "osd_debug_skip_full_check_in_recovery": "false",
+ I3 E+ h4 ]# N1 B! R% v' o' B7 _    "osd_force_recovery_pg_log_entries_factor": "1.300000",$ B, c) b' E6 y  M
    "osd_min_recovery_priority": "0",, ^# ~+ M3 Z% J2 t3 o- c% M) ?- k
    "osd_recovery_cost": "20971520",$ o3 C1 Z. b) F5 P
    "osd_recovery_delay_start": "0.000000",
& D. ^: a, o- \( K* I& D4 H    "osd_recovery_forget_lost_objects": "false",
+ H  X1 ~" t, \' \    "osd_recovery_max_active": "15",
  [( p+ w& I1 u! p8 ^* d( k* j    "osd_recovery_max_chunk": "8388608",& h$ `3 R5 T* ?9 E* Z
    "osd_recovery_max_omap_entries_per_chunk": "8096",
0 i6 L0 }( w9 X8 ~: s    "osd_recovery_max_single_start": "1",
$ M" B# x' S) z5 k    "osd_recovery_op_priority": "3",+ q5 K, E! o/ A  _% Q
    "osd_recovery_op_warn_multiple": "16",- s' c; E7 `; W! M4 Z! C* D  [
    "osd_recovery_priority": "5",( D  i' {, n9 u0 \6 N" Y5 a
    "osd_recovery_retry_interval": "30.000000",1 z! s" B: l# u
    "osd_recovery_sleep": "0.000000",7 L3 j) M1 v4 L" a' m
    "osd_recovery_sleep_hdd": "0.000000",
/ K* k" E& m4 y% W7 e% X    "osd_recovery_sleep_hybrid": "0.025000",; S/ t: K5 {' p) R! ?  U  r
    "osd_recovery_sleep_ssd": "0.000000",
' |+ p/ K! z9 H    "osd_recovery_thread_suicide_timeout": "300",
1 v- p! j* B6 j% [5 k    "osd_recovery_thread_timeout": "30",
9 u$ V8 L+ B$ X) K    "osd_recovery_threads": "1",
% }' w7 {  `0 M    "osd_scrub_during_recovery": "false",2 _! y/ @+ h( t  \3 @
" L4 R  O/ K7 u3 c  O+ C, }& T

, y0 l& j4 V# y( E- e) t加快Recovery的速度9 q8 N8 L: E  q, }4 X
// 集群中添加一个osd, ceph-deploy osd create  --bluestore node1 --data  /dev/sdg    --block-db cache/db1 --block-wal cache/wal1
& R8 k$ I0 Q: y$ U* V
% D, i4 W: }% p4 b6 ]// 查看每个osd节点的参数,或者通过  ceph daemon osd.x config get osd_recovery_op_priority 查看单个osd的参数
- u4 v1 B1 h5 t
& f" f$ d% C) `# X[root@ceph-1 ~]# ceph daemon osd.0 config get osd_recovery_op_priority ) S! y7 L& x# B" j2 [
{" }" ~3 I- Y; l1 k; [
    "osd_recovery_op_priority": "3"
6 O( ^9 R* x8 {6 B}8 P5 f! v$ o$ |- G& C8 k* Q
4 U7 y* x' f" |+ H; `8 r
+ a' _3 a" M' l* ^+ h7 ]

  p( ]. X; ^3 ~" z
" I: J5 n( U% z% U! m  X% @3 j* A, g  M/ k6 q
[root@ceph-1 ~]# ceph daemon osd.0 config show |egrep "osd_recovery_max_active|osd_recovery_op_priority|osd_max_backfills"8 y* n8 m9 N( f5 S- z- R( d. H
    "osd_max_backfills": "10",5 m, A& t/ I2 H6 c! k
    "osd_recovery_max_active": "15",
3 U' R2 C9 x8 G2 f5 ]8 G    "osd_recovery_op_priority": "3",
6 n% w& S9 B' R2 a
' o# U* z- f8 B5 m//每个osd节点执行如下的参数调整或者通过3 q/ z' a) Z  o  \
ceph daemon osd.2 config set osd_recovery_op_priority 1 9 K" a& |' f# N  D
[root@ceph-1 ~]# ceph daemon osd.0 config set osd_recovery_op_priority 1
. N. Z, ?1 S. v( F: u0 ^/ J3 U3 q{
- k, b& ^8 v' U$ [    "success": "osd_recovery_op_priority = '1' (not observed, change may require restart) "
& A& f7 O: X8 h. W! U# k}
+ A1 M1 W) i1 L# m( O: M; Y" e
. t) t6 r6 r, `; B$ l0 E) k5 l
. b/ q4 P; J  V3 F1 T2 A& i* R全部osd参数设置为0:- S# K; J7 N; V. _3 j
[root@ceph-1 ~]# ceph tell osd.* injectargs --osd_recovery_op_priority=00 J+ F5 C5 F# q& m' I7 z/ U+ p
osd.0: osd_recovery_op_priority = '0' (not observed, change may require restart)
" m2 M/ r+ H0 \, zosd.1: osd_recovery_op_priority = '0' (not observed, change may require restart)
  ?+ N6 O5 G* f8 E9 \osd.2: osd_recovery_op_priority = '0' (not observed, change may require restart)
+ Z. o9 [+ B) h5 P5 J9 V2 Mosd.3: osd_recovery_op_priority = '0' (not observed, change may require restart) ! `) R, d0 b6 E7 S; L: t
osd.4: osd_recovery_op_priority = '0' (not observed, change may require restart)
* @$ b4 v6 r# K4 x5 O3 x* o% }osd.5: osd_recovery_op_priority = '0' (not observed, change may require restart) ) w' p- f+ {5 Y6 Z/ |' ?: ]

& }+ j6 Y" m% \* Hget osd参数值:
3 o: E$ n. V" V- H[root@ceph-1 ~]#  ceph daemon osd.0 config get osd_recovery_op_priority
9 E) z/ T' a0 d2 O+ ~  K. i{
3 W* L& G9 R( j- z: \5 }    "osd_recovery_op_priority": "0"" F1 E2 z; ]# ~+ M
}
# S9 X2 V2 J  a
: Q2 H! X. `6 I/ v使用这种方式设置,不需要重启osd服务,直接生效:
* ^4 H9 G$ `% Y( r来设置
% ~: M9 V3 Z2 kceph tell osd.* injectargs --osd_max_backfills=128' w3 q. W, E% a3 P4 n3 m5 C
ceph tell osd.* injectargs --osd_recovery_op_priority=05 R1 ^# U1 U7 q+ r) R# x$ `
ceph tell osd.* injectargs --osd_recovery_max_active=64
. ^) R9 |. x4 t. gceph tell osd.* injectargs --osd_recovery_max_single_start=64
% a' P0 {# G( I! S: U9 {( Bceph tell osd.* injectargs --osd_recovery_sleep_hdd=0) N3 d$ }- G9 k3 k9 Q% U1 M0 ]. U
5 o7 Z8 `6 v0 x

' d/ H: n% @- D8 @# f1 n; H$ H8 a, |& f; s6 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. : K* b2 v/ a* j) {. A2 J' z
这个值限定了每个pg可以启动recovery操作的最大数。
2 o: X6 ?& g+ e' R第一种情况,配置osd_recovery_max_single_start=1,osd_recovery_max_active=3,这代表每个osd在某个时间会为一个pg最多启动1个恢复操作,并且最多可以由3个恢复操作处于活跃状态。- `# S+ h# A( K9 J/ a% W* x; Y
第二种情况,配置osd_recovery_max_single_start=2,osd_recovery_max_active=3,这代表某个时间点osd会为一个pg启动2个恢复操作,并且最多能有3个恢复操作处于活跃状态。osd_recovery_sleep_hdd每个recovery操作之间的间隔时间,单位是ms% Y0 a# c3 Z. l0 u4 d7 Y, e

- \5 o  }6 l7 F* _6 q
& I# E1 t' _5 x4 M: s  A; K
; x4 I5 b. J6 n. l; g% q

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:15:46 | 显示全部楼层
Ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?
: v8 G3 }) Y- G' Y* A; E本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。
9 J  I& c- S, G6 F2 \4 t后端的数据均衡IO会对client的IO造成影响从而影响到集群的业务IO,所以我们需要对数据均衡IO进行控制,主要是业务优先和恢复优先。
6 E, n( d5 c* J4 o( f那么在什么时候PG会变化呢?- o/ M% `* N* x9 t, e2 s
从用户使用角度讲一般有如下几种场景:( g8 {4 o1 }2 b* P: }9 ]
1、osd暂时下线,然后又上线2、osd硬件故障下线,更换硬盘重新上线" @! c; r, p  R) d' [' P

$ ]" |2 a- F7 h$ _8 f无论哪种情况,osd上线后通常会发现,自己承载的pg有数据落后了,需要进入恢复模式,从其它osd上获取新的数据达到同步。这个过程就是recovery。
9 R, g. h/ _5 Krecovery分为两种:8 s+ z. V. B% E+ |0 [/ W; F7 t
log-based recovery: 是说osd故障时间不长,需要恢复的数据可以通过pg log回放找回来。backfill recovery: 是说无法通过pg log回放找全数据,只能通过全量回填(backfill)拷贝。& H  p6 S# l/ D5 g+ P

: ^& o* K# W, J6 L操作前记得查看下默认参数值,操作完后记得恢复到原先参数
/ O+ W! c$ w, I' n2 s! S
2 Q' n  B2 L8 c) Q( d业务优先:; K1 L! c6 q" y/ V
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'
; k1 Z3 W* p7 v" j$ `2 x) ?( {# l$ N% y8 R  E1 ]# ?
恢复优先:1 M2 X: c/ f( _8 N* j
ceph 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'
0 e/ l3 C: N! K$ X- z' j  @% K5 C- I6 l1 ~' ^. b* g( M

* A0 h+ O" Y% g/ }8 W- x, [还原配置:& B5 R8 a5 m, _( `+ p- l
ceph 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& _( [. x$ Q$ Q, J- A6 o0 Y% U5 t8 V! _7 G, j: ?9 n
* p$ j5 W4 E- @1 r% ~2 M3 l& A7 f: {
场景三:完全保证client带宽7 q8 ]6 P5 Y: O8 d- y' e3 Z: c
在极端情况下,如果网络带宽及磁盘性能有限,这个时候为了不影响用户体验,不得不在业务繁重时段关闭数据重建及迁移的I/O,来完全保证client的带宽,在业务空闲时段再打开数据重建及迁移,具体操作如下:
0 ?4 P  g5 O4 g, e0 r0 x* e
3 H+ O3 \7 a( C在业务繁忙时,完全关闭数据重建及迁移:( V4 S; g5 F; U, Y
ceph osd set norebalanceceph osd set norecoverceph osd set nobackfill+ d  a4 [' L% ]$ R) |

3 B- r# l0 u8 X& u) q: u% l/ D
0 V* r  V' A  |; g2 P
, J% W% P6 K7 f4 c( R
在业务空闲时,打开数据重建及迁移:
/ K8 h3 P: A" q; d+ g/ M% ?, `ceph osd unset norebalanceceph osd unset norecoverceph osd unset nobackfill( l. N+ Z! {3 p; C- M+ V
. s+ c6 i1 @. n) I

+ m9 H# V% {: S! |4 U; R( W& ^' U( K5 l/ V. ~- R8 g7 [
以上前两种方案操作配置均为立即生效,且重启服务或者重启节点后失效,如果想长期有效,可以在进行以上操作立即生效后,修改所有ceph集群节点的配置文件。: W9 m' W& ~. ^3 a
注:查看现有recovery配置信息,这里的133为具体osd的id号
[url=][/url]
2 `9 L7 U0 m* N' k# l, v, E0 yceph --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]! G( S: N* O. n" g% n5 S$ g
" L  f, x5 o+ B7 n

7 ?/ _$ C# K( T9 @" |% R
扩展:参数解析

8 C# V- r; T5 ?& W: o- g! {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的时间间隔;4 a. E2 M4 I$ D! l
3 [7 j/ W6 i5 C3 G9 j) c
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;5 d) L2 a+ ~  h5 h: V, S2 z3 v
  e; I% {8 P0 t" h0 i! E" M
这两个参数需要结合在一起分析:
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 恢复操作完进行新的恢复。
7 L. |8 [+ ^/ {$ `  D
+ s" K7 Q# l8 R' J, P1 Y" ^
recovery相关参数
[url=][/url]/ {5 L" A- w8 m
osd_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]
' ]" y) `2 f! ]' E5 i: {

$ }+ l+ `1 O" ~1 }& T( K
' X" m  u2 s( N默认配置参数:, P; m& _/ t4 j$ m3 R9 D. G
"osd_max_backfills": "1","osd_recovery_sleep": "0","osd_recovery_max_active": "3","osd_recovery_max_single_start": "1",
4 }( ]9 h! P1 b. D, Q9 b# B% S% V  J( {. c
推荐配置参数:% [( l; u5 s- C: G
级别:+ q( p/ n8 `" i7 M  ]2 d
5%是业务优先,对业务影响最小;
. G9 c) K" P9 ?- ~5 M# z100%恢复优先,对业务影响最大;
9 g1 H' p4 j' w) I其他介于二者之间;9 Z- A) B$ z* k/ `8 Q+ q. d: M2 a, u
' s8 c7 B: i5 a" p( C& d" I! y. x
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,
  O0 s* |4 F/ N* ~1 }# L/ }5 Gosd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作
/ R( j4 q4 p( |5 m
* @3 x3 r, X0 t, x

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:21:52 | 显示全部楼层
部署一套可供生产环境使用的ceph集群,考虑的问题比较多,特别是配置文件的配置量参数。这里记录调试后的配置参数:& K- s* \8 c: S8 Y8 ~& ]

" F: w# e" c+ S* O[global]8 o7 h& G; v# ]- f" g6 Y
3 {0 d& c" i* X# [' E
fsid = 1235bE62-8ae1-difg-893a-892a675757c6" x2 G: y" u) X! m

$ {/ ]4 T. {" ?5 a% S0 }mon_initial_members = ceph-node01,ceph-node02,ceph-node03
, q" \3 p4 z+ P* o4 T' {
& T' D! b% J+ D0 s  C, h' c. T1 ^mon_host = 192.168.170.11,192.168.170.12,192.168.170.131 ]% H; r8 a" O- W# I% I

" b1 [' a  U/ ]auth_cluster_required = cephx
0 a/ s0 ^, u! k$ i9 R
' o3 A1 `# Z# Hauth_service_required = cephx( A/ d+ U: }. P. Y  q) B% U

- ^: C9 S8 `" N$ e( g" d# X1 b7 q5 [auth_client_required = cephx" P& w% @2 `+ K3 w1 x

4 ^8 e  u2 |1 ~3 Jpublic_network = 192.168.170.0/22 #管理网络
: N. [/ C/ x2 ^* H* _" ^
! y# {5 {8 r, _cluster_network = 192.168.180.0/22 #集群网络2 c! q5 Q: r3 x( i( T3 ~0 r1 A, o

$ d9 C2 A& M6 l4 u2 K/ umon_pg_warn_max_per_osd = 1000 #每个osd上pg数量警告值,这个可以根据具体规划来设定6 I3 ^0 _) e5 h1 f6 s& \9 p
0 t: E) ^$ ?) S6 ?  L3 ^
osd_pool_default_size = 3 #默认副本数为3- \! B% P$ X7 d- L8 d9 W( S/ y  \

& W9 E$ S" M* A4 {$ Xosd_pool_default_min_size = 2 #最小副本数为2,也就是只能坏一个$ f' i! K# k' B/ J1 f3 O' U: e

+ v! K, V. h! z+ u* I% y: Zmon_osd_full_ratio = .85 #存储使用率达到85%将不再提供数据存储$ G! Z6 A; C! C: v% c9 W
6 H- F, N$ z' b' _% F
mon_osd_nearfull_ratio = .70 #存储使用率达到70%集群将会warn状态
2 p* @  F/ ~2 {# S
1 P% W# v+ {5 {( M0 Hosd_deep_scrub_randomize_ratio = 0.01 #随机深度清洗概率,值越大,随机深度清洗概率越高,太高会影响业务* T% Y: ~8 @; ]1 B+ J; g5 L

# F5 a6 E$ ~3 a) [[osd]
& q6 f: g8 B( V8 R: |5 J# N8 J- e) J/ R0 o
osd_max_write_size = 1024 #默认90M,一次写操作最小值, v0 i4 a( u3 T5 G
" T  P- ^" p+ O3 K& W
osd_recovery_op_priority = 1 #默认为10, 1-63 osd修复操作的优先级, 。值越小,优先级越低7 _, c6 n; s' Z. Q
" W5 s' W3 ]3 ~7 V" s
osd_recovery_max_active = 1 #限定每个osd上同时有多少个pg可以同时进行recover! x6 G1 ?0 J, r, M$ q9 f+ k  B

5 [# f" T) o% e7 _! {+ q2 josd_recovery_max_single_start = 1 # 和osd_recovery_max_active一起使用,要理解其含义。假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有三个恢复操作同时处于活动状态。' G- ?0 y; D2 B/ K2 y& m0 C
3 B1 X6 C2 K: c. V1 }& J  J/ w* \
osd_recovery_max_chunk = 1048576 #默认为8388608, 设置恢复数据块的大小,以防网络阻塞
, R$ s9 ~) i# L" E/ o
" Z0 R+ {" T  J1 }, I# }4 losd_recovery_threads = 1 #恢复数据所需的线程数, z- ?; n3 q( }: B7 c7 v  W: f

6 m; {, s, c2 i0 {- {. ^osd_max_backfills = 1 #集群故障后,最大backfill数为1,太大会影响业务
# x2 P. c9 C) D; l
; l  y0 f7 L0 e, |, E8 ~osd_scrub_begin_hour = 22 #清洗开始时间为晚上22点
/ w8 L5 O$ W7 k- W; G7 L
* `7 G" }7 I* P( e( u* d+ \osd_scrub_end_hour = 7 #清洗结束时间为早上7点
4 @/ }/ n8 \; ]: p% D/ E9 p1 M( b# @8 R3 G+ x1 A) T+ Q- `
osd_recovery_sleep = 0 #默认为0,recovery的时间间隔,会影响recovery时常,如果recovery导致业务不正常,可以调大该值,增加时间间隔& D: y: s$ J5 L# u1 p$ `" Z. \

! }# I" ]% j2 d0 Q; yosd_crush_update_on_start = false # 新加的osd会up/in,但并不会更新crushmap,prepare+active期间不会导致数据迁移' [0 R9 j  J: ~7 [- l/ Z
+ ?, b0 E( V+ ^" O  W# t" V' E

- ~% ]1 e- P4 S/ E
# a0 G/ ]2 G3 R  V  q) ^

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 11:35:51 | 显示全部楼层
参数解析7 a* r. j4 J' t) n; x% \

) `/ p# X2 |. |  J) @ * V0 g4 j/ X+ \1 G) o* d  n
% t. V9 @% Y/ L1 E7 X3 x6 H* g/ M1 z
osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2;
8 C2 B# U1 U- ~; J7 dosd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;
( C; f5 ^; C) @/ I8 ~
& ]# B7 w( r  D3 b8 P0 ]" a) q5 u0 @& X2 z# H
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
, X6 V/ J) x1 a4 M) L
4 }5 T& _5 H0 O* d. M/ josd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;# L: k" K$ `3 c7 Y7 R
osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;2 A; g$ v" H% H0 V) J

) M/ d, D7 E. W4 V' {1 U. j! G
% N- \, Z5 n  `) B6 `* h( n. U这两个参数需要结合在一起分析:
5 S* Y' T, [/ n% o" S( f; r! W' r5 P% r5 p$ r8 J
a.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。& k8 `! C$ f0 ^+ u( [( ?/ L
b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。
+ J3 _5 R' C& u& @6 f! H
. K3 \( {$ a& S. R1 t& I; Y. z8 V5 e/ d2 h! J
recovery相关参数) W8 P9 h+ S! H/ E

6 @  L% x6 @- W$ s/ c8 q复制代码
! p3 ^0 Y- P$ h' D, Nosd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。
4 t: U' }! P+ x3 V# Uosd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。
+ h8 F& G. E0 @( }5 J* U) `& i2 Dosd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。
" B+ S6 n. A4 eosd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞
' q: x5 u/ w, l5 W0 c1 Kosd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值
5 F* m. I: A0 d0 x, Mosd_recovery_sleep: 默认值0. revocery的间隔
2 B/ Q6 [8 \1 V8 J! t" B& |复制代码
6 R7 K2 A, d2 l- V& c% p
- m, Q8 e: _3 ~6 I
, ^3 _8 X7 P) d' D( y/ \默认配置参数:
! \* O7 b: W2 c) W. U) R* t"osd_max_backfills": "1",
! S* P" a7 m0 n% T"osd_recovery_sleep": "0",% o" u' J: u' B$ S% e- ?9 o
"osd_recovery_max_active": "3",
$ m* R4 t; B# x) W" I  \+ s0 \"osd_recovery_max_single_start": "1",
2 Y6 l7 ~6 k: M& p) j6 x # M6 h( ^1 a" f4 f7 z

0 y: |- ], A" _: P- ?8 u推荐配置参数:
8 ^, e% ~* p: n8 x& d( Y7 ~级别:9 m0 ]8 W$ p, c, ^
5%是业务优先,对业务影响最小;
4 R: K/ k" \7 B) t100%恢复优先,对业务影响最大;$ J$ b' F2 p' ~9 B
其他介于二者之间;
4 H8 J' u$ z1 M7 ?3 G! Y3 k3 A1 S% u$ ]" h' ~6 M6 K$ V
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,
' J# K; `6 i1 {osd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-13 16:18:32 | 显示全部楼层
15.1 服务相关
6 T' @5 S: `4 B5 H* Ksystemctl status ceph*.service ceph*.target #查看所有服务- x7 i! v' N; N3 T0 F
systemctl stop ceph*.service ceph*.target #关闭所有服务/ I: ?2 V. v  J8 G9 B
systemctl start ceph.target #启动服务
- h6 g6 q/ r5 p9 m2 \" esystemctl stop ceph-osd*.service # 关闭所有osd服务
% d, X7 G( x$ f. m# ]! hsystemctl stop ceph-mon*.service #关闭所有mon服务9 `, }. R4 R8 n7 n; \
sudo systemctl start ceph-osd@{id} #启动单个osd服务
" D: ]% h, s4 P3 Gsudo systemctl start ceph-mon@{hostname} #启动单个mon服务, e! k' O6 x) F. c
sudo systemctl start ceph-mds@{hostname} #启动单个mds服务" A4 g9 E' w9 n  G# J* \: S
15.2 查看+ I- y; v' o8 P9 J, y
ceph -help #查看命令帮助
1 r( L; V. z* R) k; t. Wceph -s #查看状态- K, N7 M; p, G$ C
ceph osd pool set rbd pg_num 1024 # 修改pg_num数量# f, V, @- ?& g" M. U) B1 w& I
ceph osd pool set rbd pgp_num 1024 # 修改pgp_num数量1 @" a( u) ]9 [
ceph osd tree #查看osd树列表
$ v7 e: l- p0 Y  d2 q7 h% g' E& \ceph osd pool ls #查看所有的osd池" M( S1 i5 t6 d: Q" H$ h
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show # 查看指定的osd运行中的所有参数
# C+ l3 q$ O) ?$ J. Qrados df #查看储存池使用情况
* s: r, P1 Y9 ~9 J9 }rados -p rbd ls |sort
+ {6 n$ K8 }; v' V: N0 s- Lceph osd pool get rbd pg_num
( z0 n8 T7 D+ H' Bceph osd pool get rbd pgp_num
( I$ L- a+ y  U$ Q: ^% wceph osd pool set rbd pg_num 10240 L4 T3 J6 s" {
ceph osd pool set rbd pgp_num 1024& [& f  g# p# M5 Z! z5 k4 c" q: {
15.3 rbd相关. j9 m/ k7 S9 W
rbd create --size {megabytes} {pool-name}/{image-name}# Q/ u' j# Q3 g: R
rbd list9 t. L7 X- {9 [  f( v% G
rbd info RBD_NAME8 e- C# `  |4 K% V
rbd feature disable RBD_NAME FEATURE1 FEATURE1 …9 `5 C0 Z9 V3 ]9 q
rbd map RBD_NAME #映射到系统内核
2 D0 }6 u* F* `. t" c: h/ e% jrbd showmapped #查看rbd映射条目
: k$ L& J' ]0 m* ~rbd unmap /dev/rbd0 # 取消内核映射
1 `) m5 y, ]1 d. L- Nrbd resize --size 2048 RBD_NAME # to increase( a$ `$ ~: v5 v0 A4 V' I. K
rbd resize --size 2048 RBD_NAME --allow-shrink #to decrease) v  N" G" P/ [' j
rbd du {RBD_NAME} -p rbd #查看某个或所有Image的容量,-p 指定pool名
+ ~! Q1 ?1 e5 Y7 Orbd diff RBD_NAME | awk ‘{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }’ #查看rbd image当前占用大小
6 D9 D! \" E$ G3 H  T% P& D15.4 修改) W1 ~4 e. L3 o. G
ceph tell # 使用tell命令手动临时修改组件的配置2 X6 Y' S2 X; w( m  M1 P4 E
[例如:集群状态恢复涉及数据回填时,加速回填速度]
) }3 d' @  ~3 n
0 C& Q2 D, \2 {+ n  Y" i- P4 }ceph tell ‘osd.*’ injectargs ‘–osd-max-backfills 20’ #默认为1
& Y0 F8 Y( ?! ]' t& O4 w/ Iceph tell ‘osd.*’ injectargs ‘–osd-recovery-max-active 10’ #默认为31 t* G$ z4 _( l
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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