找回密码
 注册
查看: 3056|回复: 0

ceph 常见的问题处理

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-7-5 15:59:42 | 显示全部楼层 |阅读模式
1.  修改 OSD CRUSH weight: ?3 P. ~7 b) b  Z" n' F
1.1  问题描述* ]6 A; x0 R/ G$ i$ l" }
部署完成后,集群处于 PG Degraded 状态,经查 ceph health detail,发现 PG 的 acting OSD 只有 [0],而不是两个。查 osd tree,osd 日志等,看不出明显问题。8 R- w( A; y8 M! l* y% T
1.2  原因分析
7 f# ^9 ^; P. E( }  ]5 w我的 Ceph 集群的 OSD 的 weight 都是 0!!
5 [3 P" A+ Q6 s! r% B! s2 k0 Y4 y0 Y+ }1 v
[root@ceph1]# /etc/ceph# ceph osd tree
  C% ^. m- ^1 S4 J7 x5 p5 \# id    weight  type name       up/down reweight# R1 I6 P/ ~6 ?+ W6 b9 _- \
-1      0       root default/ z& P4 f6 r$ d' D# ~1 [
-2      0               host ceph1
  z; e! A8 p& h2 V" N7 D! L0       0                       osd.0   up      14 g" H9 k4 S  Y6 r3 i/ l
2       0                       osd.2   up      1( P; R7 o  K* R& K# B+ Q4 ^. W
-3      0               host ceph2. a9 P/ T' O. E* k7 i
1       0                       osd.1   up      1
4 ^% r  n  N! N- T* n$ _3       0                       osd.3   up      1
" I4 G# n9 _6 ]3 J5 {1 S从上面 ceph osd tree 的结果里面可以看到这里有两个weight:weight 和 reweight。这篇文章 有详细的分析。简单来说:
2 r' ^" l, L; V+ E: s$ S% ^weight:即 osd crush weight,表示设备(device) 容量的相对值,比如如果1TB对应1.00,那么 500MB 对应 0.50。bucket weight 是所有 item weight 之和,item weight 的变化会影响 bucket weight 的变化,也就是 osd.X 会影响host。 对于 straw bucket,如果 item weight 为0,则 item straw 也为0,当CRUSH 算法在 bucket 选择 item 时,也就不太可能选中该 item。
6 @0 @1 e& H: V' [# ureweight:取值为0~1。osd reweight 并不会影响 host。当 osd 被踢出集群(out)时,osd weight 被设置0,加入集群时,设置为1。它会参与 CRUSH 创建 PG 的过程。CRUSH在选择 OSD 时,如果发现 weight 为0,就跳过该 OSD。  |. x) k8 c' a4 `) j, e3 ?! X
因此,问题的症结就在于 osd crush weight 为0。至于为什么会这样,以及该值对 PG 分配的影响,有待进一步查明。8 s( j5 J+ R) ^; t
1.3)解决办法:修改 osd crush weight, ?* e! B& k( @8 O

6 I6 s+ K- X7 mceph osd crush reweight osd.0 1$ n8 ?: I+ G, ]1 d- N2 o  [* B6 s
ceph osd crush reweight osd.1 19 F7 K( \, _" q: H1 j* Y3 k4 Q
ceph osd crush reweight osd.2 12 T" J$ ~/ ]5 [9 \0 v7 J, ?
ceph osd crush reweight osd.3 1/ _" q. X$ _" J) N1 s+ q
修改后,集群就回到了 HEALTH_OK 状态。
* ?' d- [+ d( {$ C1 o注意:修改 OSD 的 crush weight 会带来部分 PG 之间的数据移动,这可能会影响集群的性能,因此在生产环境中使用要小心。你可以参考 这篇文章 来看数据移动的情况。: @3 G" H3 }! A3 x
2.  修改 CRUSH tunables(可调参数)
: t% s+ X! Z% v9 B; S- C7 K2.1  问题描述
  G1 E  d; [) }( \" }8 i将 osd.1 设置为 out 后,集群并没有开始做 recovery,部分 PG 保持在 remapped 状态:% u  i4 Y" c! c  q
- J# w' F! `3 D' c
[root@ceph1]# ceph -s' R; x* F3 b4 P4 K, N$ U5 Z0 C
    cluster 5ccdcb2d-961d-4dcb-a9ed-e8034c56cf710 E9 B, Z  r: v/ ^) x4 D- {6 a5 J
     health HEALTH_WARN 88 pgs stuck unclean
( }) P, g/ @) x6 K- ^0 L+ H2 d  N     monmap e2: 1 mons at {ceph1=192.168.56.102:6789/0}, election epoch 1, quorum 0 ceph1
) z/ ?3 F$ J7 s: ~/ O     osdmap e71: 4 osds: 4 up, 3 in9 e' A' a9 H# j9 }! O: L4 J2 n* C
      pgmap v442: 256 pgs, 4 pools, 285 MB data, 8 objects
' l1 `( S- G* L% M# a0 J, B            690 MB used, 14636 MB / 15326 MB avail
7 _# Q) \* q  G" Y( S  l( v                  88 active+remapped
9 F8 _+ z0 t, l! C, L  X. f* S- }                 168 active+clean
9 K, b, q) W6 b1 R7 Z0 G3 H. I/ H2.2  原因分析# H9 R! V3 t- X- y4 ]8 x7 \1 i
->  查看 ceph health detail- @( G6 A! y# Y9 @2 Z' W( F4 D# x3 A
: b( u4 |. n  G! m( \/ C. B" K
[root@ceph1]# ceph health detail
) F; ^( i; M" D# x4 Y4 Z/ P9 GHEALTH_WARN 88 pgs stuck unclean
+ c- U/ X( ?4 B; Npg 1.23 is stuck unclean for 337.342290, current state active+remapped, last acting [0,1]+ z' M0 Q2 N  P1 \" z& E
pg 0.1f is stuck unclean for 336.838743, current state active+remapped, last acting [0,1]
6 ~8 u+ [, M' W7 B" s& z, U5 @" npg 1.1f is stuck unclean for 337.355851, current state active+remapped, last acting [0,1]7 m+ x% A% F# W0 A8 I: S3 {" O% U
Remapped(重映射):当 PG 的 acting set 变化后,数据将会从旧 acting set 迁移到新 action set。新主 OSD 需要过一段时间后才能提供服务。因此,它会让老的主 OSD 继续提供服务,直到 PG 迁移完成。数据迁移完成后,PG map 将使用新 acting set 中的主OSD。
, l  x4 T1 ^0 ^; O3 b  D; \以 PG 为例,比较在 osd.1 out 前后的 PG map:7 X* p. D# L0 q. i
$ t9 R: V# z- K9 x
state           state_stamp                     v       reported        up      up_primary      acting      acting_primary9 `9 O8 c1 ~+ ~7 c, u
active+clean    2016-06-03 00:31:44.220896      0'0     57:74           [0,1]    0              [0,1]       0               #osd.1 out 之前
! h, \* F. R: z, F! q, Pactive+remapped 2016-06-03 00:47:12.703537      0'0     71:109          [0]      0              [0,1]       0               #osd.1 out 之后
4 s* B* q0 D& j! s! m$ y2.3  解决办法3 ~7 {% e2 ]& A8 g7 \! ]
办法一:将 cursh tunables 设置为 optimal* }  A* U2 V9 ?: ^: M: g) @
->  从这篇文章中获得线索,这可能和 crush tunables 有关系。它的默认值应该是 legacy,运行下面的命令将其修改为 optimal 后,集群状态回到正常。; W5 F9 x3 s2 e& v" z5 E
15 I* A( ^  Y& T' F7 @5 ?3 Y! n
ceph osd crush tunables optimal
* s2 }6 i& G5 `->  继续找原因,Red Hat 这篇文章 给出了一些线索。6 q# _+ M( c( n5 E" D2 u" y
在新版本的Ceph 集群中使用 legacy 值可能会有一些问题,包括:7 q- ?9 W  ]$ a0 ?& ~0 X( O6 i5 q
当叶子bucket(往往是 host)所拥有的设备数目很小时,一些 PG 被映射到的 OSD 数目少于存储池的size。这在 host 节点的 OSD 数目为 1-3 时较为常见。
5 E! K4 L4 S+ E大型集群中,小部分的 PG 被映射到的 OSD 数目小于规定的数目。这在 CRUSH 层级结构中好几层(比如 row,rack,host,osd 等)时比较常见。/ v( ^& [- d9 F, S+ q
当一些 OSD 被标记为 out 时,重新分布的数据会更多地在附近的 OSD 上而不是整个层级结构中。
% ~0 ?3 P$ w+ C7 ~  D( E$ P而第一种情况正是我的测试集群所遇到的情况,每个 host 拥有的 OSD 数目在3个以内,然后部分 PG 所在的 OSD 数目较 replica 少一些。4 _* c4 C+ V* r' \* e7 M& r/ j/ b
办法二:将 OSD 的 reweight 修改为 0 而不是使用 out 命令
9 `( z& u( r/ x( C5 n% FCeph 官方的这篇文章 给出了另一个思路。它认为在主机数目很小的集群中,当一个 OSD 被 out 后,部分 PG 限于 active+remapped 状态是经常出现的。解决办法是先运行 ceph osd in {osd-num} 将集群状态恢复到初始状态,然后运行 ceph osd crush reweight osd.{osd-num} 0 来将这个 osd 的 crush weight 修改为 0,然后集群会开始数据迁移。对小集群来说,reweight 命令甚至更好些。
/ g$ O* o1 e' G7 o' Q) Z当集群中 PG 限于 active + remapped 状态时,可以通过 reweight 命令来使得集群恢复正常。当往集群中新加入 OSD 时,为了减少数据移动对集群性能的影响,Ceph 官方建议逐渐地增加 OSD 的 crush weight,比如起始值为0,先设置为 0.2,等数据迁移结束,再设置为 0.4,依此类推,逐渐增加为 0.6,0.8 和 1 甚至更高。在要停用一个 OSD 时,建议采用相反操作,逐渐减少 OSD 的 crush weight 直至 0.* ?2 c+ l) E# R9 p7 B
3.  修改 CRUSH ruleset
) F7 K3 T6 n6 T& \+ D# ^2 W3.1  问题描述2 s( p0 B% W+ j0 N
继续将跟 osd.1 在同意个host 上的 osd.3 out,看看 Ceph 集群能不能继续恢复。Ceph 集群中部分 PG 再次进入 remapped 状态:
% A( b: e+ V( H& d
( Z& N  I# b5 n+ R$ |[root@ceph1:~]# ceph -s
1 g8 R& ~4 a* X. R: L# n% [8 ~    cluster 5ccdcb2d-961d-4dcb-a9ed-e8034c56cf71
. Z6 C$ j/ M3 e  b2 G( q# ?9 I/ p3 S     health HEALTH_WARN 256 pgs stuck unclean
( K% n% ?4 B0 ]; \7 A" i1 K% i6 R     monmap e2: 1 mons at {ceph1=192.168.56.102:6789/0}, election epoch 1, quorum 0 ceph1
9 h! H# t3 S. W: O) R) y     osdmap e77: 4 osds: 4 up, 2 in
& S$ k5 L+ }2 t7 I4 U# q      pgmap v480: 256 pgs, 4 pools, 285 MB data, 8 objects1 O  I* _5 P) s
            625 MB used, 9592 MB / 10217 MB avail2 \! M; R5 T* O/ O
                 256 active+remapped
4 N, D" E1 o2 k8 x4 J; m& ?运行 ceph pg 1.0 query 查看 PG 1.0 的状态:  P7 L7 c8 I) g2 M' q( ?
2 W2 ^/ K6 H2 t$ @, Q5 q0 t0 g
"recovery_state": [/ {. Y: s9 P* E6 l3 O
        { "name": "Started\/Primary\/Active",
% R$ n# ~& |  d0 ?          "enter_time": "2016-06-03 01:31:22.045434",6 K. h6 U9 G: z+ F' W
          "might_have_unfound": [],# `" P% L" J% q* n0 |2 c7 x& i7 r3 F
          "recovery_progress": { "backfill_targets": [],. T6 D" K4 R& q% F6 x$ l
              "waiting_on_backfill": [],7 J4 i0 s3 X9 V9 |& U
              "last_backfill_started": "0\/\/0\/\/-1",
6 w5 |% U+ g7 M9 d7 a& Z              "backfill_info": { "begin": "0\/\/0\/\/-1",3 u0 h4 l5 b1 |8 f
                  "end": "0\/\/0\/\/-1",
" ?5 C2 {4 j# m; U0 f9 m                  "objects": []},, ]" ^  d( n1 w) D' `
              "peer_backfill_info": [],$ i; V" c5 y- U  V9 \" ^
              "backfills_in_flight": [],! A( e1 X0 l4 f0 u% |+ a: D: K
              "recovering": [],
4 |" b9 G0 a. O6 f2 T$ T2 N1 j/ C              "pg_backend": { "pull_from_peer": [],# O( r' M7 G! G! j- p  m
                  "pushing": []}},
& `/ U4 z3 A5 B4 T& i( j          "scrub": { "scrubber.epoch_start": "0",; q- o: }. [5 t- l: f
              "scrubber.active": 0,' v# o1 g/ x: K" T
              "scrubber.block_writes": 0,
6 U" ~5 ~( [3 N6 I8 y+ m              "scrubber.finalizing": 0,2 S" u" w9 h2 m# d- ], {
              "scrubber.waiting_on": 0,1 j& d) ~6 C7 f# n* g: _
              "scrubber.waiting_on_whom": []}},5 ^3 k8 G. _* e9 q! F( s
        { "name": "Started",6 U1 F/ c" X' m7 q& j6 A; _
          "enter_time": "2016-06-03 01:31:20.976290"}],! h% i+ K6 c3 h. u3 J" e
可见它已经开始 recovery 了,但是没完成。
% g; J) [. ^: R; \3.2  原因分析- O4 [# g; `- S" N0 t9 P1 S" l
PG 的分布和 CRUSH ruleset 有关。我的集群当前只有一个默认的 ruleset:2 t4 b; P! e5 ]! S
$ G; _2 w3 {8 |" V; X
[root@ceph1:~]# ceph osd crush rule dump7 G: R2 p* b5 p/ t
[
: M3 u4 q8 f9 h% ~& l% e' C    { "rule_id": 0,9 ]+ g0 A6 Z! |  X7 z7 j/ ~
      "rule_name": "replicated_ruleset",
* I3 J9 l* ^$ G2 L1 D' M      "ruleset": 0,
, O* t+ l/ w# D! o' M      "type": 1,
' [  M9 l/ s% [4 X8 m, x$ a) S+ ]      "min_size": 1,7 c" b! Q4 B. ^3 I. M
      "max_size": 10,
% S5 m4 |0 l& r5 a( }6 ~+ W& E% v7 @: D      "steps": [- ^, f# g4 W! G: {
            { "op": "take",
. h3 m! q5 K3 X+ x2 ]              "item": -1,
8 g' m: f; Y( K$ K$ o              "item_name": "default"},* R% s6 b2 T9 I1 M% p( h- o7 U
            { "op": "chooseleaf_firstn",) N6 o! e) G( Z) [- z- ^; {! S; l% S
              "num": 0,
/ ]+ b0 v! o) Z              "type": "host"},
  j: T8 E4 b3 s4 ^( B            { "op": "emit"}]}]
0 e9 k# P6 }4 D注意其 type 为 “host”,也就是说 CRUSH 不会为一个 PG 选择在同一个 host 上的两个 OSD。而我的环境中,目前只有 ceph1 上的两个 OSD 是in 的,因此,CRUSH 无法为所有的 PG 重新选择一个新的 OSD 来替代 osd.3.
% {: c2 h. K5 \9 G; O( x  N3.3  解决办法
3 O6 D. f1 \8 j按照以下步骤,将 CRUSH ruleset 的 type 由 “host” 修改为 “osd”,使得 CRUSH 为 PG 选择 OSD 时不再局限于不同的 host。
) e% }" y" F% z+ W2 ^8 R
, U' p5 t9 w2 W[root@ceph1:~]# ceph osd getcrushmap -o crushmap_compiled_file% G; w  ]* g# U9 ~# N. i$ k3 D
got crush map from osdmap epoch 77
# m% C$ N0 Y( }2 k( K. M4 k4 s2 H[root@ceph1:~]# crushtool -d crushmap_compiled_file -o crushmap_decompiled_file+ Y- |9 D+ J9 L% V6 C
[root@ceph1:~]# vi crushmap_decompiled_file$ g, i' F  B: c- {7 T$ r2 V, b- s
rule replicated_ruleset {
. [3 e8 n# T+ [' g8 q# f: M2 y        ruleset 08 X4 S7 V, ?0 S( J  j; C
        type replicated
0 ~0 C: R& k# r        min_size 1
4 R) t' A- P) Z& x        max_size 10% q+ M4 |5 d1 e& k3 S' N
        step take default! Z$ ]. a4 g# j+ w8 ^' S" u* s( g
        step chooseleaf firstn 0 type osd #将 type 由 “host” 修改为 “osd”# y% t; Q# K$ k- f
        step emit6 b: F9 g# r; o7 K4 ?7 q
}
5 ]# L& ?- G& Y' n3 ? ' ^4 J- L# n( D7 |2 }6 N3 _, P
[root@ceph1:~]# crushtool -c crushmap_decompiled_file -o newcrushmap6 }5 N. N8 v: A5 E
[root@ceph1:~]# ceph osd setcrushmap -i newcrushmap
( c* C7 ~: z6 O1 i% qset crush map4 v5 w6 a, ~; P" n- W+ p5 p
以上命令执行完毕后,可以看到 recovery 过程继续进行,一段时间后,集群恢复 OK 状态。
; J+ S! v8 q7 _+ C  ~! a: D( E- U2 E$ F9 }0 A
[root@ceph1:~]# ceph -s: g5 y) T' S# K# a' `) f/ V
    cluster 5ccdcb2d-961d-4dcb-a9ed-e8034c56cf71
" g( v+ S0 R/ ?1 `     health HEALTH_WARN 256 pgs stuck unclean
+ l( t2 @/ X  x     monmap e2: 1 mons at {ceph1=192.168.56.102:6789/0}, election epoch 1, quorum 0 ceph1
! h0 \8 X% Z+ p  Q, a$ @  ^     osdmap e80: 4 osds: 4 up, 2 in, i/ ]; Q  X% R
      pgmap v493: 256 pgs, 4 pools, 285 MB data, 8 objects
& y. Q  \! w" }) i* z# H            552 MB used, 9665 MB / 10217 MB avail
. J9 P0 [- g" r" j7 H1 C; ^- R3 K                 256 active+remapped
' q; L& Y- n, u  O  x# H+ {4 n! J[root@ceph1:~]# ceph -s
; \+ u8 f5 D- T& {    cluster 5ccdcb2d-961d-4dcb-a9ed-e8034c56cf71: z6 T0 h& L4 I( B
     health HEALTH_WARN 137 pgs stuck unclean1 H) X2 D5 w4 ^7 [3 [4 ~# i
     monmap e2: 1 mons at {ceph1=192.168.56.102:6789/0}, election epoch 1, quorum 0 ceph1( Y/ C% c+ w' ]- B# M3 f
     osdmap e80: 4 osds: 4 up, 2 in
3 p, t% B+ L$ R1 g: ]      pgmap v494: 256 pgs, 4 pools, 285 MB data, 8 objects
# R& l0 q. o  S6 F) P  s4 Z- ~6 c            677 MB used, 9540 MB / 10217 MB avail
+ r' ^. k/ v! l* \& x                 137 active+remapped+ H; n/ Q. n8 f" ]9 y
                 119 active+clean
$ |( S- ^- ?* e9 N% ?4 k1 h+ [1 I( mrecovery io 34977 B/s, 0 objects/s
" x+ ~' M: `4 n3 p[root@ceph1:~]# ceph -s+ Q$ S" x: `2 ^- M4 P
    cluster 5ccdcb2d-961d-4dcb-a9ed-e8034c56cf71' `2 e% \4 w' {; d
     health HEALTH_OK- D. h( G( W& k2 c% ~+ P
     monmap e2: 1 mons at {ceph1=192.168.56.102:6789/0}, election epoch 1, quorum 0 ceph1
3 f) ]- g: |) v     osdmap e80: 4 osds: 4 up, 2 in7 e" V  ~- m) n' t" G# H( m
      pgmap v495: 256 pgs, 4 pools, 285 MB data, 8 objects8 a$ r& B* u2 O8 o! K
            679 MB used, 9538 MB / 10217 MB avail
  ^/ N8 f: _, y5 A                 256 active+clean
/ e5 Z$ A  Z$ I; j' P! r4 Krecovery io 18499 kB/s, 0 objects/s
  g6 s7 @5 |6 Y7 x4.  将一个 OSD 移出集群8 }1 F" T! v5 m( F3 n+ R- l% w8 ]
4.1  将该 osd 设置为 out
8 C7 _7 C5 J1 X9 i" R1, L% m3 r2 J7 X3 G% d
2
$ o4 {$ @) n3 C2 a, P) H, w7 k[root@ceph1:/home/s1]# ceph osd out osd.1
% J. K6 _: g9 d' N7 ^marked out osd.1.
5 `' K: k- l" Y- u2 @/ i% a4.2  集群做 recovery
# l: L% _0 x. F$ _5 E! g/ u3 I, G2 O  P  A

  z, A  n/ {6 j1 x* K8 ^- Y' i2017-06-03 01:54:21.596632 mon.0 [INF] osdmap e90: 4 osds: 4 up, 3 in
% ~) `2 K" n$ H8 |: V2017-06-03 01:54:21.608675 mon.0 [INF] pgmap v565: 256 pgs: 256 active+clean; 1422 MB data, 2833 MB used, 12493 MB / 15326 MB avail
/ G$ y2 |# p! i( k2017-06-03 01:54:26.352909 mon.0 [INF] pgmap v566: 256 pgs: 1 active, 255 active+clean; 1422 MB data, 2979 MB used, 12347 MB / 15326 MB avail; 2/40 objects degraded (5.000%); 51033 B/s, 0 objects/s recovering
& Y6 V2 W& H8 q4 R# b2017-06-03 01:54:28.624334 mon.0 [INF] pgmap v567: 256 pgs: 4 active, 252 active+clean; 1422 MB data, 3427 MB used, 11899 MB / 15326 MB avail; 8/40 objects degraded (20.000%); 51053 B/s, 0 objects/s recovering9 |" a0 j& I/ e
2017-06-03 01:54:31.320973 mon.0 [INF] pgmap v568: 256 pgs: 3 active, 253 active+clean; 1422 MB data, 3539 MB used, 11787 MB / 15326 MB avail; 6/40 objects degraded (15.000%); 19414 kB/s, 0 objects/s recovering* J# H; y/ s. k* ]3 @
2017-06-03 01:54:32.323443 mon.0 [INF] pgmap v569: 256 pgs: 256 active+clean; 1422 MB data, 3730 MB used, 11595 MB / 15326 MB avail; 77801 kB/s, 0 objects/s recovering
  q) T# y# z' `* Q( m. e2017-06-03 01:56:10.949077 mon.0 [INF] pgmap v570: 256 pgs: 256 active+clean; 1422 MB data, 3730 MB used, 11595 MB / 15326 MB avail" [. T; [& O' ^* F9 m  b
4.3  完成后,该 osd 的状态还是 up,表示它的服务还在运行。现在将其服务停掉。" g# z1 a: @" V9 t& Y
11 u2 P% H1 h5 `) e- Z5 A8 S' Z) A
2
* S5 z! A5 R9 e# m[root@ceph1:/home/s1]# ssh ceph2 service ceph stop osd.1) J- g! Q. W  u+ \! b* d$ M
/etc/init.d/ceph: osd.1 not found (/etc/ceph/ceph.conf defines , /var/lib/ceph defines )8 J; O. D- c% j% Y, f$ u
该命令出错,需要将 osd.1 加入 ceph.conf 中。在 ceph1 上的 ceph.conf 中添加:
" C+ t; n; E# o5 o8 ~3 D
- c- a3 Q! X2 C9 [[osd]" M6 S: P  o: T1 Q* Y; S' J: b
; ?" W# l- X% S* z
[osd.1]. j* h3 \  o; o$ J# z4 o0 e, S
host = ceph26 Y: n( A! T; |4 \

% k! h' }! V0 W9 t# R8 h' L[osd.2]# v9 W8 ~! t# x' y8 L
host = ceph1
7 x1 r$ U5 g$ N1 _' S5 W
* @  u- G+ z7 c[osd.3]
5 @% e& U" t- n# ghost = ceph23 w' R) y1 Z) f. G& {5 q
$ M  c( x2 a' a: z& |4 g  L. t7 w
[osd.0]/ w( l1 v5 s- _$ U; W8 C! W  b7 O
host = ceph1
5 \; Z8 H0 j# y9 g9 P% u- C! q然后运行 ceph-deploy –overwrite-conf config push ceph2 将它拷贝到 ceph2 上。重启所有的 osd 服务。诡异的事情出现了:! [" P1 J# A2 |$ o6 A1 S

7 v# S- L! O4 I3 I0 n/ _[root@ceph1:/etc/ceph]# ceph osd tree
* B) |) V! u$ ~# id    weight  type name       up/down reweight
# h! y) L- R2 \-1      4       root default
) |3 g. m1 h+ X6 p3 g-2      4               host ceph16 c1 L' o, Y% E
0       1                       osd.0   up      1
5 G' e6 J7 Q1 k* r' }' D7 J2       1                       osd.2   up      1
# e2 Q" r+ v$ x4 e2 X7 v5 J* B1       1                       osd.1   up      0- C+ {6 U2 X1 I
3       1                       osd.3   up      1
# J  _" o  `8 b, |8 E4 n& F-3      0               host ceph2
5 z) _7 S7 h* M' _1 D  z! a0 zosd.1 和 osd.3 跑到了 ceph1 节点上!查看 start 命令,它将 curshmap 中的 osd.1 的 host 修改为了 ceph2:
/ ?1 |/ _* S$ V
( H, T4 Z  O1 Q1 L7 x[root@ceph1:/etc/ceph]# /etc/init.d/ceph -a start osd: g, G, t, M& h! ?3 c: U, P: L
=== osd.1 ===" C4 Y* s) D& k! `& E7 ~
df: ‘/var/lib/ceph/osd/ceph-1/.’: No such file or directory
4 w% |- |& I3 o0 z9 |* f& {% h% bcreate-or-move updating item name 'osd.1' weight 1 at location {host=ceph1,root=default} to crush map- B3 u' B8 o' W9 l# {$ d
Starting Ceph osd.1 on ceph2...
# P' {! a# `, o. O& Xstarting osd.1 at :/0 osd_data /var/lib/ceph/osd/ceph-1 /var/lib/ceph/osd/ceph-1/journal
2 h: z1 _* K& F: w' J从 这篇文章 可以看出,这其实是Ceph的一个 bug:make osd crush placement on startup handle multiple trees (e.g., ssd + sas)。该bug 在 OSD location reset after restart 中也有讨论。目前 Ceph 没有机制可以确保 CRUSH map 结构不变,最简单的办法是在 ceph.conf 中 [OSD] 部分设置 osd crush update on start = false。1 `4 W7 q: {1 J9 Z8 F8 }% j  U
尝试手工挪动 osd.1 和 osd.3:
5 J5 C# r+ }* U& g' \' B  B9 v+ C% S1 x  M7 ?
[root@ceph1:/etc/ceph]# ceph osd crush remove osd.15 s) o8 z4 @) F% C
removed item id 1 name 'osd.1' from crush map
/ ~: ~9 x6 y+ [  o' A[root@ceph1:/etc/ceph]# ceph osd crush remove osd.3$ @' e9 e8 v3 u
removed item id 3 name 'osd.3' from crush map2 V; J5 w/ V/ u2 z% `2 p2 Y& d

2 A" ?7 H3 H3 V, C/ p0 _[root@ceph1:/etc/ceph]# ceph osd tree
5 `2 ?! [" j1 C% T1 o. M# id    weight  type name       up/down reweight0 f: ]0 L! p8 O/ N
-1      2       root default, x3 f6 q" o) K  \7 k/ |. W* t' ]
-2      2               host ceph1) o9 p5 t$ i4 Q7 U4 q
0       1                       osd.0   up      1
9 E5 a$ P2 w! y6 l2       1                       osd.2   up      1
! U. t% }2 ^' n0 q2 S0 E; M-3      0               host ceph2
; [5 X- K# Y+ h1       0       osd.1   up      06 I# }# |; b2 t0 {
3       0       osd.3   up      13 |7 S# A8 P  f' @: o% s, W
# X; R1 q% u6 [1 w$ C, l- \! N# k% q% G
[root@ceph1:/etc/ceph]# ceph osd crush set 1 1 root=default host=ceph2
" I* A- C6 |* V0 }% w6 D9 ]Error ENOENT: unable to set item id 1 name 'osd.1' weight 1 at location {host=ceph2,root=default}: does not exist; z5 J; B& T4 D
该错误的原因待查。索性直接修改 crush map,然后正确的结果就回来了:
& J  F+ B- L6 o7 S3 D, I0 Z0 f8 B9 d) \! p
[root@ceph1:/etc/ceph]# ceph osd tree
; c6 |& a# J7 M# M! P. u$ |" F7 M# id    weight  type name       up/down reweight
: w7 M2 O9 s5 N; w-1      2       root default+ p2 }9 I7 ^4 e6 {: c7 I
-2      2               host ceph1+ S" q- j" o5 Y1 y) X4 Y/ Q3 j, Q
0       1                       osd.0   up      11 }' B7 {( s2 L. Y
2       1                       osd.2   up      1
3 F9 i: M8 R  Y  H: D-3      0               host ceph2
# _1 J/ y# b# L. ~) ?1 ^1       1                       osd.1   up      0
6 e7 E4 L% G7 ^) G3       1                       osd.3   up      1" r" w( R1 e, T, X- b2 g5 ?
继续运行命令 ssh ceph2 /etc/init.d/ceph stop osd.1 去停止 osd.1 的服务,但是无法停止。据说是因为用 ceph-deploy 部署的 OSD 的服务都没法停止。只能想办法把进程杀掉了。
2 Z- `' }! g/ G0 [- L5 d然后继续执行:2 |5 z5 g5 {5 ~1 N  b" H( f2 Q

& N: r* S0 R0 U/ _. {7 h[root@ceph1:/etc/ceph]# ceph osd crush remove osd.1
. k1 [; j# d; Z) [5 b  ?  Aremoved item id 1 name 'osd.1' from crush map
% a1 o8 y- A- s[root@ceph1:/etc/ceph]# ceph auth del osd.19 J) S1 Y$ Z: L/ h5 s% ?! D: r
updated" G$ s: d2 p% T: F
[root@ceph1:/etc/init]# ceph osd rm osd.1
" b+ t' ^* }% v# N2 U% ]removed osd.1
' ~# Y) M2 d* z' w- S+ t此时,osd tree 中再也没有 osd.1 了:
6 U: B+ C$ I" E$ N: y: n" S: q4 W- u/ D! B
[root@ceph1:/etc/ceph]# ceph osd tree6 [& M- K3 U. T5 K3 g7 v& X( {
# id    weight  type name       up/down reweight* u; H# `& E; b$ r" Q# |5 j9 v
-1      3       root default  Y: V& \# ?4 K' x6 z
-2      2               host ceph1
% f) Y3 B2 |5 ^0       1                       osd.0   up      1
5 ?6 }1 ]& c6 K3 Q! D; u1 y2       1                       osd.2   up      1
& P/ U) J. D! g, T: a-3      1               host ceph2
' M8 d# u9 ~1 D* a4 C/ u7 U3 e* F3       1                       osd.3   up      1/ i# ~  ], _& c  ~
5.  将一个 OSD 加入集群0 ~0 w! H* M% K$ q; V
/dev/sdb1 分区删除; s+ e) w9 ]5 L+ D' J- D  i
清理磁盘:ceph-deploy disk zap ceph2:/dev/sdb
3 ^" ?( L- a1 p  y: J创建 OSD:ceph-deploy osd create ceph2:sdb:/dev/sdd1: R5 n& B6 l: d  V$ M$ X5 ^6 S
结果OSD就回来了:
8 h2 p+ K. y/ m, [( a  s7 b9 v: r; h1 h2 c8 z
[root@ceph1:~]# ceph-deploy osd create ceph2:sdb:/dev/sdd1c^C/ l9 T' ~7 s0 J! g- t0 h
[root@ceph1:~]# ceph osd tree
8 ]- i' I$ A) e1 S- G9 Z' e* H' W# id    weight  type name       up/down reweight
. q# W& g- O7 r-1      2       root default
: P: s/ R8 i9 R# |-2      2               host ceph10 b* ~8 p6 J- ^6 \: J+ ^; z
0       1                       osd.0   up      1
2 c! D8 O( E* k2 m/ ]; K2       1                       osd.2   up      17 R& \+ ?4 k. E
-3      0               host ceph2  t" [" T* q/ ?; K; v: p! u
4       0                       osd.4   up      1
. K- y- \1 c$ [7 w$ J5 a1       0                       osd.1   up      1' u# n6 R9 U' Q* w
其实将上面第四步和第五步合并在一起,就是替换一个故障磁盘的过程。) H# f* M. W. O; [# E0 _* w7 z
6.  在特定 OSD 上创建存储池
- b. @$ R4 O+ e  z; u7 ^假设 osd.0 和 osd.2 的磁盘是 SSD 磁盘,osd.1 和 osd.4 的磁盘是 SATA 磁盘。我们将创建两个pool:pool-ssd 和 pool-sata,并确保 pool-ssd 中的对象都保存在 osd.0 和 osd.2 上,pool-sata 中的对象都保存在 osd.1 和 osd.4 上。6 T  ^: G9 i- R$ L" G3 p6 p
6.1  修改 CRUSH map! `! f2 t  D$ c& M

' q% B& V; i/ u7 _  S. k9 L[root@ceph1:~]# ceph osd getcrushmap -o crushmapdump
, y( ^) Q) t3 C4 n3 k  d8 @got crush map from osdmap epoch 124
) z: q, j; [  p1 d. \+ t[root@ceph1:~]# crushtool -d crushmapdump -o crushmapdump-decompiled
9 N+ G) M2 Y$ Y' H[root@ceph1:~]# vi crushmapdump-decompiled2 ]$ m  ^% k, f- R
[root@ceph1:~]# crushtool -c crushmapdump-decompiled -o crushmapdump-compiled
( A4 [# p! B: C, j4 G[root@ceph1:~]# ceph osd setcrushmap -i crushmapdump-compiled
+ \1 d# p/ a* I) ~/ z在 crushmapdump-decompiled 文件中添加如下内容:
' L9 w; S4 r$ C" F
1 m* u( A! N; l9 f$ T1 t: c  H. nroot ssd {
7 j1 ]' Q+ P* j0 G        id -59 E, q8 o# B& e* B
        alg straw
6 p8 p- Y) i. u/ \        hash 0
  W* M; }2 U8 F        item osd.0 weight 1+ X& e8 T$ F# E1 n5 D% d4 W  a
        item osd.2 weight 1
5 c0 ~/ P) E; D1 w) v}) l( _6 q0 ~. G- e

# x$ V- ]' R, _$ [! ~8 R( sroot sata {
0 g* e# m! U% ?* i2 @, q        id -6; l5 w; Q/ }, \- X
        alg straw
8 q! I: j* ^# O4 Z' |        hash 0# G1 g9 B4 C% A: j7 c5 o$ @" `
        item osd.1 weight 1
% z1 \: B; F$ \* m- ~1 d) C7 W        item osd.4 weight 1" t$ S; R5 i, U7 e" x( D  h; I
}+ h0 P- F: w1 ~) x. z

" s  t2 z- M% k5 s% g# rules2 h9 u5 M+ y. V) g1 Q! y
...
9 @2 u2 o' q& ^% Z: V: \- y
2 M' o: Y9 D; J8 A/ I! m0 |rule ssd-pool {2 K8 d& }; X  y( c
        ruleset 1" u: O" t( D4 `) V' _
        type replicated
$ P% U6 h8 I  ^8 o1 Z        min_size 1
. s) U$ N9 o( L- p        max_size 109 H  t: i3 F+ r* M8 A
        step take ssd
* U  ^7 d1 i' i8 C9 }! ~; q        step chooseleaf firstn 0 type osd
2 C. L5 d7 _8 S# i/ M- q        step emit3 `/ F4 B- I7 l& Y' o( x$ g
}+ b; I. B7 ?5 p, Y
, n9 k) c# [" z" P' H. U, O+ M4 i
rule sata-pool {% H  {2 W: R- A5 f
        ruleset 27 g! l% ~- V0 i# I( c$ H
        type replicated, w! s, ]1 c7 r$ z0 }: L$ I" ^
        min_size 1
! |" C2 U4 X: z* O' e+ R        max_size 10
( z5 L' K# o7 E        step take sata
& g! b. N% J. D' f  u+ n        step chooseleaf firstn 0 type osd0 _$ T+ `: g0 q  a2 L& T
        step emit
9 q% ?& q7 N. Z: [( m" s( d}
  o  K* }" Q9 ?' z- |( A# `1 f1 j6.2  ceph osd tree % U4 i. \/ f7 A

+ J; t' a: T9 Z3 _[root@ceph1:~]# ceph osd tree3 Q( B* _1 u# v5 U" C# W
# id    weight  type name       up/down reweight
8 @# {- M0 T$ |* q/ b-6      2       root sata
# y# ^; M* c$ z+ j1       1               osd.1   up      1
1 f9 J  C' q- L" d1 m) H$ Q* T4       1               osd.4   up      1: H4 |2 i) T+ @- i% q, G( T# j) }! X
-5      2       root ssd
) S6 z5 N4 ?# Q  ?  M0       1               osd.0   up      1
7 K! O0 Y0 B- E' c& f( q/ [- Q; e8 X2       1               osd.2   up      1# x7 s' l9 d+ q& _# z5 b. Z% {+ |5 h
-1      2       root default* _# y: |! z) Y1 q) }1 q7 m4 ~
-2      2               host ceph13 Q; _$ P, s) R) o: q& K
0       1                       osd.0   up      1
7 p  C: R& e. i1 z" D' ^2       1                       osd.2   up      1: A  W1 a8 r1 D; }
-3      0               host ceph2
" n& K& O9 t# ~: Z& H5 W& X4       0                       osd.4   up      1
" k( n- y) a2 P. i1       0                       osd.1   up      1
! S% v! }; J2 s0 p: {9 W& ^+ ^' r6.3  创建 ssd-pool,其默认的 ruleset 为 0
, z6 n7 j. g, |9 F' D1
2 Q% t- N" ?6 R" g1 B23 U, i7 w( ^  a. Y* a( A, ^
3
" {9 |" {% y& d' e* e# b, q' p4; ^' V. c5 a  }  ^6 [. ?2 D$ ?
[root@ceph1:~]# ceph osd pool create ssd-pool 8 8
& b+ k0 W4 ?) T0 f4 m2 L0 f. apool 'ssd-pool' created
/ E7 p" a! A& a" Broot@ceph1:~# ceph osd dump | grep -i ssd- l; K1 w, c3 E
pool 4 'ssd-pool' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 126 flags hashpspool stripe_width 0  c* k, H" J  A* p$ H6 p3 A% ]
6.4  修改 ssd-pool 的 ruleset 为 ssd-pool 其id 为 1
. @6 W" @* t+ J- w13 g+ ~) s6 R% J- `( B; |
2
* p3 D' S* s. ~3
- T( s( j& v6 S9 `( V4& C) J5 }- k  Q" F
[root@ceph1:~]# ceph osd pool set ssd-pool crush_ruleset 1
: w3 ]: y2 Y- ]4 W! J! Nset pool 4 crush_ruleset to 1
0 ]3 g1 y4 o2 B8 i& g4 L[root@ceph1:~]# ceph osd dump | grep -i ssd$ N# `5 V6 `: x& n1 h
pool 4 'ssd-pool' replicated size 2 min_size 1 crush_ruleset 1 object_hash rjenkins pg_num 8 pgp_num 8 last_change 128 flags hashpspool stripe_width 0
; h' Y7 P3 [) t6 ?# t6 {- L. K6.5  类似地创建 sata-pool 并设置其 cursh ruleset 为 sata-pool 其id 为 2& V* N9 h' a! B; ]
1; Q; ^( d9 C4 g/ y6 k& V
2
4 \# C+ ^6 m% _5 G: P3/ b( Q6 J4 z0 o3 g
4
7 d, e6 A1 P$ Y  `0 E6 k# J9 v5- |! u6 }& d. d9 G
6
' l9 X- B' u8 W) ]7 R[root@ceph1:~]# ceph osd pool create sata-pool 8 8
2 f, n" S# p* A' Wpool 'sata-pool' created: {: I1 E* [' ]% k" C( q1 W  |, ^! _
[root@ceph1:~]# ceph osd pool set sata-pool crush_ruleset 23 c# r  U2 |" V
set pool 5 crush_ruleset to 2
5 b# q+ Z1 S0 ]! D% d[root@ceph1:~]# ceph osd dump | grep -i sata
, e2 E9 N* N% |: K& j- @pool 5 'sata-pool' replicated size 2 min_size 1 crush_ruleset 2 object_hash rjenkins pg_num 8 pgp_num 8 last_change 131 flags hashpspool stripe_width 0
# S& V. H2 @, d  J1 W6.6  分别放一个文件进这两个pool5 j3 I: `; s. ?" R2 @  k+ `
10 ~4 A3 U5 d: H& }# P/ y8 e
2
. Z0 q. W5 i* K5 \( {. b3- N3 l+ \( }2 o, \
47 ^8 z2 H3 ]" V- T
5. i( J1 @8 R- u% b0 f; f! N3 e; q
6
, N4 ]* h& H6 F* N9 F: Q2 s[root@ceph1:/home/s1]# rados -p ssd-pool put root-id_rsa root-id_rsa
6 f: i6 O5 _7 L7 A  G[root@ceph1:/home/s1]# rados -p sata-pool put root-id_rsa root-id_rsa) x% z# `1 l) Q# `0 |
[root@ceph1:/home/s1]# rados -p ssd-pool ls
4 X/ j' c) i% D1 ]: Lroot-id_rsa/ `6 l5 x8 {' K( }& Y$ w8 M- w
[root@ceph1:/home/s1]# rados -p sata-pool ls
1 D% g: E/ W0 ~- D1 Uroot-id_rsa: K$ a& G+ q* [/ H& J
6.7  查看对象所在的 OSD  f* n& W8 K: D
1, J8 F# K4 n, w9 F
2. _8 }3 D3 {, F2 N; I
3! a- V* Y3 Y3 Y) h) }- S' j
4. ~) M& d  b3 L7 L- ~
[root@ceph1:/home/s1]# ceph osd map ssd-pool root-id_rsa2 ^9 p" b# u: R9 o. n
osdmap e132 pool 'ssd-pool' (4) object 'root-id_rsa' -> pg 4.38e001ef (4.7) -> up ([2,0], p2) acting ([2,0], p2)/ N. k; v# x+ U3 ?  g& I
[root@ceph1:/home/s1]# ceph osd map sata-pool root-id_rsa
8 B9 ^8 k$ X# @  H% {/ Hosdmap e132 pool 'sata-pool' (5) object 'root-id_rsa' -> pg 5.38e001ef (5.7) -> up ([4,1], p4) acting ([4,1], p4); n( `* ], ~2 U7 J! D
可见,两个pool各自在ssd 和 sata 磁盘上。, h  X* r9 j- N$ \* r3 x/ d, L0 i9 L
###############  ceph-deploy常见运维命令  ###############2 ~/ V+ P& r- s' s% A
4 T9 D2 M* M3 q% }% j! B# D
# ceph-deploy new [initial-monitor-node(s)]
- D$ W9 k3 t9 p. w开始部署一个集群,生成配置文件、keyring、一个日志文件。3 N0 t( m+ ?! b2 D$ c, m

  d, }5 ~/ i5 R' x1 ~" V* O' b# ceph-deploy install [HOST] [HOST…]
. q6 S3 H2 D7 g! R% |5 V3 q3 ~在远程主机上安装ceph相关的软件包, --release可以指定版本,默认是firefly。# B+ W9 r! r% B

# k6 V9 o! g# S: }* @( G# ceph-deploy mon create-initial
; [7 m2 ~6 I$ _* ~部署初始monitor成员,即配置文件中mon initial members中的monitors。部署直到它们形成表决团,然后搜集keys,并且在这个过程中报告monitor的状态。: X+ R' ^. \$ H" ]
# y" \5 \5 t' ~7 K; B" J
# ceph-deploy mon create [HOST] [HOST…]
. u# y- q- k/ w显示的部署monitor,如果create后面不跟参数,则默认是mon initial members里的主机。
% r1 ]# b( [' E/ L6 P5 f% X
; @7 w: Z; x( N1 y' v- p# ceph-deploy mon add [HOST]  w4 H  x# @* _7 T  T
将一个monitor加入到集群之中。
6 C+ G/ E- C' ^8 |, o; U4 c, } ( N7 f7 H9 w! q
# ceph-deploy mon destroy [HOST]$ B* ]1 Z% }# N0 _
在主机上完全的移除monitor,它会停止了ceph-mon服务,并且检查是否真的停止了,创建一个归档文件夹mon-remove在/var/lib/ceph目录下。8 G5 M; i5 N8 G1 I3 ]

7 m4 i: g( w0 }! q1 K# ceph-deploy gatherkeys [HOST] [HOST…]
6 n2 s  W2 N, c. k6 a获取提供新节点的验证keys。这些keys会在新的MON/OSD/MD加入的时候使用。
8 s$ ^) G; }7 |# k" j- V3 O/ { 6 X8 U0 Y2 c0 e3 H
# ceph-deploy disk list [HOST]
) E0 B3 \  h# Q' A2 c# u/ x% H列举出远程主机上的磁盘。实际上调用ceph-disk命令来实现功能。
; l- E. T( t: x8 }4 P; \ 1 C$ a& E. e* ~1 V" Z
# ceph-deploy disk prepare [HOST:[DISK]]) A& R0 @  x# x! W( w; ?# z1 W5 W
为OSD准备一个目录、磁盘,它会创建一个GPT分区,用ceph的uuid标记这个分区,创建文件系统,标记该文件系统可以被ceph使用。
! P. N/ b9 F' \! x " }! ~5 s8 a' Z* i
# ceph-deploy disk activate [HOST:[DISK]]
! e5 V9 C' |5 N6 \% }& c激活准备好的OSD分区。它会mount该分区到一个临时的位置,申请OSD ID,重新mount到正确的位置/var/lib/ceph/osd/ceph-{osd id}, 并且会启动ceph-osd。& m$ s) k5 G2 L+ Q9 U: n
" [: \  x& m4 K7 g
# ceph-deploy disk zap [HOST:[DISK]]
8 v: W. M  p/ n! ~0 |( x( r擦除对应磁盘的分区表和内容。实际上它是调用sgdisk –zap-all来销毁GPT和MBR, 所以磁盘可以被重新分区。
! Z; D+ x; E! A$ l/ w- j
) [# m+ y# ]* Y/ t- Z7 H# ceph-deploy osd prepare HOST:DISK[:JOURNAL] [HOST:DISK[:JOURNAL]…]
- u( V2 }* {+ r为osd准备一个目录、磁盘。它会检查是否超过MAX PIDs,读取bootstrap-osd的key或者写一个(如果没有找到的话),然后它会使用ceph-disk的prepare命令来准备磁盘、日志,并且把OSD部署到指定的主机上。
- U% c% `. V" g7 e$ _$ b' P5 N; Q1 N
2 w* g! ]* b, v6 P# ceph-deploy osd active HOST:DISK[:JOURNAL] [HOST:DISK[:JOURNAL]…]
' v2 ~2 D& c3 |: `. c激活上一步的OSD。实际上它会调用ceph-disk的active命令,这个时候OSD会up and in。# o1 B3 t5 j- ?  o, X
' O4 r( J  I+ {( `4 @- s4 g
# ceph-deploy osd create HOST:DISK[:JOURNAL] [HOST:DISK[:JOURNAL]…]+ I, r% w7 p$ N
上两个命令的综合。3 r! G3 T" u) b5 W$ q3 o0 c: G

' S+ W; V% [; {+ `5 ~. r* X  z6 B# ceph-deploy osd list HOST:DISK[:JOURNAL] [HOST:DISK[:JOURNAL]…]# {1 g6 m. A' ~6 ?% u& q
列举磁盘分区。. \6 y- ^& m$ B& q

' T2 U% P( Z$ N# ceph-deploy admin [HOST] [HOST…]. B2 k" ]5 P# \
将client.admin的key push到远程主机。将ceph-admin节点下的client.admin keyring push到远程主机/etc/ceph/下面。
4 m* F  o! s) O" o7 g
5 s- O4 s  y% J) x9 y8 Z; Q. }" s# ceph-deploy push [HOST] [HOST…]6 e& z) [) E' _( ?% g
将ceph-admin下的ceph.conf配置文件push到目标主机下的/etc/ceph/目录。 # ceph-deploy pull [HOST]是相反的过程。
: v, S! s" _$ _: Z$ d
) l$ |. b9 O( _3 @& L# ceph-deploy uninstall [HOST] [HOST…]/ ]! H) m+ d) F' L5 P
从远处主机上卸载ceph软件包。有些包是不会删除的,像librbd1, librados2。
& M. c4 E) }( K5 Q( x # Z# m2 E, B  C) Z
# ceph-deploy purge [HOST] [HOST…]
0 F6 N8 u9 x' @类似上一条命令,增加了删除data。
4 w4 T- E: j$ G4 y: w
7 p  S+ h4 S$ X. l( _' O# N# ceph-deploy purgedata [HOST] [HOST…]% J) N# N! Y2 S  c$ J
删除/var/lib/ceph目录下的数据,它同样也会删除/etc/ceph下的内容。
$ S  U% l$ l5 |3 w / g& P5 g6 ]2 O: {3 ^
# ceph-deploy forgetkeys- l+ q! b* r. a7 ~
删除本地目录下的所有验证keyring, 包括client.admin, monitor, bootstrap系列。- _$ c1 M1 w0 |. H

3 _0 L: `3 J, M# ceph-deploy pkg –install/–remove [PKGs] [HOST] [HOST…]! J. j- V$ g) d( v
在远程主机上安装或者卸载软件包。[PKGs]是逗号分隔的软件包名列表。
# p% Q# ?3 A8 _& |* y' C - z8 s" k4 U/ D3 W; }. h7 L
##########################################################################################
: G) ?3 H) m& A) X( M$ `对ceph集群中某个节点ceph-node卸载其上的服务
1 Z2 G1 Y( U$ _1 Q* Q! j# stop ceph-all                                             # 停止所有ceph进程
* g, s  ^6 J3 a# Z0 ^2 D* a# ceph-deploy uninstall  [{ceph-node}]                      # 卸载所有ceph程序
2 X, L/ D% k. c& F# K# ceph-deploy purge   [[ceph-node} [{ceph-node}]            # 删除ceph相关的包; x" W8 g* `9 [7 ^. Q2 x
# ceph-deploy purgedata {ceph-node} [{ceph-node}]           # 删除ceph相关的包& P  C) C6 H- z) u
# ceph-deploy forgetkeys                                    # 删除key6 P7 X4 g) b( X2 g( K# D4 `8 E

2 N7 a! y) ?! D3 r/ }( n7 p4 ]##########################################################################################$ u) k. I9 A$ q* y1 U+ F
ceph安装包介绍:
" D" {& p' {, G2 z& i+ u1.ceph-deploy1 b# A/ U# `) f# f$ k; E; d
ceph的部署软件,通过该软件可以简便部署,这个软件并非整个ceph集群系统中必须的% K6 A' J" ~/ g2 u/ x) f

; u6 P* `5 o/ T* m& }% f% K2.ceph' L" J$ [! _8 Y
ceph整个服务集群中的每个节点必须的软件。提供分布式的存储与文件系统服务 (osd,mon守护进程): l; C# Q# [% P+ ?

) Y0 p2 j: l. |% z3 }3.ceph-mds
0 t; X1 W6 i" u. }8 G元数据服务端 (mds 守护进程)
7 j3 @4 w  E9 l. z/ L
0 P" H# j' y/ g$ H9 r" L6 J: k- _  N4.libcephfs
7 o( O9 A" M! @. {+ J客户端的编程接口(c语言)
$ E  M4 _  l3 V; W" S4 _$ H
; z+ ?  [5 M# Q) _, W) Z5 O. Z5.python-cephfs
) i/ Y) a: q9 A/ p" B! {6 z% K客户端的编程接口(python)9 D% l' a1 E, Z1 `, w# @/ X  D& ^$ y

8 X% ^, q7 n+ Q9 @6.ceph-common,ceph-fs-common 客户端:5 I( d) r( s9 [
使用ceph服务的客户端必须要有的
6 |% K" u6 n  l  u" y  ~9 C
% {; _, i5 g: ]4 m' v3 f############################################( Q" j7 i" O/ P; A9 d
下面这三种进程分布于集群中的服务器上,服务器中可以只运行一种,也可以多个同时运行,推荐为一个服务器运行一种,使得负载均衡:6 ~4 y" @  J7 m. U
osd 守护进程:即为存储守护进程
" M' d( B1 F# {- B& U! A5 Fmon 守护进程:监视器守护进程4 C0 J- m$ {7 Q
mds 守护进程:元数据守护进程' h& P; {6 |9 R% j  b+ O" T* K' ^
###############  ceph-deploy部署ceph集群的简单流程  ###############
' b  v- \, C% z2 K; A2 ?/ f
9 K# ?: b3 l$ d% X' H- y架构说明:
* b- X% D& k. \node1:admin-node,mon,mgr,osd1 i* N0 `' H5 \, _
node2:osd
; Q0 f4 r: H0 v' e, e8 G$ {node3:osd
) e: e0 \3 f* T8 G& e+ W$ A# w" A / ?8 D( c& c' O- S* E
server:  3台虚拟机,挂载卷/dev/vdb 10G
  \4 {9 H& ~% f4 @. U8 B* h* a7 |& x5 `系统:    centos7.2
, k* ?  L" ^+ j) a/ p2 F2 P& Sceph版本:luminous
7 a6 O) E( p1 M7 @2 ] - t" g; N7 a- U
一、准备工作
2 F: N7 ^# S" a4 j) t1 [! e( T####################################################################################
! @+ n* {0 u8 i. |1、安装centos、epel repo
( ^3 B6 C/ V$ J使用阿里云mirros,https://opsx.alibaba.com/mirror
+ H1 V  \/ n  K% L5 v! z# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup& u$ R( x( _; W
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  n; G% x% ^7 H6 w/ }. A# mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
# R* V+ e$ V' K7 Y# W! I% F, O- s# mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup4 C" V$ e# E( y" m
# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo3 s) J6 J. S- {0 L
* V2 N1 T' S) B
2、安装ceph repo$ l2 G( X7 ~, E- Y1 Y9 ^; I1 U# d
# yum install centos-release-ceph-luminous -y/ S7 g5 u3 L7 [/ E' z3 Y) l, M5 S

. M8 z: p( t( F6 u- U3、安装ceph-deploy4 G1 y' A4 A, R; {2 ?" E9 R5 f- I2 {
# yum update -y5 \: ^8 K0 z4 M/ B/ V/ ]" v
# yum installl ceph-deploy -y
2 F: x7 Z3 R$ K ' u2 J8 r' q0 |0 C' y
4、安装、配置ntp" v9 B+ p2 r  a: n7 t& u8 W9 }
# yum install ntp ntpdate ntp-doc -y. _& X0 g) {- I5 F4 u! w/ r( s
( R. N1 }' @( Z& z0 K
5、安装ssh(系统自带请忽略或升级)
' O4 w: o- l$ q" j确认所有节点的ssh server 运行
% T. a3 ?/ G2 y( s# yum install openssh-server -y/ B( i1 e; i) p* y) r
, s- l) n& N$ ~1 a* G; g/ ]
6、用户设置
7 z3 {8 p6 m. J. V  o. f! V使用root用户,虽然官方不推荐这样。配置管理节点到其他server免密登录" i# B# s) _! i( \5 |0 I* Y
生成秘钥对5 O% m; s. P9 j
# ssh-keygen -t rsa7 N5 w& E; M7 W9 _8 ]0 P& U
将管理节点公钥注入到其他server% b# w9 S7 Y3 Q6 F. O
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@xx.xx.xx.xx
6 ]) w4 F  d" t. [# x+ l8 W
* W* X. @% ~9 C% H7、确保networking 启动# q* W. N- W+ m
8、配置hosts,将ip hostname 写入/etc/hosts
" I4 x! k1 e; t9 K9、关闭iptables+ |8 j8 C8 K& Q' U7 h
10、关闭selinux
; k6 g# X! @7 V' O: |( K11、安装yum-plugin-priorities
9 Q( r( E5 B# A# L# yum install yum-plugin-priorities -y
* Q+ j2 Y- N( I. \9 @ ) j# A/ V, B. g! M5 e# J
二、部署集群7 \* O% O5 {( u6 X
####################################################################################
, C1 s- `! b9 D0 H在管理节点使用ceph-deploy部署ceph cluster
/ Q5 t1 |4 m# B& M3 W) T " Y* N7 k( ~' ^: \, S
创建部署目录; R$ N! l: I8 l7 V4 J4 |
# mkdir ~/my-cluster: \& ~& \5 t) E+ q9 X8 y! f
# cd ~/my-cluster' v; C& T9 A$ J" S) h8 r

5 A7 k# ]  \6 d; W2 g- h从头开始(非第一次部署ceph,清理环境)
2 F# t; D4 W  [# A  Q# ~# ceph-deploy purge {ceph-node}[{ceph-node}]9 z+ K, H  Y9 Y
# ceph-deploy purgedata {ceph-node}[{ceph-node}]2 I- f  y$ ?, g  n5 w
# ceph-deploy forgetkeys! H1 R. M: j2 J$ h
# rm ceph.*7 K' B3 n+ `+ ?/ H. F& j2 j

9 O4 g' L! i0 ?0 a+ e) w4 _% G创建集群+ [& f/ l0 L$ m; q1 I
创建monitor节点,命令是"ceph-deploy new {initial-monitor-node(s)}"
5 }$ A; e2 f% f8 }4 p& @9 i+ l+ x# ceph-deploy new node1; B( l) C* s6 U' v, h$ @

! ]0 M2 M2 e6 Q1 B( j安装ceph包到各个节点
7 O. W4 R0 v6 p0 x. _# ceph-deploy install node1 node2 node3' J; f+ R2 U9 I8 @

) L/ J; S4 p% ?初始化monitor节点,获取keys8 f1 m9 v. R9 E7 k' r$ O# l6 _* z
# ceph-deploy mon create-initial
+ [: j, e/ t% J$ R7 n
8 ]* Z4 a( V) ?* i上述命令执行成功后,你会在当前目录下得到以下keyring文件
6 O5 H( T5 A0 z5 b5 X+ g# ceph.client.admin.keyring, }: u  K) z% V) b' _1 d
# ceph.bootstrap-mgr.keyring3 t& `/ H1 X' B$ G& a( x: z
# ceph.bootstrap-osd.keyring8 o) n- N8 c% P/ I! m, t
# ceph.bootstrap-mds.keyring
8 x: N" S" c1 a: Z* m6 [! O# ceph.bootstrap-rgw.keyring3 ^4 m. F% j8 e# \* a4 z6 t( n
# ceph.bootstrap-rbd.keyring
7 q$ v& E# H. S5 H" z  m1 K
9 d5 L$ Q) |  u" q% x: K$ n将keyring文件分发到各个节点
  D2 L; Z5 r! q# ceph-deploy admin node1 node2 node3
; a, s2 Y4 x+ p. |6 R# B6 C% _, N
% O% a1 g# m1 ]7 o部署manager(l版本之上才需要)
) O) [& |" e5 _) P/ s" v! H# Y) E# ceph-deploy mgr create node1$ T+ E# r: [% _4 C

3 V% J7 ?7 x+ B6 F. t5 \. C部署osd节点(这里使用虚拟机,挂载了/dev/vdb卷)  U& Z) s, ~7 Q- }- t
# ceph-deploy osd create node1:/dev/vdb node2:/dev/vdb node3:/dev/vdb
* o' E5 t- g; C- D& t) h
$ Z3 {2 a3 @9 K- |! h4 ]检查集群,在管理节点执行
% p+ ]& X% \$ O% U/ O; ]# ceph health" T/ L3 {2 d& E
# ceph -s
( K1 C' m& g7 c6 {% F : e* Z: K1 ?8 p- t/ p  k
三、扩展集群
' h0 \6 \/ \4 k: v" R####################################################################################
' @$ o6 d! \) e( d/ p/ ^node1 扩展了metadata,(rgw)
6 G7 n2 r; G: _+ x) k( q0 Cnode2 扩展了metadata,monitor
7 I/ i* m% a+ _1 z+ a( T. ?0 v/ Hnode3 扩展了metadata,monitor
; G8 L8 O) |# A0 ?) d" T
  O& s/ ^  K/ j8 Y添加metadate server1 o4 |7 s- B5 E
# ceph-deploy mds create node1" X3 S4 K6 y3 e5 b- K

( K# D" B  P6 K7 B% i3 r: u* R) x添加monitors8 B- B8 L+ j$ o  P% c; e
# ceph-deploy mon add node2 node32 a* h1 j5 @2 L3 _& q$ w

8 l; k" o; Y6 H添加新的monitor节点之后,ceph会同步monitor,选举代表quorum
7 L  b+ @% ~# Z* f, U查看quorum状态
3 A$ Q, w4 Y7 E! b; v( V# ceph quorum_status --format json-pretty# \5 x7 t! z/ ^& F) I! q; \! p
7 }  v3 f- |4 z$ k
添加managers
: ?5 X$ A3 s, _( @# Bmanager使用active/standby模式,多节点部署,可以在master down时,无缝顶替2 _( |( n- U- d  C4 A
# ceph-deploy mgr create node2 node3* y+ R6 e. q  ^" P
; ]# E/ V3 Y' ^1 [0 }4 z8 M
添加rgw实例
" u0 s8 k' b2 t" o为了使用ceph object gateway,需要部署rgw实例3 P( W, G2 |; U) z
# ceph-deploy rgw create node1( v5 F# D  R4 K
1 {1 N+ t: G- h4 B1 ^2 [
rgw默认监听端口是7480,可以通过编辑ceph.conf修改端口
+ C8 \; S6 z- _[client]
+ i; N9 K, `5 K. Nrgw frontends = civetweb port=80
2 c; \, w1 m4 h: @( S
% t  z6 `. I6 \6 U$ f+ N/ F! ]+ i四、存储、检索对象数据
9 g% C% X9 X/ `7 J$ J####################################################################################
  p; z8 d5 T, Q  s为了存储对象数据,ceph client需要具备:
6 A( y7 s% ]$ X7 C1. 设置一个对象名1 M1 ^5 z( c+ e/ v; ]' j$ g
2. 指定一个pool
; R! l2 K* l+ D- k" T7 x 6 h4 V6 x; d$ z4 v. T6 m$ j# _
ceph client 检索最近的集群map和CRUSH算法去计算怎样映射对象到PG,然后计算如何动态映射PG到OSD,
  \$ Z- }1 {1 e+ C( C" O* @只需要对象name和pool name即可找到对象的位置。命令为"ceph osd map {poolname}{object-name}") u3 J% }  C1 g% V7 ]2 P7 a* H( ~; \7 V
7 z# N: x4 A2 ]: {
练习:定位对象9 y7 s: m$ H! F9 o
创建一个对象,测试文件# p3 D% f1 U( I6 _9 o0 q; i
# echo {Test-data}> testfiles.txt
2 i; l. c* k  q' X! ~# ceph osd pool create mytest 8- i! C# N7 o% h
& z$ |6 U7 c6 n4 J- [* i+ v' i
使用rados put 命令指定对象名,含有对象数据的测试文件,pool name。命令格式"rados put {object-name} {file-path} --pool=mytest"
0 O' @; E  c3 G7 s  L# rados put test-object-1 testfile.txt --pool=mytest
: P8 w% C) z4 Z" P5 w 4 J7 e! r8 B8 b, L6 ]
验证ceph集群已经存储了此object$ H7 e$ h* b$ Y+ p
# rados -p mytest ls7 Y8 M9 @; ~) h' E3 Q6 z8 W) [1 i7 C

( Q* ^* K) u5 }找到对象位置。命令格式"ceph osd map {pool-name} {object-name}"/ b/ J- o9 G; _  ]$ [$ ]: h
# ceph osd map mytest test-oobject-1
0 Q# p, \" C* {1 N: D 7 H" b" w1 {2 I3 v# j2 a
ceph会输出对象位置9 e# ]+ b0 G2 ^0 b! V  Z$ x* ?7 B
# osdmap e537 pool 'mytest'(1) object 'test-object-1'-> pg 1.d1743484(1.4)-> up [1,0] acting [1,0]
3 ?/ F. v8 H$ c
, Y1 U% A4 v0 q- e/ v, Q* _删除测试对象object  y- w  l) J. h" O7 I, ?
# rados rm test-object-1--pool-mytest/ n" W& H; }' R  t% V% G
# T* P- M+ \* z8 \* i2 [
删除mytest pool! R3 ~3 D% b) ]; D. Y4 u6 r
# ceph osd pool rm mytest! j6 ]; \# |6 m8 z

" `8 F! A; T# q" d7 T  g随着集群的发展,对象位置可能会动态变化。Ceph的动态重新平衡的一个好处是,Ceph可以让您不必手动执行数据迁移或平衡。
+ v" _; L/ J1 }  s0 Y! G- E( m 2 @; X6 J) d! |$ o$ A
五、如果虚拟机没有硬盘,可使用裸设备模拟" r1 C! I% E  d: p/ h! a
####################################################################################$ [  M7 p: E( I" k; w
安装lvm
: F# }+ E3 L( ?9 \$ K9 X! n( c# yum install lvm2 -y
' S* b4 N3 D  A* c! e5 d
& H' A/ n7 X: s6 K; D创建虚拟磁盘
4 E) {6 \9 c3 N# mkdir /ceph && dd if=/dev/zero of=/ceph/ceph-volumes.img bs=1M count=10240 oflag=direct! ^. o) M( X, X8 X
# sgdisk -g --clear /ceph/ceph-volumes.img' k6 I! L$ N1 H, n; ]+ d
# vgcreate ceph-volumes $(losetup --show -f /ceph/ceph-volumes.img)8 h1 [" Y, t  R6 Y
# lvcreate -L 9G -n ceph1 ceph-volumes
+ g2 v1 ?; U$ y. \# mkfs.xfs -f /dev/ceph-volumes/ceph1* q4 L3 R& a! j# j* J
  5 a0 ^$ p2 r- J
挂载5 ^6 {& E8 G, u9 s. ^
# mkdir -p /var/local/osd13 x. O6 C  I: ~1 ^, f( R
# chown ceph:ceph /var/local/osd1   #修改属主属组,不然在添加osd时候会报权限错误
* x0 S8 G5 G% N* N# v# mount /dev/ceph-volumes/ceph1 /var/local/osd1
" P# q/ q9 ^1 {# k! y###############  Ceph添加OSD节点 (非ceph-deploy方法)  ###############( y+ R! a& ~0 s5 ?) O2 M
5 S. H, U# h) f% ^; n. d5 e
1. 首先需要在新的节点(ceph5,ip为172.16.60.15)上安装ceph软件。
- Z) j, v2 U, S: m9 }& W需要先做一系列的准备工作,如:配置ntp,做好管理节点到新增osd节点的ssh无密码信任关系。
% H# A" z; f0 U- \- o+ H8 g/ x  {6 a
0 W/ d# h: ]! C在管理节点上执行:
* |2 V5 M+ I' a6 M0 h[root@ceph-admin ~]# ceph-deploy install --no-adjust-repos ceph5
$ Y7 c: h) s* k: j% L6 E5 i. c+ f
% I) z; [( O6 b# P) N  l2. 获取osd的ID
9 R' _+ P  R- |" n$ }$ G* ]& y这个操作是在管理节点上执行8 X7 R) f1 b  N! D5 A' x$ S
[root@ceph-admin ~]# ceph osd create          #记录得到的编号,如下编号0就是下面创建的osd的ID。
6 b- |0 l( [: t. u+ m9 m00 v$ Y6 I7 f) x! t( Y& @$ E
2 U% |' R6 [9 n) L) S# K
3. 编辑配置文件,这个文件是在管理节点上的,为了安全也可以同步到别的节点上保存; r/ l. W3 y/ C# [
[root@ceph-admin ~]# vim /etc/ceph/ceph.conf 8 O( d. U* ]) v! S+ N0 |/ g
添加 [osd.0]  public addr = 172.16.60.15
( [* o6 @  e' B1 p/ m) | - g& L( E0 j) G
4. 同步配置文档到节点ceph5,这个操作在管理节点上执行(172.16.60.10是ceph管理节点地址). ]% C1 a6 d& r- E+ y3 |
[root@ceph-admin ~]# scp -r root@172.16.60.10:/etc/ceph/ root@172.16.60.15:/etc// ?5 Q& g5 J8 J4 A& G
/ F" Z0 P. a% o/ o' W5 {3 X9 e: t
5. 部署osd节点
; r+ E# m# D, s* D: ~6 S登陆到ceph5或者ssh到ceph5机器上都可以. u( Y4 c3 a8 _# @: |' h
[root@ceph-admin ~]# ssh root@192.168.100.103
( S2 ~: w* O7 d
9 D$ c* D& {0 t+ I6 D+ @4 e% j6. 对磁盘做处理9 T/ w- {" w5 w7 c  d- [' U
[root@ceph5 ~]# parted /dev/sdb mktable gpt $ E. ]0 a; ~3 e1 \4 W
[root@ceph5 ~]# parted /dev/sdb mkpart osd.0 1 20g      #新加的硬盘为20g,并将所有空间划分为一个分区
2 v( K  V: ]1 P ( q* {4 ^7 |' o) _! |% I
7. 格式化和挂载,ceph5机器上的磁盘
: o! W$ z3 I3 @6 M[root@ceph5 ~]# mkfs -t xfs /dev/sdb1- }- I( k0 d  }+ }% b
[root@ceph5 ~]# mkdir -p /data/osd.0/ t# q( Z7 ]. M, v' t) \
[root@ceph5 ~]# mkdir -p /var/lib/ceph/osd/ceph-0( ^2 U6 `7 d) W7 z1 G
[root@ceph5 ~]# mount /dev/sdb1 /data/osd.1
& e) ?+ K! I* p. W1 q ( |; _9 L% T) ^8 t  @3 x
8. 安装新osd的相关,初始化 OSD 数据目录4 W- d4 O" T& x1 W! a) m
[root@ceph5 ~]# ceph-osd -i 0 --mkfs --mkkey             #这里的"0就是osd是的编号,即上面"ceph osd create"输出的数字
9 R7 h0 \# T1 D* _
$ }# V. M+ U2 {2 B4 T* S9. 注册此 OSD 的密钥
' A& r# J0 b( q. ~[root@ceph5 ~]# ceph auth add osd.1 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-0/keyring0 ^2 `4 d6 x/ {: Z6 v. s5 A

% {3 Q% F: i7 ^$ |1 s10. 把此 OSD 加入 CRUSH 图之后,它就能接收数据了
# r" ]. k; G; W7 T) E4 A" I[root@ceph5 ~]# ceph osd crush add osd.0 0.2 root=default host=ceph5* m" Z+ {7 m) m8 C& k6 B

7 z  U9 {# ^3 w. g, {* B11. 启动osd进程5 H$ O$ @3 y& B" q, B9 }
[root@ceph5 ~]# ceph-osd -i 0
8 y5 z1 ?, O, `2 h
- k9 b* D8 x; t; p12. 查看进程
5 l$ o2 j9 I1 D* d& @* _[root@ceph5 ceph-0]# ps -ef|grep ceph-osd
! L5 E( \3 q; p" broot       3238      1 21 10:54 ?        00:00:01 ceph-osd -i 0
6 F7 g1 N+ C/ h0 t3 eroot       3369   2654  0 10:54 pts/0    00:00:00 grep --color=auto ceph-osd
4 B4 n8 h# j7 j2 Z; m" o( z+ z , }/ ^' z; o7 {5 ]+ R
13. 查看osd状态
8 U7 f9 w' Z5 A% C[root@ceph5 ceph-0]# ceph osd stat  osd添加成功
0 _( b; e( d6 j% T  P+ e[root@ceph5 ceph-0]# ceph osd stat
/ |  T1 _& o7 u     osdmap e175: 6 osds: 5 up, 5 in
) @  `2 ~# g" z; n1 z9 F            flags sortbitwise,require_jewel_osds
/ K) @0 ~( e/ J' ^& |5 O% ]" X# u############### Ceph删除osd的正确方式 ###############
5 ~+ M6 d  ]: o/ d8 L: [" T2 U2 s
在ceph的集群当中关于节点的删除问题,一直按照以前的方式进行的处理,处理的步骤如下:# v) x4 Q4 t2 P7 L0 Z

- b/ \0 a- j3 j1 X+ `1. 停止osd进程% ]9 c9 K$ i0 [% M, n! V
# /etc/init.d/ceph stop osd.0
$ g, P5 {/ O7 r5 M这一步是停止osd的进程,让其他的osd知道这个节点不提供服务了, D5 ^" l* ^  M! z; C' ]+ \' g

4 T0 L+ G6 v7 [% S( z* Y2. 将节点状态标记为out+ I  L9 \& U! M8 [
# ceph osd out osd.06 L) c. D/ }6 J. e0 c0 J9 l: ?0 V
这个一步是告诉mon,这个节点已经不能服务了,需要在其他的osd上进行数据的恢复了4 }  a1 F) W: T( o" S

2 e/ k# M% P& ^3. 从crush中移除节点! L! N7 [# {! j8 B  h1 a
# ceph osd crush remove osd.0) z; r$ e4 ]2 V- q0 E
从crush中删除是告诉集群这个点回不来了,完全从集群的分布当中剔除掉,让集群的crush进行一次重新计算,之前节点还占着这个crush weight,
  p% x, I/ j% K/ H! R# ^7 A; T0 G% W会影响到当前主机的host crush weight
  U, R  u7 n- x' V  t 9 L" Q2 D% p% O& s; o5 A
4. 删除节点
$ D0 J0 Z, z* N+ D2 X- L6 e6 A# ceph osd rm osd.0
* \3 Q! h8 S* i* e这个是从集群里面删除这个节点的记录. e$ S: J; q( T- |

& H8 V# i2 Q5 B7 R* B! L1 U5 ~* U2 Y5. 删除节点认证(不删除编号会占住)
+ N. ?% w: o. w; ]3 W3 [# ceph auth del osd.0/ ]4 y; h$ Q: D; C
这个是从认证当中去删除这个节点的信息/ ?$ \. X& W& l$ v
  B, K6 e8 N6 R/ ~, V
================================================================================================================
0 v" T3 o' \" k9 p6 |这个一直是处理故障节点osd的方式,其实这个会触发两次迁移:一次是在节点osd out以后,一个是在crush remove以后。
+ v3 F7 |' G0 l. N两次迁移对于ceph集群来说是不好的,其实可以调整步骤是可以避免二次迁移的,做法如下新的处理方式。
% C4 s5 V1 w/ k) c4 [! i================================================================================================================
7 c: r5 R: G0 I) F4 y% q/ V % A% Z/ q, a' r; @3 j
################# 对于osd故障节点删除的新的处理方式(推荐)##########################& }' C9 f1 f6 ~7 S! g1 x
1. 调整osd的crush weight5 I7 w& H/ @6 p0 M
# ceph osd crush reweight osd.0 0.1) b' c7 q3 @( m3 r8 u9 _
说明:这个地方如果想慢慢的调整就分几次将crush 的weight 减低到0 ,这个过程实际上是让数据不分布在这个节点上,让数据慢慢的分布到其他节点上,
  s" R! _) D  w  B: w. ?! B: Z4 l+ X直到最终为没有分布在这个osd,并且迁移完成这个地方不光调整了osd 的crush weight ,实际上同时调整了host 的 weight ,这样会调整集群的整体的crush 分布,  r) ^9 T0 J* \3 ~' Z+ B& |
在osd 的crush 为0 后, 再对这个osd的任何删除相关操作都不会影响到集群的数据的分布
- P( o: [7 X0 y4 m" J% T
8 m$ r2 \- j+ d3 V* n2. 停止osd进程+ f9 O# y8 t( L+ i: d
# /etc/init.d/ceph stop osd.0
7 |) _+ \* `5 h2 G9 p" Q3 c: ~9 a停止到osd的进程,这个是通知集群这个osd进程不在了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移。0 S2 G/ T& z7 n8 Z# F! c; T/ d) M

9 W# a* b0 S; }7 l6 k7 M3. 将节点状态标记为out: Q$ ^% `! S( R4 ~$ S$ }: C
# ceph osd out osd.0$ ]& f2 C" }* C9 \/ a; c8 T) A4 j
停止到osd的进程,这个是通知集群这个osd不再映射数据了,不提供服务了,因为本身没权重,就不会影响到整体的分布,也就没有迁移
  L0 o, r/ n, D. j# X" E4 w) p  ^
4 V8 A# u5 q% }* p8 Q5 ]( `; M4. 从crush中移除节点8 Q2 m: t. E, S/ k, q
# ceph osd crush remove osd.0. t, e3 j; i8 s+ _  x( H5 ?
这个是从crush中删除,因为已经是0了 所以没影响主机的权重,也就没有迁移了5 o- x# L" ^7 U* _
% \& y2 |7 ?' S* [& ~* p
5. 删除节点/ ^% q% b# D" f
# ceph osd rm osd.0
) G, j/ K, p! k8 E5 f; g$ m0 {这个是从集群里面删除这个节点的记录6 ?" ~6 y! n2 s9 P) ^

6 D- k' Z0 F* l4 b1 Z6. 删除节点认证(不删除编号会占住)' X( H0 H1 y6 L! k1 R
# ceph auth del osd.0
' {- T) ~; [! l这个是从认证当中去删除这个节点的信息
( {% |2 q+ [4 ?- A. f8 s2 l
- e& k' H* v1 E" n( Q" `, [经过验证,第二种方式只触发了一次迁移,虽然只是一个步骤先后上的调整,对于生产环境的的集群来说,迁移的量要少了一次,实际生产环境当中节点是有自动out的功能,; c4 r. j- n2 Q5 f$ S( k
这个可以考虑自己去控制,只是监控的密度需要加大,毕竟这个是一个需要监控的集群,完全让其自己处理数据的迁移是不可能的,带来的故障只会更多。* }+ B% N& }( n0 b3 i# a. w
############### Ceph替换OSD操作的优化与分析 ###############
+ o! I3 J  E4 O' K8 u' k1 j6 t: z2 M0 O6 j  Z1 r( U
上面介绍了"删除OSD的正确方式",在上面只是简单的说了下删除的方式怎样能减少迁移量。下面要说的属于一个扩展,介绍了Ceph运维当中经常出现的"坏盘替换盘的步骤及优化"。
% f* t5 G6 L# e8 Q8 K- R" e & b( @5 j, r6 n  Q
基础环境:
+ q8 F. L* F* t: J+ ~3 L5 D% n$ v两台主机,每台主机8个OSD,一共16个OSD,副本设置为2,PG 数设置为800,计算下来平均每个OSD上的PG数目为100个,下面将通过数据来分析不同的处理方法的差别!
/ N% d" m6 t( H( \
. K, [7 E' n3 U" y: x需要注意:
' Q# ~5 Z" l4 n7 |开始测试前,先把环境设置为 noout,然后通过停止OSD来模拟OSD出现了异常,之后进行下面三种不同的处理方法:$ w- E. T* p) c. I. k' `2 r
5 I6 u# s2 x' O/ X* F* v0 H- j
一、测试方法1:首先out一个OSD,然后剔除OSD,然后增加OSD
* h) x! x- E! m2 \% I) L+ Q#########################################################################################################
6 e6 S9 f( _) @+ ]- K- f总的思路:
% Z8 R+ G6 O3 }+ D1. 停止指定OSD进程
  n! S4 {$ r/ ~. q2. out指定OSD
. g! s0 X; Z7 v3 X- o) y% o# ]3. crush remove指定OSD
! `) \1 Z. @! u* M4. 增加一个新的OSD# i! y7 ^& K1 w$ r

: m' ~3 n1 E) s" h7 G5 {! o一般生产环境会设置为noout,当然不设置也可以,那就交给程序去控制节点的 out,默认是在进程停止后的五分钟,总之这个地方如果有 out 触发,- q+ S& T1 V) R5 ]
不管是人为触发,还是自动触发,数据流是一定的。这里为了便于测试,使用的是人为触发,上面提到的预制环境就是设置的noout。$ W. ]# X# o) b3 Q% i1 @8 ^5 g* {
  Y( f2 D' S9 B* q( X  P
开始测试前获取最原始的分布% Y  p# C2 [4 ?; p2 \# N
[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg > pg1.txt. m. Q, T7 i* s) q2 E  O/ t
获取当前的 PG 分布,保存到文件pg1.txt,这个 PG 分布记录是 PG 所在的 OSD,记录下来,方便后面进行比较,从而得出需要迁移的数。' T1 R: \* G* `5 P

; A. g  z2 k: z0 X1. 停止指定的OSD进程
+ _$ Z. p0 b" a1 H! Z[root@ceph1106 ~]# systemctl stop ceph-osd@156 v( Y' q3 V) @' s9 @
停止进程并不会触发迁移,只会引起 PG 状态的变化,比如原来主 PG 在停止的 OSD 上,那么停止掉 OSD 以后,原来的副本的那个 PG 就会角色升级为主 PG 了
6 P3 h4 ?/ R. i+ o ) w% a# N5 G( M/ _6 U
2. out掉一个OSD
' Z; @% i  }. Q[root@ceph1106 ~]# ceph osd out 15+ s0 m' B& U$ M- ]1 L& n
在触发out以前,当前的PG状态应该有active+undersized+degraded, 触发 out 以后,所有的 PG 的状态应该会慢慢变成 active+clean,等待集群正常后,
% d: D; f, f- u7 z/ k5 n: R再次查询当前的 PG 分布状态
" e9 T- W0 {6 W- C% t1 `2 v# q[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg > pg2.txt3 Y6 P7 l  }2 B
保存当前的 PG 分布为pg2.txt
% n' n- j+ f* D$ n   r0 ^" r2 O9 {# U" W( I2 E
比较 out 前后的 PG 的变化情况,下面是比较具体的变化情况,只列出变化的部分! W( V! G8 k( x
[root@ceph1106 ~]# diff -y -W 100 pg1.txt pg2.txt  --suppress-common-lines
' @6 H  j& w4 C3 z % u! K6 I: `& l& {, N/ j
这里比较关心的是变动的数目,只统计变动的 PG 的数目  }. H6 ]4 A2 k5 M* {; i: r2 I0 ]
[root@ceph1106 ~]# diff -y -W 100 pg1.txt pg2.txt  --suppress-common-lines|wc -l! [! i$ l3 Q5 d* P1 e( k
102
" N+ D1 `" e+ y0 c, M& H* K
( F" o" y( t0 O- N, U. N' {9 B第一次 out 以后有102个 PG 的变动,这个数字记住,后面的统计会用到+ z$ m: I1 N+ ?
/ y; {& d5 N! }5 B1 r% O8 T2 a+ \+ N
3. 从crush里面删除OSD
; X/ e" O; q0 Q9 }( J[root@ceph1106 ~]# ceph osd crush remove osd.15
. [# ~/ }3 |% {6 f6 U9 ]crush 删除以后同样会触发迁移,等待 PG 的均衡,也就是全部变成 active+clean 状态$ d$ M1 o& Z8 R, r& H5 G

+ ]% [) c5 b+ a0 [6 @  F9 ?[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > pg3.txt8 c0 s" k2 D) i; z  q
获取当前的 PG 分布的状态0 y+ r2 H2 c& o' y5 ^$ H4 |. w

5 s. b7 p- y2 Y. n  }4 U- {% i现在来比较 crush remove 前后的 PG 变动
% a" d: L/ _! a; o[root@ceph1106 ~]# diff -y -W 100 pg2.txt pg3.txt  --suppress-common-lines|wc -l- X7 z. T  O, L8 n/ [
137
+ K/ k' H% }# |9 I! T0 C5 X
; B4 F& v4 R: e( y重新加上新的 OSD
8 m6 P# {5 F7 k[root@ceph1106 ~]# ceph-deploy osd prepare ceph1107:/dev/sdi' i5 [# \) R) S0 I
[root@ceph1106 ~]# ceph-deploy osd activate ceph1107:/dev/sdi1: s; j; J) [: B+ U2 q
/ E+ Q2 {1 b+ K4 U
加完以后统计当前的新的 PG 状态" u6 p7 E1 v5 v' ~
[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > pg4.txt
( _6 T, n7 F5 j; u2 n
1 s" N3 j/ b8 C" n比较前后的变化
4 K/ q/ ^9 J$ e5 `+ x( k) I0 d[root@ceph1106 ~]# diff -y -W 100 pg3.txt pg4.txt  --suppress-common-lines|wc -l: s8 N1 P# [, n5 c# \( B
1677 U8 w9 e0 V) Q6 T  u- {( \; I% ?
* P9 B/ N* S. s, {
整个替换流程完毕,统计上面的 PG 总的变动/ r8 B) P6 D9 S5 E9 x; x
102 +137 +167 = 4062 u3 W( ]3 ?4 L# c1 w
也就是按这个方法的变动为406个 PG,因为是只有双主机,里面可能存在某些放大问题,这里不做深入讨论,因为这里三组测试环境都是一样的情况,7 m; h" C" L1 U" [. V; ~
只做横向比较,原理相通,这里是用数据来分析出差别。
  P# {. @. g) K4 c& r4 o
4 [; z# ^% i  G1 h二、测试方法2:先crush reweight 0 ,然后out,然后再增加osd
9 _* N2 A% i. P) \#########################################################################################################% S+ p) B$ I6 ~
首先恢复环境为测试前的环境
- N6 Y0 `) J$ N$ q& B/ J[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 2pg1.txt+ }4 a( v. t$ k1 d: c6 g
记录最原始的 PG 分布情况. g! `+ y) z1 q, i, T3 @* p
( q1 J# J( I; O- I( A0 H* u
1. crush reweight 指定OSD% S. R  W- E. P/ E8 }1 P' w
[root@ceph1106 ~]# ceph osd crush reweight osd.16 0
/ P2 e! X( H/ k: e3 wreweighted item id 16 name 'osd.16' to 0 in crush map9 v* e: \& I# ~) N8 t! t

# F( Q- H' }  l& Q- v7 Q0 O等待平衡了以后记录当前的 PG 分布状态
& M$ [3 B; X8 v" f[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 2pg2.txt- v( `2 S2 a8 I; W' k3 y
dumped pgs in format plain# Q  _0 Q2 ?  f

  O4 r2 i* }) w* V, l1 b& O比较前后的变动3 s. @6 ]  ~% U5 b" z
[root@ceph1106 ~]# diff -y -W 100 2pg1.txt 2pg2.txt  --suppress-common-lines|wc -l" E" }. o/ [$ p4 m
166; y3 L0 W" a% U$ n
+ E" f3 H# @3 S: p2 {2 Z" e) I3 M
2. crush remove 指定 OSD
% C  p, t- W# j1 T8 y; ?( a[root@ceph1106 ~]# ceph osd crush remove osd.16" t. H* i' R: Q
removed item id 16 name 'osd.16' from crush map
6 ?, B, t; \8 V5 s  Z3 H0 |& ]- Q
1 d$ C* r* [6 D* \这个地方因为上面crush 已经是0了,所以删除也不会引起 PG 变动,然后直接 ceph osd rm osd.16 同样没有 PG 变动
% b( ~8 @4 F- d  T
! v' {1 }. I: {4 r* M3. 增加新的 OSD
$ X) A+ C# ?  V: t1 I, G[root@ceph1106 ~]# ceph-deploy osd prepare ceph1107:/dev/sdi
/ g% w- R* p3 @& _[root@ceph1106 ~]# ceph-deploy osd activate ceph1107:/dev/sdi1
# Y+ D" p3 E; e1 J& u3 {0 J6 p
- [0 L4 I2 Q5 ^( `& f" }( M等待平衡以后获取当前的 PG 分布
% s. g2 J4 v7 r7 a( s% @[root@ceph1106 ceph]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 2pg3.txt
$ T, Y/ n2 Z" m% l; e " x$ p+ V3 e, v, V; c8 G6 t6 M
来比较前后的变化; Q) ]# D9 V" o3 `: S9 ~
[root@ceph1106 ~]# diff -y -W 100 2pg2.txt 2pg3.txt --suppress-common-lines|wc -l
* a" _/ X" N& G. D7 s0 h159  v' }2 M5 z8 d( _( g4 m
# I- [) ?  Q9 k
总的 PG 变动为9 h9 p7 [2 j" f. q# `
166+159=325% Q1 Y2 r4 S# Y$ F. b0 P

( e* a) `& c. C# F/ f三、测试方法3:开始做norebalance,然后做crush remove,然后做add. p/ P2 u. |$ Y: I+ \
#########################################################################################################& T7 T0 C- C5 l
恢复环境为初始环境,然后获取当前的 PG 分布  X1 D4 w6 g* p0 C8 U+ K2 ]
[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 3pg1.txt8 N. w1 H0 H% s5 D
dumped pgs in format plain1 M6 f: {) ]# h4 ?% S
9 D& H6 g2 f3 N: g# B
1. 给集群做多种标记,防止迁移9 \& M% {7 a+ j9 n7 `4 `# `
设置为 norebalance,nobackfill,norecover,后面是有地方会解除这些设置的: h1 R$ U8 L' ]
[root@ceph1106 ~]# ceph osd set norebalance
3 z" ]! ^7 t+ v* w7 Qset norebalance
2 G- h- J7 T& \5 B4 Z
) A& ?& P1 K; l7 w& T[root@ceph1106 ~]# ceph osd set nobackfill
: {# ]# S+ {' V% v0 `set nobackfill' v$ k4 ~- G; m
. m' H8 t# }8 ?) E* }; q* [4 C
[root@ceph1106 ~]# ceph osd set norecover& E4 v9 k- D; X. ^# Y
set norecover, B5 e3 A% \' i( F: L2 ?4 ^! T- r
* J( H8 i; f8 }
2. crush reweight 指定 OSD
( }. a2 G: v! L( R" S9 e& @, {[root@ceph1106 ~]# ceph osd crush reweight osd.15 0
0 ^1 R- w3 r; p. l+ ?reweighted item id 15 name 'osd.15' to 0 in crush map( x, l: O- ^# E6 {, ]0 E
. h+ \- V0 m: _8 u/ Q
这个地方因为已经做了上面的标记,所以只会出现状态变化,而没有真正的迁移,我们也先统计一下
  U( _5 o; T. |  [% p* C2 w[root@ceph1106 ~]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 3pg2.txt
6 @  }* m8 ?4 \" Y: P[root@ceph1106 ~]# diff -y -W 100 3pg1.txt 3pg2.txt --suppress-common-lines|wc -l
; X2 }9 X" D8 a, R6 [1582 ^6 X# v/ z' h( h7 U* i5 c
' g% O* m3 x- `- U/ O, |
注意这里只是计算了,并没有真正的数据变动,可以通过监控两台的主机的网络流量来判断,所以这里的变动并不用计算到需要迁移的 PG 数目当中。) B9 b1 W+ H6 A  \- D( B+ d
  \5 W; R7 ]) ]# |; a6 L0 R: C5 a% [9 I# Z
3. crush remove 指定 OSD3 o+ _& h* F/ r- p# c) Q
[root@ceph1106 ~]# ceph osd crush remove osd.15
1 C& O1 c; b9 B+ Z" s$ w) e , c2 R$ m7 [8 |" i4 J
4. 删除指定的 OSD1 Y; s) z5 G" ?7 a8 O
删除以后同样是没有 PG 的变动的- C/ d6 I' P$ S2 m0 S
[root@ceph1106 ~]# ceph osd rm osd.15
( v( ~$ `! `" v( L0 _1 T
5 H% R7 I3 F6 m这里有个小地方需要注意一下:
% D. o& U. R* x1 a" Z不做 ceph auth del osd.15 把15的编号留着,这样好判断前后的 PG 的变化,不然相同的编号,就无法判断是不是做了迁移了。" o5 e$ J3 m. T+ D
, T6 [* o2 I; H5 D8 ?
5. 增加新的 OSD. R4 M/ K  Y- _& b* k& w
[root@ceph1106 ~]# ceph-deploy osd prepare ceph1107:/dev/sdi( u+ A8 ]7 T5 {7 H" O
[root@ceph1106 ~]# ceph-deploy osd activate ceph1107:/dev/sdi1
% f1 R& ^- z3 H0 g: G1 y 9 S( n( w) Z4 b9 o% |$ l! t4 Z" a+ [) n! z
这里测试环境下,新增的 OSD 的编号为16了" F  `9 U7 C5 v' z
# F/ J! a, a( L$ h! D
6. 解除各种标记
" ^* x+ j. u6 }6 h/ p7 X& g0 D放开上面的设置,看下数据的变动情况' l+ o4 H6 R4 r+ A9 l1 w+ _! I/ T
[root@ceph1106 ceph]# ceph osd unset norebalance( J2 z) S- X' e7 U9 a+ o
unset norebalance2 `2 ]% K1 D% [, f
9 c6 V% ^1 @; G- L' @. `: F
[root@ceph1106 ceph]# ceph osd unset nobackfill! G/ B* S& e$ G( w$ a' `0 f
unset nobackfill2 R( Y1 g% h4 u0 [5 o8 l
( r% g) B. q% G" M' m
[root@ceph1106 ceph]# ceph osd unset norecover/ I, u& T" G  j( t( K
unset norecover% b5 I3 {3 l" ]  r; p

* O2 E3 |$ O2 M* M设置完了后数据才真正开始变动了,可以通过观察网卡流量看到,来看下最终pg变化& `  z6 I2 P# r0 O% {
[root@ceph1106 ceph]# ceph pg dump pgs|awk '{print $1,$15}'|grep -v pg   > 3pg3.txt
: g0 ~! Q  }" P& Z: G; edumped pgs in format plain
% [  T# ]1 y8 U7 b+ m+ }
3 B9 j9 ~, y' e" V/ A" Y  M# u[root@ceph1106 ~]# diff -y -W 100 3pg1.txt 3pg3.txt --suppress-common-lines|wc -l  r6 {: H1 M$ [8 p; ~; _
1952 d$ Y' @% @( \

0 g& W+ R2 o- n2 X这里只需要跟最开始的PG分布状况进行比较就可以了,因为中间的状态实际上都没有做数据的迁移,所以不需要统计进去,可以看到这个地方动了195个PG,  {4 A( r, P) ^6 A" l
总共的 PG 迁移量为195
$ R/ Y! o  [; a8 h4 t ' L: l( p: a$ _2 z4 Y' C# f4 k9 }
四、数据汇总5 {" r6 x- w8 k( K: o' F4 H- }
#########################################################################################################4 y. d: ~6 q  F# C7 H% X" j
#########################################################################################################- }( n  K  s- b7 q# I, X
现在通过表格来对比下三种方法的迁移量的比较 (括号内为迁移 PG 数目)
+ n9 ]6 s! v; M8 n  \8 e; \
0 @& ]! A4 c# g& e  \- R                     方法1                        方法2                            方式3. N- m9 u) W; `! v
                     stop osd (0)                crush reweight osd (166)        set 标记 (0)
( U  y( M" l5 E                     out osd (102)               out osd (0)                     crush reweight osd (0)1 k4 k9 ^! k8 L
所做操作              crush remove osd (137)      crush remove osd (0)            crush remove osd (0)
0 [4 M$ M- V' `% n6 y5 l                     add osd (167)               add osd (159)                   add osd (195)
3 }; T/ i+ l$ t$ U6 r . s# V9 k, D  S0 Q8 a  E
PG迁移数量            406                         325                             195
% L8 Y* M' D* X0 F' O) N- s
/ @! [3 U0 G' D/ Z9 q  `% Z可以很清楚的看到三种不同的方法,最终的触发的迁移量是不同的,处理的好的话,能节约差不多一半的迁移的数据量,  a: j6 N+ S9 {$ `$ F4 _7 x/ p  Z
这个对于生产环境来说还是很好的,关于这个建议先在测试环境上进行测试,然后再操作,上面的操作只要不对磁盘进行格式化,
6 w! _) Z; D) V! u  R操作都是可逆的,也就是可以比较放心的做,记住所做的操作,每一步都做完都去检查 PG 的状态是否是正常的
. B  B8 M: w9 {# ]  u% \ & s1 T- H0 q- w" H# |7 M
最后总结* M! O  r# @, Y% ~0 ~3 c" G
从以往操作经验来看,最开始是用的第一种方法,后面就用第二种方法减少了一部分迁移量,网上有资料说做剔除OSD的时候可以关闭迁移,防止无效的过多的迁移,+ `% F1 F, @. o2 x; O& T/ K+ b
然后就测试了一下,确实能够减少不少的迁移量,这个减少在某些场景下还是很好的,当然如果不太熟悉,用哪一种都可以,最终能达到的目的是一样的。5 }" W: a- m5 c) Z6 s# ~
############### Ceph的节点问题 ###############8 p  z3 N+ \* }; {4 l2 k- G4 b, n

5 f: f5 e0 ~# p( F9 iceph的整体读写性能下降,经查看ceph osd perf有一块osd延迟较大在200多ms以上,决定剔除后,整体性能恢复。4 G+ f0 U- _# U7 [' q
这就说明osd的一个节点问题有时会影响整体ceph的性能。
$ Y& i+ S  K, ~% |[root@ceph-admin ~]# ceph --admin-daemon /var/run/ceph/ceph-osd.105.asok perf dump | more) |* V- q+ ~* z* v0 D  k9 b* Z" U
"WBThrottle": {
# s, H  |: j' u& c- C"bytes_dirtied": 13333504,
/ H) Z4 ?2 r& W& v3 S"bytes_wb": 0,
" p2 v! h. D* D: ~& Y) j. y"ios_dirtied": 86,
9 k  m% Y) ?& H"ios_wb": 0,, |* u% c* ~( C& Y1 ?6 B: L
"inodes_dirtied": 27,) b7 n0 u) Z- A$ c7 r0 M+ ?8 Z- d
"inodes_wb": 0
. i; {- C# i) t+ _},
* ]; g3 f" ~7 U. m
' C- n* z; C: k* A0 j- u" W整体都应该是08 i% m) L: U" x8 F7 D# {
. b* G5 ]) S) j6 W$ k
可以结合MegaCli查看是否有坏道导致的问题,不要急于恢复磁盘。
$ M% J- z7 R3 Q% ^2 N* ]长时间的数据积累对磁盘的性能和使用周期是有影响的 也可以定时清理磁盘碎片。( r& t5 m  X7 j, @% `
3 k2 `3 I! z7 C
查看磁盘碎片, M6 ~: ~" S' H' P$ c2 z
[root@ceph-admin ~]# xfs_db -c frag -r /dev/sdd15 ~1 g  C, Z3 M+ g9 H

* I7 a% t0 w* Z4 Y, H整理碎片( s  t( u1 {0 ?) H% i( ^
[root@ceph-admin ~]# xfs_fsr /dev/sdd1
9 P7 n9 y! E% P& ~, n
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 02:02 , Processed in 0.022200 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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