|
|
本文介绍ceph集群中所有mon服务均无法启动或者说mon节点所在服务器os全部无法启动情况下的恢复方法,当然,这种极端情况出现的概率非常低,这里前提是要做好mon节点的配置文件和元数据备份,不然就没办法恢复了。我的环境是使用kolla部署的,恢复方法也都是基于kolla工具下才有效,如果采用物理机部署,具体操作上会有所区别,但大致的思路和原理是一样的。! z. n, {% g8 V3 s
9 K4 y P# G# D/ D5 K k, y S
备份配置文件及元数据
9 k1 a+ ^3 E) H T
; ?% i8 C' P% b采用kolla部署,默认的元数据存储路径如下; g2 x r j% Q
1 s; V. Y; Z P( P( m( y* J[root@node01 mon]# cd /var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/
3 I: _- ] v, C' \9 a) ^6 r[root@node01 ceph-172.21.196.11]# ls& a) w: V& @5 G! G, l. _7 H G! P
keyring store.db
5 f) R* Q3 `7 Z5 X- K" y+ q1/ ^4 [" D9 x6 j# _# b0 u
2( A0 `; \* y: L
31 ?# b' y9 ^. `' E8 f4 N0 G
4* j! C" J( j# d3 Y; E
将该目录完整备份; E& P* A9 z6 `" ~9 H
1 G6 j4 Y* c) ~" t! i. V[root@node01 ~]# cp -r /var/lib/docker/volumes/ceph_mon/_data/ /root/ceph-mon-bak/
& s1 I) } f* }& Y' R1
7 J$ x1 `( H) s6 w I$ u21 O) Z p# f5 u& v! g
另外还有 配置文件,里面保存了key,默认路径如下:) b9 ?$ I2 @6 \( q$ J% J
" p, H$ H) u8 i( r! y% |5 ~# o+ N
[root@node01 ~]# cd /etc/kolla/ceph-mon/
" e& ~* R+ A: x+ n[root@node01 ceph-mon]# ls1 u+ ]& y: n4 E" D; P( ^6 x
ceph.client.admin.keyring ceph.client.mon.keyring ceph.client.radosgw.keyring ceph.conf ceph.monmap config.json. S& R& u! @) |7 T) g L
1 X( r: m1 R% I) q
2% _1 C' G. U q
3
( K4 [* ]) ], d! ?3 t5 f4 n% ]4
" ?6 o3 [0 O% s; Y/ x7 Z$ w! [' B同样,将该目录完整备份
) C' m$ A, g) R, ~7 C
9 C( z" x" j/ o3 [$ r8 Y/ }[root@node01 ceph-mon]# cp -r /etc/kolla/ceph-mon /root/ceph-mon-bak/# }* Y4 t/ }1 M$ v
1
5 ]3 X6 T! I0 q0 H/ s# ]29 A0 H) e0 r1 ?1 C+ J
我这里所有的相关进程都是跑在docker里,删除mon服务和数据之前先看下集群的整体状态 P: V# D: r; v1 U' C& C7 `
5 l. k" M# [( x+ O- j5 s! w1 f: ?
[root@node01 kolla]# docker exec -ti ceph_mon /bin/bash/ e6 _3 |3 I) l* o3 m4 A( m* w
(ceph-mon)[root@node01 /]# ceph -s
, Z+ ^# X6 P+ W. U4 O cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd e, m" O2 f- b( D
health HEALTH_OK
. ~2 l9 B( n# g) n y monmap e4: 2 mons at {172.21.196.11=172.21.196.11:6789/0,172.21.196.12=172.21.196.12:6789/0}
, `& H8 a$ A1 Y$ V election epoch 44, quorum 0,1 172.21.196.11,172.21.196.12; L1 [: t# @2 d; `* a4 S8 T q q
osdmap e491: 15 osds: 15 up, 15 in
- y) O; v; L' y# J3 a! B; ~2 F7 Z flags sortbitwise,require_jewel_osds
& t7 _) }6 g" ]: C* m2 R pgmap v679746: 7096 pgs, 25 pools, 184 GB data, 50069 objects
, N" d1 S" \; O" ^ 555 GB used, 39643 GB / 40199 GB avail1 C( J6 B9 x* {( N4 i0 w: Q
7096 active+clean
. W) F1 X8 w4 i/ I. g5 S9 {2 q1! V# I+ |" a5 c( f# w0 S7 \
2
i8 w) x- ?" |3' U5 F' [+ p5 j
4- ~$ J( G: k9 G
5
, g+ s c) a% p1 S9 s68 n% w9 {4 U% H# U" K
7
$ ?$ N% x" X. P( p- y8. \7 i) T8 C# w/ s S, T
9
: d7 {. V$ H+ ^1 }6 \& Z. W! a) m10
6 A) q; \+ V! ]+ f8 l0 a U114 K- C" a. a( _ B6 B- v% r
12* Q/ a( a" S% A- U# T
有2个mon节点,15个osd。现在我们将mon数据和容器都删除掉
5 `5 F, h# |/ v9 @7 A0 H3 r2 m6 N
# U$ M7 F( F% o6 o[root@node01 kolla]# docker rm ceph-mon -f
* f& w/ G9 Z) a+ k1 u[root@node01 kolla]# rm -rf /var/lib/docker/volumes/ceph_mon/
6 F$ `$ L3 l& |8 ]8 z! G[root@node01 kolla]# rm -rf /etc/kolla/ceph-mon/" _; c5 w; N$ O' Z+ G
1
1 r/ o* I% Y" b7 o+ w- k2
' N' n' a+ q# V' S3% `9 L, I* m# f3 k
另外一个节点执行同样的操作。删除完之后,修改kolla的配置文件,执行部署命令,会发现有错误,在ceph创建keyring时中断了,报错信息如下: J1 |3 g7 H6 @2 v" J" u
- S# Q4 I/ B c5 B
TASK [ceph : Fetching Ceph keyrings] ******************************************** M$ s q& y) d2 r4 c) n$ a
1 A+ y9 @9 ^# G/ S2 n
fatal: [controller01]: FAILED! => {“failed”: true, “msg”: “The conditional check ‘{{ (ceph_files_json.stdout | from_json).changed }}’ failed. The error was: No JSON object could be decoded”
7 j0 t a3 v* c1
5 J9 d0 W! b! w+ k2 x2
6 ~. w; \' X& V; G8 J8 h+ g3% c' ?1 J2 [# i' g
原因是在我删除容器和配置文件后,kolla生成的相关volume是没有删除的。其还存在于/var/lib/docker/volume下。因此当再次构建kolla时,这些已经存在的volume会阻止ceph_mon的启动,会导致上述错误Ceph keyring无法获取而产生的一些错误。因此 删除掉docker volume ls下的卷。再次部署就能够成功的解决问题。
3 ^' @: r; I0 T- G6 A$ x/ W$ b8 `2 H8 @4 A8 d& z
[root@node02 kolla]# docker volume ls
9 k! E0 h$ [/ i* s5 @6 rDRIVER VOLUME NAME" s" J: N+ b5 k H3 `
local ceph_mon
# z8 y) Y8 N8 B: P/ Z" w, `$ }local ceph_mon_config& j( D! ^: M$ w$ X; _' e! V
local kolla_logs* p; _' `+ R1 |8 j( |
local libvirtd2 C9 m, t; ~1 n# O' A* F
local nova_compute
. F' ^3 M9 Q! y" |local nova_libvirt_qemu' \# n# T6 I( r9 T. F* m8 `
local openvswitch_db
! ]/ t; J0 B: e0 d n[root@node02 kolla]# docker volume rm ceph_mon ceph_mon_config# ?! r7 F2 t& @3 k# X- g
1
( L' S7 K% s- I2
( M Z- E( V7 r! @* G9 b1 P. o34 ?9 ~ B; R' @4 G2 e3 F
4
+ E' g* a! w, W$ P$ a9 z, c5$ s# G3 c' |; U& ~$ T
6
# Z, m D* x, z7
. f( G& u2 U2 A' [8
8 t0 r) d7 z2 R8 u" _9
0 F* m6 B& }! d& [* Y6 B10
( [! E0 g3 g8 j/ M) v* Q这时再部署即可成功。这里有2个mon节点,我是一个一个的加入的,添加完一个mon节点后,查看集群状态
- S# b/ o ? X3 G1 U' N+ A$ w% @$ ]
(ceph-mon)[root@node02 /]# ceph -s+ P) Y7 P1 [0 j0 C3 ~3 R
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
$ D* G9 _( C. N' d+ V" t8 u health HEALTH_ERR
" U$ ]- c. D) j7 G no osds" {# m4 L2 ?) q/ ]
monmap e1: 1 mons at {172.21.196.12=172.21.196.12:6789/0}
- ]" U: l0 I H( s, |! b election epoch 3, quorum 0 172.21.196.12
; \; U! x/ D1 D2 w/ K O osdmap e2: 0 osds: 0 up, 0 in) K3 ~- n" K+ F0 Q a
flags sortbitwise,require_jewel_osds! I7 B, W) [- O+ } E# D
pgmap v3: 320 pgs, 2 pools, 0 bytes data, 0 objects" }; D8 i/ _' z$ {: i$ A7 b9 s; S
0 kB used, 0 kB / 0 kB avail
' W. q. ?( F( s0 X 320 creating
% H9 Y( _' f' f# V3 u- a7 P19 j/ p: h3 o( |% ]7 d
2
( [ d! I3 G+ D6 d36 T7 C _) \) [$ J
4
4 u" Z2 O5 j1 i& e5& ~4 O9 \$ k) e6 ~ A! V
6
5 `3 I; n; p5 p; Y4 G6 u9 t/ ]7% b2 n) G6 j6 [1 s9 F
8
4 ]4 N9 h: R8 P; r) i9
9 e- J) H9 t3 f! |* [' i10- I' m8 d; [ @$ m6 B$ P6 ~0 {4 N }0 _
11/ G, t" b& F) D7 u7 {) T3 I' l1 t
这其实 是一个全新的ceph集群,现在把之前备份的数据拷贝过来,覆盖新的数据
, E6 r2 [* O0 {# B* r) n9 V- a
% E- I$ H0 P% I[root@node02 ~]# cp -r ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/1 J( E' {3 e5 s9 @. e
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/LOCK’? y
. k4 y; Q: z" i$ V7 L: y4 Ccp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/CURRENT’? y
7 P i8 R# |7 }0 N' Qcp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/keyring’? y
4 B: A8 H1 E6 Z7 u- h* }6 P[root@node02 ~]# cp -r ceph-mon-bak/ceph-mon/* /etc/kolla/ceph-mon/6 u [, x S& M0 {4 O: P0 q
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.admin.keyring’? y
: o' e/ r% j* {cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.mon.keyring’? y
) Q$ d+ w, k! B# Z3 ]cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.radosgw.keyring’? y2 W) \; G* ^7 `6 H7 ?, Y7 d
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.conf’? y
: r# M6 U4 }, mcp: overwrite ‘/etc/kolla/ceph-mon/ceph.monmap’? y+ O1 g& t- q) P3 R1 |' z
cp: overwrite ‘/etc/kolla/ceph-mon/config.json’? y
4 `( S J& Z# s2 W9 Y1 T1' V, E# Z) i7 P5 u2 x# \
2' ~8 k' @8 J$ S7 @" N, b
3
( \: S3 X, B3 c* ~9 Q$ O& h4" W s. R( v ~+ U9 I4 q/ N
5
4 T# _# b% Z1 W# v1 R, N" K- m6 \6
y7 d# e" ]9 c$ P8 V8 q7 F5 x* H- P1 a' t
8
8 Z U, Z3 U- _6 R1 `& L8 T, `9' x3 N1 x1 s9 [. A" t: l5 D, f, }
10
1 ~+ h- b7 p' A- v! O n11
4 I' n$ E3 W$ |" _重启mon服务后,查看集群状态
' l4 e! ?( R, ^" T2 K' \; j. {1 I! |
4 |- h6 H7 Y. z- g/ O/ c; l, T' ~(ceph-mon)[root@node02 /]# ceph -s
+ m4 e0 v; `) y% vError connecting to cluster: TimedOut" Q7 U1 q6 i& i3 s3 J) b7 z+ B
1
! g" x6 C& ~" S6 Y- n* ?2 r I/ J! F% U# a7 e; l
这里只启动了一个mon节点,整个集群状态还不正常,需要把另外一个mon节点再恢复,整个集群状态才能恢复5 g" D+ }6 V0 E" F( P) G$ O# v* K* V, `
& n; j; l; M/ n5 g, {/ y! S" J
恢复第二个节点的配置文件0 m6 f6 ^) g' E/ o3 [, s* |
$ Y) F/ E) |9 z0 R1 O, P# z[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/ceph-mon/* .
# M) Y" z$ d- a# ^9 icp: overwrite ‘./ceph.client.admin.keyring’? y
! S) E6 V. p& Y2 k z- x3 Qcp: overwrite ‘./ceph.client.mon.keyring’? y M/ L$ Q( u+ m+ n
cp: overwrite ‘./ceph.client.radosgw.keyring’? y
2 y9 B( D7 i1 n8 kcp: overwrite ‘./ceph.conf’? y, h( Q0 c* m3 `/ e# B
cp: overwrite ‘./ceph.monmap’? y
- f, q9 u8 \% ?( H* l/ Xcp: overwrite ‘./config.json’? y
. x2 [0 M7 _, h# c0 u5 r[root@node01 ceph-mon]#
, j! L1 b. |9 J* [( B. p[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/
0 k, z% P$ g6 f7 Z" `: |; [9 bbootstrap-mds/ bootstrap-osd/ bootstrap-rgw/ mds/ mon/ osd/ radosgw/ tmp/ % Y8 B r) }1 B! I. T. [* F
[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/' b H7 e3 A1 I, u7 U7 Q' ~
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/LOCK’? y' h4 v' K. X+ P- J
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/CURRENT’? y& B: A( A' ?, N+ c7 x
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/keyring’? y; ?1 M% L" R$ y: t5 r [) [
1+ q) K, m: v4 Z3 ~: S, {+ D
2; A" }9 T* V9 m9 {4 O9 [
3
[( H/ _" {8 @* |4
" X: `5 s& b3 Z* `5
* F& d" m! q) h# T/ R# m6
$ R( Z H+ _! l) e* @/ `70 Q& o6 y+ m7 m+ c4 ~3 \ ^
8: I; |4 y2 g N- l* b0 x
93 m+ [: X; B, g- U& C' F$ P
10* ]' |' {/ Z7 d! m9 c. P8 z' k
11
8 O1 c/ Q% i! a7 Q: v T9 Q12
' F" U6 ~! j" G3 t9 n+ f/ B$ [13 c1 X5 d- j! |' h2 {, [
14
' ~/ Z+ E- t; w. T; O3 L* v' Z15) d( t1 d- q; O
再次查看集群状态 C% n/ _1 W( T/ {
2 m' l! q x1 R6 X
[root@node01 ceph-mon]# docker exec -ti ceph_mon bash
2 S5 F- y. i. E(ceph-mon)[root@node01 /]# ceph -s4 U; H- d3 R8 g, k
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd( M8 ?& x' J6 {+ S
health HEALTH_OK! g5 ]% `. q2 l$ c' _6 Z
monmap e4: 2 mons at {172.21.196.11=172.21.196.11:6789/0,172.21.196.12=172.21.196.12:6789/0}: [# K7 _2 P2 M! D7 H
election epoch 44, quorum 0,1 172.21.196.11,172.21.196.12
9 d2 {! _1 \) k" a osdmap e491: 15 osds: 15 up, 15 in; C; O4 H$ Q& ?; I/ C- j4 f
flags sortbitwise,require_jewel_osds
! g: @9 ]9 K( n' F5 c% i! s/ B pgmap v679711: 7096 pgs, 25 pools, 184 GB data, 50069 objects. b' Y, s- |1 y0 y' N/ M
555 GB used, 39643 GB / 40199 GB avail- e& Y8 {+ O2 f) l7 X
7096 active+clean
8 I. {" U$ ]( R3 E/ K" L- Q |
|