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

ceph分布式存储 recovering速度控制

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-11 09:01:04 | 显示全部楼层 |阅读模式
集群中剔除了一个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 |

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:15:46 | 显示全部楼层
Ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?% [! f, e, |, R$ U. z# ]! x
本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。, [& W4 \  _" P
后端的数据均衡IO会对client的IO造成影响从而影响到集群的业务IO,所以我们需要对数据均衡IO进行控制,主要是业务优先和恢复优先。; S! p1 X1 y& g8 O; b' N$ C4 l9 I
那么在什么时候PG会变化呢?8 b6 j2 \& n! ?5 O6 N* \: l
从用户使用角度讲一般有如下几种场景:: ^4 S& q6 m6 b% u
1、osd暂时下线,然后又上线2、osd硬件故障下线,更换硬盘重新上线8 H2 R8 W9 y  W. u
+ {- \' S% ~) x2 ?" N
无论哪种情况,osd上线后通常会发现,自己承载的pg有数据落后了,需要进入恢复模式,从其它osd上获取新的数据达到同步。这个过程就是recovery。1 Q% Q9 [9 c$ m) z( R1 f
recovery分为两种:( P9 U' E7 y  ?- k0 t2 g
log-based recovery: 是说osd故障时间不长,需要恢复的数据可以通过pg log回放找回来。backfill recovery: 是说无法通过pg log回放找全数据,只能通过全量回填(backfill)拷贝。% G% C8 ~" T  R6 L
. P, v8 s, L0 G
操作前记得查看下默认参数值,操作完后记得恢复到原先参数3 Q! U. n( R7 i$ K# ?7 N* c- c9 l' ]
$ Z0 E& W, z6 _  a
业务优先:1 [4 v. r; x; X/ T
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'
3 U6 |/ l% S/ \. M
* A  S1 L' o4 \- s$ K' p/ s, t恢复优先:" p( {2 s" L3 ]( [6 z% O
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'
3 A4 r( ~& e/ |" S* |; u7 n% T& g  n# C

9 t) `  k& d1 E" w. {# q5 u还原配置:8 p: C; k9 {% _* I
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'" N: h, R1 \7 `2 s2 V1 r# q2 l; n1 f  t

8 x! T2 V8 ]# U; |$ \! i1 u) v: F/ y! c  G1 h) ?9 m3 ~
场景三:完全保证client带宽2 D; a- \" k; M* i, N6 M; I( j/ }
在极端情况下,如果网络带宽及磁盘性能有限,这个时候为了不影响用户体验,不得不在业务繁重时段关闭数据重建及迁移的I/O,来完全保证client的带宽,在业务空闲时段再打开数据重建及迁移,具体操作如下:  ~3 C  m! ?2 x; L0 \

# T9 A" W8 l7 A! Q! I( f2 z8 M; ^在业务繁忙时,完全关闭数据重建及迁移:0 y0 C- ^  B8 ~
ceph osd set norebalanceceph osd set norecoverceph osd set nobackfill+ H" f! ~, ]$ b, `3 L4 k3 N9 n

0 O& y  l8 R& d' F. G

: P% z7 Q& L* ]; h- V* h( F6 Z  l% ?2 q9 G, l
在业务空闲时,打开数据重建及迁移:
3 |( D2 Z8 G) t& h  qceph osd unset norebalanceceph osd unset norecoverceph osd unset nobackfill
4 V1 X! z0 B8 z4 A9 {1 z) R2 G# Y
) L4 W; @0 {/ w' [
2 m; F& ^. f, T; [% L$ r
+ p4 O2 n  m: }( g8 r2 P( f
以上前两种方案操作配置均为立即生效,且重启服务或者重启节点后失效,如果想长期有效,可以在进行以上操作立即生效后,修改所有ceph集群节点的配置文件。
1 W4 m. Q+ e+ o$ B) q
注:查看现有recovery配置信息,这里的133为具体osd的id号
[url=][/url]
3 R& R! g0 O' O( w* u. Uceph --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]
/ a3 @3 |1 z, h" t+ B) q

8 Z1 w. B& R! ~) w) T: s" i" C
" k. n( |2 Q  B7 O, b& ^/ D% N* r9 Z
扩展:参数解析
4 C# T4 H( J8 O& G' S7 @- k
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的时间间隔;
5 C% b7 W) `- B5 C, D3 u* |
2 {6 }1 ?% {/ y+ y5 H
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;& b6 B3 C" M. D% n' n" j+ s. \

7 B- W4 n3 R" J  j! r8 n
这两个参数需要结合在一起分析:
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 恢复操作完进行新的恢复。
/ L/ {, k9 L; P% _8 _6 Y" V. K4 q
5 w# q9 d+ ?7 `; t
recovery相关参数
[url=][/url]* Y) ], x' Q' {1 m, C
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]
* c) p3 y( a: _" s1 {: z& H

+ G. b. N( y$ J9 }; p4 j$ W
$ `+ l; P8 B1 p默认配置参数:" e( }4 P3 w( O
"osd_max_backfills": "1","osd_recovery_sleep": "0","osd_recovery_max_active": "3","osd_recovery_max_single_start": "1",
6 p  W" d2 W& a
  C' [, t: t! v) \2 H" Z( H推荐配置参数:
" }& w% F' E, a$ x: g' ^0 e. B, O级别:
* A) d% I0 |/ |$ ^! Q) v) q* B5%是业务优先,对业务影响最小;# |4 `# b( }0 T  X) t
100%恢复优先,对业务影响最大;6 k7 n. F: A' {! a: ~* q" N' o
其他介于二者之间;7 L8 T8 {" T; H5 m1 y: Q. j
2 |8 g$ V  ~6 U- r; ]2 J
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,
4 P4 M) p' [/ p! n' ~% l( S' gosd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作5 q' n; G$ J. U/ S- A$ D9 M
1 u# Q' J$ N  i1 V5 i/ ^4 x/ {# P; k

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 09:21:52 | 显示全部楼层
部署一套可供生产环境使用的ceph集群,考虑的问题比较多,特别是配置文件的配置量参数。这里记录调试后的配置参数:/ d) D! n  g9 J* B7 }1 J( Y8 l

: v( w: y; F8 V/ t[global]" c2 x% }: |5 B* `5 U8 r7 L2 Q: B

7 d5 \. ^7 G) Pfsid = 1235bE62-8ae1-difg-893a-892a675757c6
/ f% C2 e% i- `3 p- G8 G7 r1 M& P! K( h9 i- {5 U
mon_initial_members = ceph-node01,ceph-node02,ceph-node03
! ~$ O: ~. X; W" S% j' V9 M& N( e; Q1 m% o9 l
mon_host = 192.168.170.11,192.168.170.12,192.168.170.136 a* _! M2 i' Q5 C$ i

2 W  q9 Y5 c$ v1 Uauth_cluster_required = cephx
8 z4 J+ ]; `  F- A+ B9 B; P  `+ {9 ?0 y
auth_service_required = cephx1 g4 p2 V1 h# n/ C9 ~% i5 n/ s
/ x4 V" N8 E: e
auth_client_required = cephx/ Z5 C& q# k& u( l, D
* U# \+ y  Q1 X" {' P3 {
public_network = 192.168.170.0/22 #管理网络1 Y7 f7 u  f2 r0 z3 W

! Z# X/ J6 F0 H* Qcluster_network = 192.168.180.0/22 #集群网络
& L) i& i1 @* z. W
# B8 r% R& [2 k- ?  A! j+ vmon_pg_warn_max_per_osd = 1000 #每个osd上pg数量警告值,这个可以根据具体规划来设定
0 f9 q" D5 A7 ?) I1 g& X1 n+ ?- r& {) p. v, Q" |( ]9 A
osd_pool_default_size = 3 #默认副本数为3
; A( }$ l. U) S9 H: Q- V. b5 \6 Q3 d/ G6 r0 a
osd_pool_default_min_size = 2 #最小副本数为2,也就是只能坏一个* h( Y# ^8 z5 T

! H! \! Q- T1 s. `( Dmon_osd_full_ratio = .85 #存储使用率达到85%将不再提供数据存储
; S8 w# U) i6 `/ J, r; |- d/ ~5 ]* ^5 u
mon_osd_nearfull_ratio = .70 #存储使用率达到70%集群将会warn状态
6 u3 w2 J& t1 k0 y/ V( }
: {6 e! `5 g) g: zosd_deep_scrub_randomize_ratio = 0.01 #随机深度清洗概率,值越大,随机深度清洗概率越高,太高会影响业务
8 h* t$ P6 A! {8 r# J. j$ U2 t1 y& S# T
[osd]( |/ @3 i$ `- p4 ~& e- d+ B

/ r  A) q5 y6 z: Aosd_max_write_size = 1024 #默认90M,一次写操作最小值8 n# K1 F$ G; i& n4 b( u: d, J  v6 F
  l. p8 ]* ?9 _  d0 C
osd_recovery_op_priority = 1 #默认为10, 1-63 osd修复操作的优先级, 。值越小,优先级越低; O# M: \/ D$ b/ e5 s1 m6 C, j

: X# @6 O3 `5 e9 u+ aosd_recovery_max_active = 1 #限定每个osd上同时有多少个pg可以同时进行recover( k0 @% D  m/ U. f7 f
* l  t2 Z6 \8 @' y. A) D, F5 o
osd_recovery_max_single_start = 1 # 和osd_recovery_max_active一起使用,要理解其含义。假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有三个恢复操作同时处于活动状态。0 R* i$ v  s0 d$ L7 L- c

, @" o1 B- w  V4 Iosd_recovery_max_chunk = 1048576 #默认为8388608, 设置恢复数据块的大小,以防网络阻塞
$ K* T1 t$ k, i% U. B
9 C' B3 M' g. K* Q% B6 u* e$ hosd_recovery_threads = 1 #恢复数据所需的线程数$ m/ c1 F( ]# X1 D8 i! z8 m

1 _7 Y" c7 K" Sosd_max_backfills = 1 #集群故障后,最大backfill数为1,太大会影响业务4 V5 E: t% ]$ y5 q: j

3 ^+ {) t% C" e- ~osd_scrub_begin_hour = 22 #清洗开始时间为晚上22点
/ D1 a  ~5 r- o0 i% t$ J1 ^' p* _$ D' M% F6 @7 a2 P, h: ~* x
osd_scrub_end_hour = 7 #清洗结束时间为早上7点$ E8 Z  C9 U' P

; K( C% W5 l0 C8 _# Z4 {" Josd_recovery_sleep = 0 #默认为0,recovery的时间间隔,会影响recovery时常,如果recovery导致业务不正常,可以调大该值,增加时间间隔
, c: |% p  g& E
( \( D* K5 j& M( W& rosd_crush_update_on_start = false # 新加的osd会up/in,但并不会更新crushmap,prepare+active期间不会导致数据迁移
3 ^" Q  X  M& N& a- v
. W& E- F; ?, ?$ D+ h% T- u8 F
9 g( P& Z% \) E3 X
4 d. t& a9 h" n' z: b. [& O$ \. z

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-11 11:35:51 | 显示全部楼层
参数解析
% ~1 I- h" g% L7 g  y7 T0 `
7 }! y  `$ T/ g) l. l
6 u- P% d. ^4 k% b7 y! T- j+ M7 s* `
2 u$ D" W0 K4 T/ Iosd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2;5 b+ A$ w2 a- R1 @
osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;
; b3 o2 L8 a% X9 S1 I0 k$ v: Y0 [. L
3 K6 \3 _( e- J' I5 z
- M; j3 J9 S7 H4 w- K2 N, m4 H以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:. _% W, V% k) U; B1 ?5 F. ^

( X  ?  L% Z' r! {$ I# Dosd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;: B6 `  \( ?+ O( q6 `
osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;
% {( _7 \% o( t$ t0 E $ k0 i8 X5 E  o, C. G
0 \* O1 L4 \% s7 J7 t* f4 h1 `* o
这两个参数需要结合在一起分析:
6 B9 V5 G: [! J$ S; G, y
6 @! h. c1 |1 x5 Wa.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。" x5 S+ T, _3 J6 x* \$ f
b.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。
9 f1 R' k7 k8 Y6 O& ?" J
' _* ~1 C( e8 Q) N' b  g6 D: ^# l( }. j2 j( o0 a6 H
recovery相关参数
' \9 u" K- y0 n: @/ L( A9 {% T9 h3 ^
复制代码
+ S9 Q: S# _( T" o, ?osd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。
% |4 E4 R. E( O) N2 i2 b# Kosd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。; c+ u7 w' y: Q! a5 y- V, z' d5 i3 P
osd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。
. z% g1 T: [1 ?, h4 s/ Gosd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞% S  K% i, d/ G5 o
osd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值
; H( t* b( w' V$ A+ qosd_recovery_sleep: 默认值0. revocery的间隔4 }4 u0 j6 e- A
复制代码
& Y4 J2 Q+ w/ Q. s  F( C ! X" ]4 ~+ a- e: D- d) b
1 I8 a% q1 y  t7 u
默认配置参数:
$ [7 j5 l  s' I+ A% m! S"osd_max_backfills": "1",1 j. ~. ~$ h  J. g" n
"osd_recovery_sleep": "0",
, F9 A9 Y; |. H. [: d6 W5 y"osd_recovery_max_active": "3",
3 u6 o( Y& {4 u- \, t"osd_recovery_max_single_start": "1",; X/ X8 v# Z' F8 ^. d8 F1 j6 @  e
2 _3 d3 j1 U9 ~- Y  ~
& i% C- S' D9 m$ F9 f1 ~( U
推荐配置参数:
) F- G: i' v7 l9 ?3 g级别:
; q. n0 S/ X- Q3 A9 J; {5%是业务优先,对业务影响最小;' f! x* i+ p9 y) m5 T- L( s  X
100%恢复优先,对业务影响最大;& e- z$ w6 S$ }& _2 [
其他介于二者之间;+ a6 ^4 L( X' ?3 k" q1 }
2 A3 K* z' x# E' [6 f" d8 \! a
osd_min_pg_log_entries 正常情况下PGLog的记录的条数,- e5 F( `/ X6 G, M3 `; A4 I
osd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2022-8-13 16:18:32 | 显示全部楼层
15.1 服务相关' J! _3 s' O/ i* t4 z9 M3 e
systemctl status ceph*.service ceph*.target #查看所有服务
1 m, j$ |  @  y! |3 K  e3 t2 Q. v8 lsystemctl stop ceph*.service ceph*.target #关闭所有服务8 N1 R! W- d" {, f+ c- c3 G/ h
systemctl start ceph.target #启动服务
- k3 G; G8 ^& W: p6 r. Bsystemctl stop ceph-osd*.service # 关闭所有osd服务
  G3 j  o& @, F0 t- esystemctl stop ceph-mon*.service #关闭所有mon服务
/ [# B' Y$ Z& usudo systemctl start ceph-osd@{id} #启动单个osd服务9 R8 `; i( P2 J$ ~( \
sudo systemctl start ceph-mon@{hostname} #启动单个mon服务+ i% p, e+ `6 y5 N2 `
sudo systemctl start ceph-mds@{hostname} #启动单个mds服务4 [( M( t: M( t- W5 A5 b4 U
15.2 查看% p( F6 H+ b6 o- \7 g- F
ceph -help #查看命令帮助. Q( d' B- {+ W+ B
ceph -s #查看状态
) c( v) r8 F( o; ?9 N- Kceph osd pool set rbd pg_num 1024 # 修改pg_num数量
' Z: M  c4 ]: A8 ~ceph osd pool set rbd pgp_num 1024 # 修改pgp_num数量" W2 _, S* \+ i0 t
ceph osd tree #查看osd树列表) G. Q) O( O8 t/ K
ceph osd pool ls #查看所有的osd池; I# [% G# i& c( T
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show # 查看指定的osd运行中的所有参数6 J) y  z7 q1 \# J1 h5 Q
rados df #查看储存池使用情况& x! D9 h; S2 r5 w, b
rados -p rbd ls |sort
7 m1 c, l# p) P2 l" v/ l+ Jceph osd pool get rbd pg_num& {" b% C$ }) ?- N9 k4 ^3 k. [
ceph osd pool get rbd pgp_num
% s" E: c& P: x! ^# fceph osd pool set rbd pg_num 1024* O$ F5 n/ _5 A- P
ceph osd pool set rbd pgp_num 1024# f% c$ b% O8 e) ]8 v3 W
15.3 rbd相关- i* C) O4 o$ e- v; _# F
rbd create --size {megabytes} {pool-name}/{image-name}
" O) k- Y; M7 z7 I( }* ?/ hrbd list
6 _0 I9 |# C9 ]' J5 y7 ]# Irbd info RBD_NAME1 `* ^& K8 v# I! s8 {5 P# W
rbd feature disable RBD_NAME FEATURE1 FEATURE1 …
" G- f# e# W5 a* ^rbd map RBD_NAME #映射到系统内核
. ~5 i+ ~, {: X, r; u, irbd showmapped #查看rbd映射条目' M5 r3 R% i4 Q! T+ s' r: {
rbd unmap /dev/rbd0 # 取消内核映射
$ b7 s0 w8 A! ~# w. g0 k( H6 U7 v2 erbd resize --size 2048 RBD_NAME # to increase9 f2 Q* P& w% f( \, G
rbd resize --size 2048 RBD_NAME --allow-shrink #to decrease8 V% r& w1 O0 S3 L8 W
rbd du {RBD_NAME} -p rbd #查看某个或所有Image的容量,-p 指定pool名
* b, ~9 J& `% Crbd diff RBD_NAME | awk ‘{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }’ #查看rbd image当前占用大小
+ h1 B1 o; D1 l3 z$ B15.4 修改
8 k) V% a" p  Fceph tell # 使用tell命令手动临时修改组件的配置
2 h5 c( G6 B+ x1 e6 R8 J[例如:集群状态恢复涉及数据回填时,加速回填速度]
' c! P, v1 r2 o" k
0 C! d3 \! T# Z) m3 H; iceph tell ‘osd.*’ injectargs ‘–osd-max-backfills 20’ #默认为1% w+ P8 ?3 A. B4 f" k4 E- e
ceph tell ‘osd.*’ injectargs ‘–osd-recovery-max-active 10’ #默认为3: X4 ?( u, U' B
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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