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

ceph分布式存储 recovering速度控制

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2022-8-11 09:01:04 | 显示全部楼层 |阅读模式
集群中剔除了一个osd,没有新加入,进行了一次pg的均衡,做完均衡后集群出现· Degraded data redundancy: 256 pgs undersized
: I3 _' P. }2 k,为了保证集群的pg副本数为3,需要新添加一个osd来做pg的均衡# r% ]- d! X- `( c, R5 X6 l/ L
6 o8 O* \# k2 i6 X! I

, b. h7 f( B. y2 Q* o! q
& [' K4 B7 ]/ i
' S+ A* w3 J( r" z
ceph集群中osd的recovery的相关参数
; S0 O+ [% E! p* m( m[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd
7 m, V% y( j# g: X    "osd_allow_recovery_below_min_size": "true",$ ?& @- [; C8 L3 x
    "osd_async_recovery_min_cost": "100",
8 ~4 I) y" _- I  N+ }    "osd_debug_pretend_recovery_active": "false",  L# i5 a, l4 }
    "osd_debug_skip_full_check_in_recovery": "false",+ _* t4 z2 R" q( O. t$ t# }1 F
    "osd_force_recovery_pg_log_entries_factor": "1.300000",5 C2 O' E: H8 s6 k) E, U
    "osd_min_recovery_priority": "0",
) g4 o6 T: G, J8 j# t" X3 J    "osd_recovery_cost": "20971520",4 a3 k/ c0 p3 v) u
    "osd_recovery_delay_start": "0.000000",( \' [7 C5 t" p  _' U) i
    "osd_recovery_max_active": "3",* ^/ U9 x; T, W: X
    "osd_recovery_max_chunk": "8388608",
5 P9 Z8 |% D; B9 ^    "osd_recovery_max_omap_entries_per_chunk": "8096",
5 e5 \1 o* l" p* W; t% l4 O    "osd_recovery_max_single_start": "1",
$ a. N: ]6 Y, S/ c. E# y    "osd_recovery_op_priority": "3",' \0 Q8 [$ t* P* C, B! ~/ ~
    "osd_recovery_op_warn_multiple": "16",
- L" \: G! ~% b1 E( \1 F) {    "osd_recovery_priority": "5",# j7 U% u  u3 C) g/ V
    "osd_recovery_retry_interval": "30.000000",
! h) F8 w. c& s) m1 J. C    "osd_recovery_sleep": "0.000000",
; F3 T) }" J5 p( n! m2 A5 `& C% @    "osd_recovery_sleep_hdd": "0.100000",
. M2 X2 M! o  ^5 y6 p    "osd_recovery_sleep_hybrid": "0.025000",9 K" i/ V/ O+ R: q9 F, U
    "osd_recovery_sleep_ssd": "0.000000",
' Q3 }6 n9 M8 I/ g9 t, c2 k    "osd_repair_during_recovery": "false",7 E! x  Y( R8 J5 `4 c. L% C' v
    "osd_scrub_during_recovery": "false",& n# o. K5 Y4 I3 o! P

* t9 [7 V) P1 `" H! _; r[root@ceph-1 ~]#  ceph daemon osd.0 config show  |grep recovery|grep osd
2 `6 g9 c' J" v. S. [$ A    "osd_allow_recovery_below_min_size": "true",, X" n/ L+ I  n, @- s2 b
    "osd_debug_skip_full_check_in_recovery": "false",! `( ~% C- t& D9 P! U- k" o3 ]& M" A
    "osd_force_recovery_pg_log_entries_factor": "1.300000",/ I- g' X( T+ C' r8 b+ a- W
    "osd_min_recovery_priority": "0",3 N1 b0 W/ v7 l; ]  @8 {! Q
    "osd_recovery_cost": "20971520",
4 ?4 |$ J' z5 X+ J, t    "osd_recovery_delay_start": "0.000000",0 D& c. o, L+ `1 e7 H, \  b! i
    "osd_recovery_forget_lost_objects": "false",1 Z5 o7 ]" X% B& d
    "osd_recovery_max_active": "15",
. f) K0 s; ?2 a' U# i) u- ^    "osd_recovery_max_chunk": "8388608",5 [- X: n9 E$ K0 y
    "osd_recovery_max_omap_entries_per_chunk": "8096",
# Y6 T0 Y% d+ l1 p) K! `8 y    "osd_recovery_max_single_start": "1",( l/ l* O3 g# J4 u5 k9 F1 B- l- }( i
    "osd_recovery_op_priority": "3",* w  G' @% g5 h. J/ y8 R
    "osd_recovery_op_warn_multiple": "16",3 o+ R; Y" o- g5 D$ X7 r* X
    "osd_recovery_priority": "5",. {; b2 q2 R9 {
    "osd_recovery_retry_interval": "30.000000",4 q  ^& D8 \0 L1 W
    "osd_recovery_sleep": "0.000000",
- J* q2 q7 ?1 T. _" `, E4 v    "osd_recovery_sleep_hdd": "0.000000",
- F/ q& F' g+ E- f% I6 l2 |* E- O  e    "osd_recovery_sleep_hybrid": "0.025000",
7 H7 n3 f: f0 p! q: H# F4 ]    "osd_recovery_sleep_ssd": "0.000000",4 I. f. h3 B0 G. b
    "osd_recovery_thread_suicide_timeout": "300",8 i! J) F2 x  [. `8 }: T* f4 @& U
    "osd_recovery_thread_timeout": "30",
! f, i( C- i* i) t    "osd_recovery_threads": "1",
( f) n6 F7 \/ b, Z* {! G3 {    "osd_scrub_during_recovery": "false",$ G6 J6 K* Z+ P' {. g) s  ?, Y

3 Z6 K9 A  H7 u( G
: b+ z5 n# o( v/ c4 s加快Recovery的速度
; D8 Y* v) ^% u+ G// 集群中添加一个osd, ceph-deploy osd create  --bluestore node1 --data  /dev/sdg    --block-db cache/db1 --block-wal cache/wal14 `* m9 R: \% y0 q
, u6 B/ ]6 [1 J/ J
// 查看每个osd节点的参数,或者通过  ceph daemon osd.x config get osd_recovery_op_priority 查看单个osd的参数( ^- r' a* u8 f

. e* }; G6 t4 m4 x: _[root@ceph-1 ~]# ceph daemon osd.0 config get osd_recovery_op_priority ) Y* f( v, T* p2 Q7 t; ]0 x
{0 D) D% Q! ], J8 q/ E
    "osd_recovery_op_priority": "3"
1 L# O2 W; j5 l7 ^1 G: R}+ P/ R1 [. \2 C0 Z

+ X/ ?& s8 `2 h5 T7 Z, {' t, {9 P" c
& I/ k: ~: j" q7 e9 R2 I% H6 Y, V! X' r" D9 J5 [' D

+ K5 d6 m/ [2 }- `2 f
+ s# v/ z0 \: p9 I! Q4 {* v. O[root@ceph-1 ~]# ceph daemon osd.0 config show |egrep "osd_recovery_max_active|osd_recovery_op_priority|osd_max_backfills"
! n- j) ^( L9 L1 w/ B* O3 Q3 `    "osd_max_backfills": "10",
0 a" m; w/ V7 E- R- }    "osd_recovery_max_active": "15",* T! m6 T. [3 j
    "osd_recovery_op_priority": "3",# X6 A' k) F/ K9 Z0 Z/ l

# U8 v7 x' n" E//每个osd节点执行如下的参数调整或者通过
# o1 O* J6 q8 Q$ Fceph daemon osd.2 config set osd_recovery_op_priority 1 9 B4 H( o$ Z& i) B3 L( o) @9 h
[root@ceph-1 ~]# ceph daemon osd.0 config set osd_recovery_op_priority 1
/ `! s! N4 u/ J. C6 `9 q1 `( Z# @' {{" X, G' S' E: J; a1 p
    "success": "osd_recovery_op_priority = '1' (not observed, change may require restart) "
, k' ^" t8 B; `; @( I}% ]9 E# |: d$ _
$ Y; c$ O4 N- A$ ^
, q2 x6 U6 O1 j! T( l) R1 A4 `
全部osd参数设置为0:
! F3 e9 `* o) C& i' J: C# E[root@ceph-1 ~]# ceph tell osd.* injectargs --osd_recovery_op_priority=0
# ?# g; I7 R$ [: vosd.0: osd_recovery_op_priority = '0' (not observed, change may require restart) 5 j! Y8 Q. q) X6 k
osd.1: osd_recovery_op_priority = '0' (not observed, change may require restart)
4 a. t3 j8 x7 K8 a: X7 h0 V; `( iosd.2: osd_recovery_op_priority = '0' (not observed, change may require restart) 8 S7 A: w0 a3 t1 M* T
osd.3: osd_recovery_op_priority = '0' (not observed, change may require restart)
1 \' W: `( L- L% n  Kosd.4: osd_recovery_op_priority = '0' (not observed, change may require restart) 1 \. q2 i; x7 K5 E% a$ s
osd.5: osd_recovery_op_priority = '0' (not observed, change may require restart)
, g2 q  Q4 I! B4 J4 [0 z) B5 }. t, ~6 E, \! k( x7 H$ H
get osd参数值:
5 q& _; O4 S! O$ N2 R2 T7 A[root@ceph-1 ~]#  ceph daemon osd.0 config get osd_recovery_op_priority7 b, q. v- y; o
{
* h5 A4 C/ ^8 t# l    "osd_recovery_op_priority": "0"+ Q* h  |6 F& g) `/ s) |
}1 x4 f( t4 Z) f0 T
( o8 a! d4 h, _
使用这种方式设置,不需要重启osd服务,直接生效:% X# c" N& U- H3 ?3 s1 _# Y# s  W
来设置: u8 L: X; j/ d3 w2 [" N. J8 ^
ceph tell osd.* injectargs --osd_max_backfills=128
: i9 c2 A' I( Wceph tell osd.* injectargs --osd_recovery_op_priority=0
$ c! t0 ?/ {! wceph tell osd.* injectargs --osd_recovery_max_active=64
* l0 {) K6 \7 L8 m& @' Sceph tell osd.* injectargs --osd_recovery_max_single_start=64) }% v, z1 o9 Y- v6 j8 i" F
ceph tell osd.* injectargs --osd_recovery_sleep_hdd=0* l' @. r  f) ~3 n! C
, |- M4 G" \! z' w( Z$ X3 I

6 j, E5 \1 w! r5 \2 f) x- G; \. x, Z* ?- _* ]% Q
核心影响恢复速度的参数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.
1 Z# x( e' R  S! M$ M3 h% I3 ^& r这个值限定了每个pg可以启动recovery操作的最大数。4 ^: g/ {" A$ N
第一种情况,配置osd_recovery_max_single_start=1,osd_recovery_max_active=3,这代表每个osd在某个时间会为一个pg最多启动1个恢复操作,并且最多可以由3个恢复操作处于活跃状态。1 d* \: x$ x' {
第二种情况,配置osd_recovery_max_single_start=2,osd_recovery_max_active=3,这代表某个时间点osd会为一个pg启动2个恢复操作,并且最多能有3个恢复操作处于活跃状态。osd_recovery_sleep_hdd每个recovery操作之间的间隔时间,单位是ms' |1 }9 _8 Z7 T, L- A& ]% W

. Z- D( S! j8 a1 s$ ?5 J+ x/ F! L3 N9 j3 {
) g' F& F$ y. x) C' h* ^5 U7 g  r

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2022-8-11 09:15:46 | 显示全部楼层
Ceph在扩容或缩容期间会有数据rebalance。如何控制在rebalance时,尽量降低对client IO的影响?
4 Q* r7 H% x# S; x7 \  _4 H本质上,用户数据写入ceph时,会被切分成大小相等的object,这些object由PG承载,分布到不同的OSD上(每个OSD一般会对应一块硬盘)。数据的迁移会以PG为单位进行,所以当PG发生变化时,就会有数据rebalance。6 ?7 W8 D1 |( I
后端的数据均衡IO会对client的IO造成影响从而影响到集群的业务IO,所以我们需要对数据均衡IO进行控制,主要是业务优先和恢复优先。
7 a$ |0 ~$ |3 g4 V  n5 a- R( g3 s那么在什么时候PG会变化呢?  `" E, R) [) P
从用户使用角度讲一般有如下几种场景:: W% L" ^+ M5 S+ @. g, |- F8 b4 I
1、osd暂时下线,然后又上线2、osd硬件故障下线,更换硬盘重新上线7 \0 Z* V3 U5 b$ K, [8 E& j) g1 O& G

* W. c8 h/ P- d2 m! A; P! s: f' j无论哪种情况,osd上线后通常会发现,自己承载的pg有数据落后了,需要进入恢复模式,从其它osd上获取新的数据达到同步。这个过程就是recovery。
' A1 \( w# q  H( G6 F& a* erecovery分为两种:
- f: Y+ k/ C8 X5 e) ~log-based recovery: 是说osd故障时间不长,需要恢复的数据可以通过pg log回放找回来。backfill recovery: 是说无法通过pg log回放找全数据,只能通过全量回填(backfill)拷贝。
; ^" {1 J; V' ^6 s" Z- ~
: ~6 w( T$ c. g( e! L操作前记得查看下默认参数值,操作完后记得恢复到原先参数8 I$ f- D( q+ ~* m5 i

; A; p% \4 g1 }: b/ X7 ^7 @业务优先:; _7 K' K8 s( y/ V% ]. O
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'' f6 z/ y* M1 J1 a9 T

: N% Y1 s* w* [$ L5 S% V恢复优先:' y! n8 m; ^' |
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'7 Z# m, @$ d: ^- ^% \' S; j
" @; G3 E3 }' C. D% g6 \/ s: r$ X/ O

( j; f( m$ R3 C3 C8 z7 ~9 r% Z还原配置:# V% J1 `  j: M
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'
4 F* T& a9 j2 ~8 J8 A+ J' K
# j  v* |6 Y5 `1 w" b! P/ M) v' W
场景三:完全保证client带宽" ]0 b5 c* \! E' R
在极端情况下,如果网络带宽及磁盘性能有限,这个时候为了不影响用户体验,不得不在业务繁重时段关闭数据重建及迁移的I/O,来完全保证client的带宽,在业务空闲时段再打开数据重建及迁移,具体操作如下:
0 k: C* I. d6 l  P2 J, A8 M/ n, Y- D& E9 H1 J
在业务繁忙时,完全关闭数据重建及迁移:# y% t9 w9 @7 E2 ^
ceph osd set norebalanceceph osd set norecoverceph osd set nobackfill
/ S2 A) N6 \$ q) @; `' G; j
. n: f. a- k2 N3 y
8 D+ ?3 o$ Q* B7 |5 H4 q' Q
$ d, F/ {& G1 l- V- `  C
在业务空闲时,打开数据重建及迁移:5 l  W$ S2 ~6 J
ceph osd unset norebalanceceph osd unset norecoverceph osd unset nobackfill
, G( y( W" Z  `: M+ [# p  o' v/ g. J1 ~' E6 T& }

0 P) k8 \6 ?- y4 W" E/ n: M3 F6 Z9 h1 z: P8 x1 C
以上前两种方案操作配置均为立即生效,且重启服务或者重启节点后失效,如果想长期有效,可以在进行以上操作立即生效后,修改所有ceph集群节点的配置文件。
( J( `! c% P/ [9 I
注:查看现有recovery配置信息,这里的133为具体osd的id号
[url=][/url]2 b9 d6 x9 X9 B2 T  }' o
ceph --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]
. p- o) a& ~5 O2 k

, ?8 R4 W, _8 Z9 k% e3 o6 |" S
6 Y. N; [' y' _1 H% L" C
扩展:参数解析

' z0 \# D9 ^' x; c$ C! X7 @9 Kosd_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的时间间隔;- Y3 M. a( |  J) r. {+ O

2 \. Q& K3 l/ }5 H/ Z
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:
osd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;, [  b" o( F0 x* q7 j" C9 }1 d
' b) @4 a5 @* [% q3 I5 f
这两个参数需要结合在一起分析:
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 恢复操作完进行新的恢复。
& \' J$ V& n  j
; {, }) J& _9 N
recovery相关参数
[url=][/url]5 F* P+ \7 \+ T. z, ~
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]( D) t7 `) r: x
! U% E5 B7 v" g8 R. J( p8 S3 o) k

% r3 y9 e% \$ S. U默认配置参数:+ Y  z! O3 Z- D$ S% \" Q1 |' B
"osd_max_backfills": "1","osd_recovery_sleep": "0","osd_recovery_max_active": "3","osd_recovery_max_single_start": "1",, A% J' W2 |- I. A
2 @7 ~8 G% K  `! a3 J  Q; V/ e$ |
推荐配置参数:
4 r% A4 m2 i; W; T) z4 i' s" i级别:% X. u- s1 t! A0 q# U
5%是业务优先,对业务影响最小;& P# Y! b8 X+ h
100%恢复优先,对业务影响最大;7 q: ^6 @7 P) S$ V8 \7 B
其他介于二者之间;6 W3 c' _  o% c% _, \9 U4 o6 s

# R5 y% I$ d. t7 @" nosd_min_pg_log_entries 正常情况下PGLog的记录的条数,
% e' i% S9 {: B8 q7 ^( r" xosd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作
9 a% ]; A; r; x; V  O' s
! W7 [& Z. e" L

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2022-8-11 09:21:52 | 显示全部楼层
部署一套可供生产环境使用的ceph集群,考虑的问题比较多,特别是配置文件的配置量参数。这里记录调试后的配置参数:
5 ~% N2 U5 y0 v9 I5 w# ~# C9 _6 H& w# _- s1 D8 {# W" m
[global]) J- l4 y. `4 ~: y, D( S. n+ \

  z) r/ R4 G$ F  c0 Z# sfsid = 1235bE62-8ae1-difg-893a-892a675757c6
& r- H2 e' x5 _
) R1 _% ~. e5 F( Z5 o1 Q1 tmon_initial_members = ceph-node01,ceph-node02,ceph-node03
3 V  M$ b# P& l) c% j6 h" l8 t4 U
7 B+ U# e( k& Y1 O0 Bmon_host = 192.168.170.11,192.168.170.12,192.168.170.133 s' ?; J1 z* m- i5 P

8 b- U/ ]8 q/ ?4 l$ B4 `auth_cluster_required = cephx
) G- n. t; p/ E6 x% C
, h- Q# Y  ~. \& C/ Xauth_service_required = cephx
/ W; H- B/ Z/ J7 E. e7 Y" t# d' @# M$ {: p
auth_client_required = cephx; ~( d$ O% u' T! R& x6 z

( I9 h: A7 X: ?$ c9 j5 Fpublic_network = 192.168.170.0/22 #管理网络
% m9 ~, C! `  d, x+ D( k
- k, h  G7 ]. m% f- P- b1 \( ?( }cluster_network = 192.168.180.0/22 #集群网络
* G/ U* q9 T+ q6 Z7 g& E: d& {, O; \" P! w; b* v
mon_pg_warn_max_per_osd = 1000 #每个osd上pg数量警告值,这个可以根据具体规划来设定
3 `( k  Y# L# K; s  d8 m
* K% d  ^# m, P) H1 L3 \2 l" }osd_pool_default_size = 3 #默认副本数为3
( u  o7 u' ~* @, ^; e& D9 d. R8 i' Q  Z0 a
osd_pool_default_min_size = 2 #最小副本数为2,也就是只能坏一个
8 z2 f% B8 g) ~: u8 }" D
# C% r, V  v7 w  ?; o! {mon_osd_full_ratio = .85 #存储使用率达到85%将不再提供数据存储
2 ~3 ?/ p3 E( b6 ?7 q
, n+ D3 \3 s6 G5 M: y$ @mon_osd_nearfull_ratio = .70 #存储使用率达到70%集群将会warn状态) f5 X- X( R7 f% n8 S

( x* Z7 w! L$ Y5 z+ e8 R1 Aosd_deep_scrub_randomize_ratio = 0.01 #随机深度清洗概率,值越大,随机深度清洗概率越高,太高会影响业务
, \# b6 |4 C" {" y
7 ^  J2 |4 `8 F4 f[osd]) e3 {6 }" o% \. \8 Q
+ i6 L+ l/ `. Z; d
osd_max_write_size = 1024 #默认90M,一次写操作最小值
$ j& g) A" R& J4 e, \
- i, l# t3 d9 `, ~# N0 Xosd_recovery_op_priority = 1 #默认为10, 1-63 osd修复操作的优先级, 。值越小,优先级越低
3 J9 H) @5 e! `, s) S+ Q
* o/ D6 F% P0 k3 X- ^2 e! yosd_recovery_max_active = 1 #限定每个osd上同时有多少个pg可以同时进行recover
8 H5 [: S* S9 r9 i
/ o/ W/ G: V1 t2 E$ Q; V* nosd_recovery_max_single_start = 1 # 和osd_recovery_max_active一起使用,要理解其含义。假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG启动一个恢复操作,而且最多可以有三个恢复操作同时处于活动状态。
6 A* E/ v9 d. l4 U% V( g: P6 n2 v! P0 J  S
osd_recovery_max_chunk = 1048576 #默认为8388608, 设置恢复数据块的大小,以防网络阻塞# Z1 a& C  {. Q# e# U2 [; y, d5 L& H
+ U+ {& e) q9 L+ p$ c: L% [
osd_recovery_threads = 1 #恢复数据所需的线程数, ]* @+ C2 |( R  m2 t- {
6 Q1 `) Y4 R- A1 ]: M. A2 a9 {8 ~
osd_max_backfills = 1 #集群故障后,最大backfill数为1,太大会影响业务& J' X0 j3 x; t" J& |7 ~& ^/ o

& u+ `1 t2 S3 n' Bosd_scrub_begin_hour = 22 #清洗开始时间为晚上22点4 C. l0 ]. a; R* r9 n

1 F- v( |  @/ k; e, Fosd_scrub_end_hour = 7 #清洗结束时间为早上7点0 ?9 u/ k/ \3 m& {# ^9 Q. [9 \, c- v8 z
' [, y0 p& o4 F# A
osd_recovery_sleep = 0 #默认为0,recovery的时间间隔,会影响recovery时常,如果recovery导致业务不正常,可以调大该值,增加时间间隔+ z) R3 M. _1 D, s) P+ @+ U0 Z

0 e2 d5 U( u; t# L' v4 ^( tosd_crush_update_on_start = false # 新加的osd会up/in,但并不会更新crushmap,prepare+active期间不会导致数据迁移
6 E. a  R2 Z9 C; C# S  s# q1 u8 e8 N2 Z8 E
) j" q* a9 d$ d5 K8 F5 Y' q9 b
, N5 ?1 j" e, i: g6 u) P; X8 f# n

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2022-8-11 11:35:51 | 显示全部楼层
参数解析7 y6 ?% b% k5 t. c9 H/ j

" _; [! _1 g  t/ j- E0 K7 ? 8 r! j% [2 d% z  K2 l2 Y$ [2 B
7 A% B$ y& }. M, X' }/ i+ j
osd_max_backfills : 一个osd上最多能有多少个pg同时做backfill。其中osd出去的最大backfill数量为osd_max_backfills ,osd进来的最大backfill数量也是osd_max_backfills ,所以每个osd最大的backfill数量为osd_max_backfills * 2;3 v7 }6 K3 @/ W2 z1 c$ A* {9 s/ H
osd_recovery_sleep: 出队列后先Sleep一段时间,拉长两个Recovery的时间间隔;
! A- A% x, u+ T1 x; v: J
; v+ F+ I! g- f; m- ]  L# d3 b/ N' v* \& h+ ]9 Y5 J; z1 J
以下二个参数,网上解释大多有误导,结合代码以及官方材料分析为:# ^! C9 o7 T/ o4 _5 }4 F" h) z

* u" w0 k% d4 I6 Xosd_recovery_max_active: 每个OSD上同时进行的所有PG的恢复操作(active recovery)的最大数量;1 f9 b6 T0 w& N8 F- t+ E
osd_recovery_max_single_start: OSD在某个时刻会为一个PG启动恢复操作数;
/ j1 O% S" e* G2 U! L7 `$ h
+ B+ Q8 M# i' m* r* U
. a; e4 u( T& ^  ~3 D7 L7 q这两个参数需要结合在一起分析:8 c0 \3 S- h4 `: q

. D+ @- q- ]* v: Q0 qa.假设我们配置osd_recovery_max_single_start为1,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动1个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。
% t) P' w8 W# J# Y' r/ lb.假设我们配置osd_recovery_max_single_start为2,osd_recovery_max_active为3,那么,这意味着OSD在某个时刻会为一个PG最多启动2个恢复操作,而且最多可以有3个恢复操作同时处于活动状态。例如第一个pg启动2个恢复操作,第二个pg启动1个恢复操作,第三个pg等待前两个pg 恢复操作完进行新的恢复。
$ N4 c3 s9 T: [/ z) D1 I9 [ 3 G& z& n+ k! m. g  y9 M' R
( K: O8 k& `, E" l# m4 [
recovery相关参数2 r4 H6 {: I0 M

% c% {. h+ k# ^) f" ~复制代码
/ H" R" q' P5 e  I* X+ vosd_max_backfills:默认值10. 一个osd上承载了多个pg。可能很多pg都需要做第二种recovery,即backfill。 设定这个参数来指明在一个osd上最多能有多少个pg同时做backfill。
" u( b- {: G* t' o1 S6 L3 W$ B4 }osd_recovery_max_active:默认值15. 一个osd上可以承载多个pg, 可能好几个pg都需要recovery,这个值限定该osd最多同时有多少pg做recovery。
' G9 t  q- q& r; Iosd_recovery_max_single_start:默认值5. 这个值限定了每个pg可以启动recovery操作的最大数。
$ f* t+ u' s5 H2 h" cosd_recovery_max_chunk: 默认值8388608. 设置恢复数据块的大小,以防网络阻塞
4 E: M3 M! Y0 s( F3 uosd_recovery_op_priority: 默认值10. osd修复操作的优先级, 可小于该值
3 T4 \8 H6 [+ ]  W# zosd_recovery_sleep: 默认值0. revocery的间隔8 _; S% F* L$ r" D, d: K
复制代码0 Y7 m, X0 r0 m6 L

+ t. f: t5 a, B' S
. @% {7 J/ k8 U* x# i" [默认配置参数:& {1 {+ n8 }  E; @" E* ~0 H. ?1 J
"osd_max_backfills": "1",
! `, U$ _" d) `4 n( _. q1 j"osd_recovery_sleep": "0",
6 |0 E4 ]( K2 ~' o- J! u"osd_recovery_max_active": "3",. v5 `+ f$ N* n' B) q- J
"osd_recovery_max_single_start": "1",5 ^+ f  C0 R2 z
1 l  p. o1 h" J/ F2 R

  |% \" o4 W0 U( g推荐配置参数:
! Z, E2 V2 u+ a! e级别:
9 B3 O( ~# @+ O4 v3 \. v& s5%是业务优先,对业务影响最小;
, C: |+ o4 b2 K7 j/ G; o* A100%恢复优先,对业务影响最大;
# |7 C0 x! g& b  ]. Z5 I5 |  U' t* v其他介于二者之间;
$ ~  `8 K7 x" E1 V  g  W, k7 |9 I* o
8 f" `  T- N4 V( ]osd_min_pg_log_entries 正常情况下PGLog的记录的条数,
: i& k/ ^! W2 B% b6 I* Z2 Rosd_max_pg_log_entries 异常情况下pglog记录的条数,达到该限制会进行trim操作

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2022-8-13 16:18:32 | 显示全部楼层
15.1 服务相关6 K' ?7 E2 H+ E4 Q! m
systemctl status ceph*.service ceph*.target #查看所有服务3 ]; p5 p1 u& X8 R' Z% M
systemctl stop ceph*.service ceph*.target #关闭所有服务+ t4 R; m* [+ Y0 f
systemctl start ceph.target #启动服务
% N/ e5 t" W' {3 @systemctl stop ceph-osd*.service # 关闭所有osd服务, }3 V& m! y4 m) }9 R. E
systemctl stop ceph-mon*.service #关闭所有mon服务
' N& [8 }- f7 {7 @sudo systemctl start ceph-osd@{id} #启动单个osd服务2 |% |: }' s9 h  E
sudo systemctl start ceph-mon@{hostname} #启动单个mon服务: O9 s0 Q$ K1 t9 w) I
sudo systemctl start ceph-mds@{hostname} #启动单个mds服务
2 S) h6 F' I, u/ N3 Q15.2 查看& L+ d; y) f# r" y. O8 ^9 o0 n
ceph -help #查看命令帮助% W; E3 R9 C+ x* G, |6 U
ceph -s #查看状态1 D: w2 ]: v& j# }& I/ A% w1 [: C5 e
ceph osd pool set rbd pg_num 1024 # 修改pg_num数量
! O, V0 w2 s) j$ E, l4 ^' s7 q/ ?ceph osd pool set rbd pgp_num 1024 # 修改pgp_num数量8 S6 ?( z' O: [* M) Q1 ^4 ?0 ~
ceph osd tree #查看osd树列表, h. A, B" Q3 x. r+ P, J
ceph osd pool ls #查看所有的osd池
$ U  w' h" f' j# r+ i  s6 u* d# Qceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show # 查看指定的osd运行中的所有参数
% R- y% H% w8 \; X9 K: Rrados df #查看储存池使用情况
+ b6 @& Y. v- m& W' Hrados -p rbd ls |sort
4 T3 i( O5 p% j" y4 n& Lceph osd pool get rbd pg_num; e: }' i0 f$ J, [8 [0 ^# }- s
ceph osd pool get rbd pgp_num& r- y9 C" O" t% i; B
ceph osd pool set rbd pg_num 10243 j7 f! ^: w6 \; y/ @% }# c
ceph osd pool set rbd pgp_num 1024
. f9 i& S+ H9 O1 A15.3 rbd相关1 _4 C& D" e" |! a/ c8 ^
rbd create --size {megabytes} {pool-name}/{image-name}9 `; t' U9 [2 y6 R9 w! v
rbd list- a. j5 E( Z8 X3 A
rbd info RBD_NAME/ Z( T; ^: a, {
rbd feature disable RBD_NAME FEATURE1 FEATURE1 …
/ D; ~( s1 M# _+ O0 l2 Crbd map RBD_NAME #映射到系统内核
8 y$ s1 f! }' c+ Crbd showmapped #查看rbd映射条目: B4 E! q) z' R
rbd unmap /dev/rbd0 # 取消内核映射
& q8 O5 q. z. hrbd resize --size 2048 RBD_NAME # to increase
; ?2 ]/ }& z$ E2 Frbd resize --size 2048 RBD_NAME --allow-shrink #to decrease
" H* b% `6 i( `0 r$ q3 ~4 xrbd du {RBD_NAME} -p rbd #查看某个或所有Image的容量,-p 指定pool名% r: e6 N+ e0 a% {7 d  o7 e
rbd diff RBD_NAME | awk ‘{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }’ #查看rbd image当前占用大小/ M0 \' @6 u3 K' ]4 |1 t% R% v
15.4 修改
& Q" @" q' C! ?( x& Tceph tell # 使用tell命令手动临时修改组件的配置
, Z' I7 L0 S, I6 i/ F! O! B8 {2 v[例如:集群状态恢复涉及数据回填时,加速回填速度]
! y" o5 h; q$ W! {+ z
6 `3 i/ T- f6 ]0 D  tceph tell ‘osd.*’ injectargs ‘–osd-max-backfills 20’ #默认为1
/ J2 \. k# m, Aceph tell ‘osd.*’ injectargs ‘–osd-recovery-max-active 10’ #默认为3
1 J! W8 }- o' g0 ^+ `) F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 22:57 , Processed in 0.040085 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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