|
|
本文介绍ceph集群中所有mon服务均无法启动或者说mon节点所在服务器os全部无法启动情况下的恢复方法,当然,这种极端情况出现的概率非常低,这里前提是要做好mon节点的配置文件和元数据备份,不然就没办法恢复了。我的环境是使用kolla部署的,恢复方法也都是基于kolla工具下才有效,如果采用物理机部署,具体操作上会有所区别,但大致的思路和原理是一样的。
/ J# E6 e D! p h5 G- ^* a; Y) N
" a) g/ `; J2 U0 l' h4 P) L$ ~备份配置文件及元数据
# S4 S5 c) }( M+ {' u
+ b( a8 Z, F: [& o2 z1 R. W: ~ o9 {采用kolla部署,默认的元数据存储路径如下+ t0 |" `; k9 U6 C( F" m4 W9 Z
3 S) Y6 n- |3 R6 E7 Y
[root@node01 mon]# cd /var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/
5 `0 h$ d k( k" _ {0 ^[root@node01 ceph-172.21.196.11]# ls* Y, j @2 Z+ Q8 K* B" I3 v
keyring store.db
( Q. o3 Q4 F+ `1
1 v/ ?6 ^2 Y( X+ Q- t- b2
, q5 S% P4 `) B( Y3
- s% y7 \8 @* n1 H4! K* x0 @* F: }+ o8 Y0 ]9 d+ P
将该目录完整备份
7 L# n* V( C. `9 v0 e- E; k1 \* l1 Q2 P8 w/ K+ p/ G: Z& @* d
[root@node01 ~]# cp -r /var/lib/docker/volumes/ceph_mon/_data/ /root/ceph-mon-bak/
3 B; w1 ?# J7 u! Q1 h1 P5 B6 P$ |: l1% g6 B1 b, i6 j& R4 W7 B
2" g. u* d. ~" K, J |) O: m' W" H
另外还有 配置文件,里面保存了key,默认路径如下:' x1 t2 p6 f4 V# g& P8 O
2 v5 b0 X7 |9 W. Z! J5 @[root@node01 ~]# cd /etc/kolla/ceph-mon/
7 X5 c5 E0 z$ ]# |/ D" A* [[root@node01 ceph-mon]# ls
+ e- K) b! T! W% u6 [ceph.client.admin.keyring ceph.client.mon.keyring ceph.client.radosgw.keyring ceph.conf ceph.monmap config.json. R% X2 i$ w/ f# ~
1
2 Z7 a0 l9 h: ?/ K' S- \2
. W7 j, s7 u$ U# ^& @/ ]% q2 L5 D3; J( v, A3 A" l2 l4 h3 a
4# z! a k& \; {" F+ a
同样,将该目录完整备份
5 l' B* [ M3 X" h
! H, e% H1 x% |7 X4 L/ I4 G[root@node01 ceph-mon]# cp -r /etc/kolla/ceph-mon /root/ceph-mon-bak/, O# l7 _$ H8 v5 x) o
1
% M1 t7 G. F) H5 O4 a2 |2 T2 g2 ]' o, Y* |4 [4 d n
我这里所有的相关进程都是跑在docker里,删除mon服务和数据之前先看下集群的整体状态* }0 j1 K- n% y: V
* F) S. h7 V9 G% @9 `! y- B[root@node01 kolla]# docker exec -ti ceph_mon /bin/bash" l0 c0 E" A% D7 q9 P, U
(ceph-mon)[root@node01 /]# ceph -s4 b' u" a: }3 e9 V( {
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
9 S5 A/ O& X- g. ^4 Z; y) g health HEALTH_OK
l$ L+ ^( f3 t1 u0 l! P: U$ d/ i7 H 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}1 j% n0 L8 i7 ?
election epoch 44, quorum 0,1 172.21.196.11,172.21.196.12
+ b% e, [% R6 x8 X osdmap e491: 15 osds: 15 up, 15 in9 [. ~3 P5 E8 J
flags sortbitwise,require_jewel_osds! Q- o/ ?# X2 r6 P% n
pgmap v679746: 7096 pgs, 25 pools, 184 GB data, 50069 objects9 E! n2 K+ u% Q& w) }6 h
555 GB used, 39643 GB / 40199 GB avail1 m5 W/ s9 h7 p2 f+ w! q
7096 active+clean
1 x9 N& [% `: z, j" y/ E11 t4 ~, V8 w T
2
: X- s: T- b' j, q0 R5 Q$ `3. n) c# L3 i8 I/ m- w. Z
4$ F2 r" a- [6 H. ~
5
- G9 Z2 u- I+ ?$ [3 E: c( s$ v. F6' q9 t: @# W* q9 j2 w c5 Q8 y
7" `0 W% [& J r2 ]2 C
8! l0 W3 M9 N8 \/ J
9, ~* @6 _# \0 X$ [1 n
10
* f1 r+ d9 E! y* l11
1 Q1 B- c1 W+ m1 Y; P- w- p& u' o125 w4 @$ L# U$ z
有2个mon节点,15个osd。现在我们将mon数据和容器都删除掉
; H, u- h Y0 M3 Z" w, O, G
2 P* ?6 q# M" B8 K# F- Z s[root@node01 kolla]# docker rm ceph-mon -f
$ A+ u8 D m* Z* B3 _: G6 P( x[root@node01 kolla]# rm -rf /var/lib/docker/volumes/ceph_mon/% j& ?' I- U3 i: I6 H, v4 {( h
[root@node01 kolla]# rm -rf /etc/kolla/ceph-mon/
6 ?% g0 E& a! h( l14 w3 h* R5 `1 E- D! t/ d
27 T# ]$ f+ s+ M, M& h' n
3
6 n! `" f% I7 U" B另外一个节点执行同样的操作。删除完之后,修改kolla的配置文件,执行部署命令,会发现有错误,在ceph创建keyring时中断了,报错信息如下:
" X8 x) `$ k- y( o& u+ K1 k! i! b3 K) Z# \/ |: [4 ~" U
TASK [ceph : Fetching Ceph keyrings] *******************************************
& `& l% o" w9 ^5 I
4 a$ I; g4 p# E. B, P) b4 z& Pfatal: [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”
" Z' w; o! c/ @' z# O# g1; K) ^% w! k. {% e3 v6 x
27 j( B- ^& ` x
3* n/ ]. h' I7 m# s8 f( h
原因是在我删除容器和配置文件后,kolla生成的相关volume是没有删除的。其还存在于/var/lib/docker/volume下。因此当再次构建kolla时,这些已经存在的volume会阻止ceph_mon的启动,会导致上述错误Ceph keyring无法获取而产生的一些错误。因此 删除掉docker volume ls下的卷。再次部署就能够成功的解决问题。; @" u p1 P/ t+ `0 o) l, p
% _. ?1 d* u% m! d
[root@node02 kolla]# docker volume ls, v- j U( |+ ~$ `
DRIVER VOLUME NAME
8 O4 S1 u/ `/ ^2 flocal ceph_mon% [+ b+ a, J: N8 P
local ceph_mon_config& T; D0 ] C) P8 @
local kolla_logs8 p3 x. Q/ b' O
local libvirtd: K( o1 g, b# `; N6 @+ Q
local nova_compute
: y& K: z3 `: i2 x% P' Dlocal nova_libvirt_qemu! `3 n, T3 r5 F4 L
local openvswitch_db
% o7 n# W" _3 a( H3 t* d[root@node02 kolla]# docker volume rm ceph_mon ceph_mon_config
`4 g7 g2 w4 I" \* V0 H- e1
- c. O) u+ |! b" {( Y: `+ O5 e2
8 p6 k# j+ F: I9 M' C+ l+ Z) ?6 Z6 y7 |3" Y9 a) J L4 S2 ^$ w
4
+ I+ @4 k# ^" e9 t& r5
* x( ]" h* d3 T0 a5 ?6
1 T% O3 B$ s9 ]1 f7
3 C$ J; a5 M! M" c6 a8
+ {- Q) Y. J3 L9 |9, m% S) p5 R9 M$ ^0 x$ @
106 x" v* m4 C$ P6 j) k2 S- f
这时再部署即可成功。这里有2个mon节点,我是一个一个的加入的,添加完一个mon节点后,查看集群状态8 l+ b- h4 F; k( n7 M4 A
8 _& E4 A# h! ](ceph-mon)[root@node02 /]# ceph -s
* J( B/ H: @% q; k cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
5 [7 O, d) p9 j health HEALTH_ERR
i: K9 [5 b3 \2 R' _ no osds
5 M$ i' J" s5 ` k" L monmap e1: 1 mons at {172.21.196.12=172.21.196.12:6789/0}! E. ]3 a# q& L9 W; o, G" X" \/ z
election epoch 3, quorum 0 172.21.196.12
8 t j2 m6 K. ]# j' l$ | osdmap e2: 0 osds: 0 up, 0 in3 N7 u$ b& H% A7 P/ @5 {7 N$ Y* C
flags sortbitwise,require_jewel_osds) |8 F5 s5 ?) g7 O* h
pgmap v3: 320 pgs, 2 pools, 0 bytes data, 0 objects
( j! V; d& }! |, M 0 kB used, 0 kB / 0 kB avail, |# n0 C( b3 P% R- l4 y
320 creating
3 P7 H' j$ B5 F4 m& O6 C1
0 H! K+ K6 ]8 O) O, X, ]2
% }4 M) R0 f) H1 k& k# J3
5 P* `1 E. h- `4" g- C# L; O, g/ y
5
; A/ U0 O/ _) }6
9 a# n& T3 o9 O$ l8 S! @; ?0 U9 U- M7
% y. U0 i3 S0 {4 r8/ g; R* x. U6 I* u& {/ A- | y I
90 `6 ~5 n$ T, K5 `1 @5 l
104 J* L5 d" z- u. W9 `4 @
11
e( G* j( j& ]( y- K: \5 r' }" C这其实 是一个全新的ceph集群,现在把之前备份的数据拷贝过来,覆盖新的数据+ J5 U9 Q; t" q' Q& n
1 _ s; F/ ?* c& t1 r X9 Z3 E+ C9 J" Z[root@node02 ~]# cp -r ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/( B0 H8 \7 A- y/ m
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/LOCK’? y
& ^: B3 t" h0 i9 i; c0 F4 {cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/CURRENT’? y
1 L) @* D! Y# C. Ncp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/keyring’? y+ Y/ ?- c+ h0 @* v, p% f6 {
[root@node02 ~]# cp -r ceph-mon-bak/ceph-mon/* /etc/kolla/ceph-mon/! `4 T' [+ k% H8 m7 { p% O
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.admin.keyring’? y1 n$ Y0 E0 [) f. m' |9 w
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.mon.keyring’? y( v/ B( W0 k5 q" w, }
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.radosgw.keyring’? y
) z) A+ C9 S/ a1 X% ~cp: overwrite ‘/etc/kolla/ceph-mon/ceph.conf’? y
1 e8 s7 N& f/ H5 M- o% lcp: overwrite ‘/etc/kolla/ceph-mon/ceph.monmap’? y. s* E/ t5 ?- s" }! j4 L" w
cp: overwrite ‘/etc/kolla/ceph-mon/config.json’? y. j1 a r8 D1 e: L5 k) p
16 P( e0 B8 N8 V: E
2 `8 G( W5 ?7 i
3* M2 N- F, o/ ]: J A9 x
4# [1 ~+ l4 o# U7 H
58 J+ k( Z' B w1 u8 M
6
! h/ ^6 ~5 q. M) C8 y76 ?0 g1 e6 ?; @1 r( g- o( {
8
$ n+ a7 h6 E* m( @8 z& l& t/ q9) z0 @. J7 u1 D+ E1 {2 b
104 s8 A( G; n/ {6 O U' H
11$ V% v& r: m1 j+ U
重启mon服务后,查看集群状态' g% u+ ?' B- T" B3 M
; `, X2 |5 {/ S! t$ O
(ceph-mon)[root@node02 /]# ceph -s
, e' n: i* O$ v) {" JError connecting to cluster: TimedOut( c2 u4 ~/ y7 J. F( V
1
K q# F7 n' M3 ]2
; t# I% C" S2 n7 }+ D6 X( U这里只启动了一个mon节点,整个集群状态还不正常,需要把另外一个mon节点再恢复,整个集群状态才能恢复- M. C2 ]6 N6 g; Y7 [
0 T$ F/ c7 v" f恢复第二个节点的配置文件' R* V( V- `( R% L
, d2 m$ p4 W* i9 z8 b. Y) t[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/ceph-mon/* .
' T: i) U, w! bcp: overwrite ‘./ceph.client.admin.keyring’? y
" j, {( z. K9 p" o' dcp: overwrite ‘./ceph.client.mon.keyring’? y
: Y+ G2 h+ b5 `6 t$ }cp: overwrite ‘./ceph.client.radosgw.keyring’? y" D9 M$ k% d p3 t% }, Y
cp: overwrite ‘./ceph.conf’? y
: y0 b) M# u* Y) q3 t. I6 v4 Xcp: overwrite ‘./ceph.monmap’? y
" W/ b0 o0 i! D( _( d1 ~" D# ?: Y) ^" ~cp: overwrite ‘./config.json’? y( T+ M4 E% r$ A( l& u; M0 ]
[root@node01 ceph-mon]#
& t- h' n M |- ?[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/
- d9 G5 T1 b2 m& r" zbootstrap-mds/ bootstrap-osd/ bootstrap-rgw/ mds/ mon/ osd/ radosgw/ tmp/
4 K+ e! |& f/ x, q$ W! B[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/* \' @" Q' u6 ~3 u( h
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/LOCK’? y
5 H9 c' T8 e/ Rcp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/CURRENT’? y
) s9 b1 Y5 p7 z4 d8 P; Kcp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/keyring’? y
/ ]6 {7 `& i! l9 z6 K z1
( n$ o$ y' b' ~2
6 X" D0 C& {6 e4 U% | v38 _: l: T( l* Z# i0 V- M
4
& W' K# R- I+ A5 o53 b9 t- w8 B4 t
6
( u* l4 m' r7 W4 A! B1 n% P7 M3 f" s7
1 x% X2 B$ n! X' R8! d+ ~7 I) a+ v, ^
9! m" p3 h* }# [& O, z4 k7 ^
10
# O' P7 w0 `( `9 o* C1 k1 t3 {11
9 V d# t" W3 g( o" G2 v$ W* X* a12
; a) N5 ?/ j8 y4 t" ^7 i13# n6 ^% X1 O5 A4 g
142 F7 a, C' a7 G
15
! n V7 S1 h* w e# F2 U, l再次查看集群状态
4 w7 q3 \( q! i" U+ ^
0 V1 M) @9 m) A3 T1 }0 G+ g[root@node01 ceph-mon]# docker exec -ti ceph_mon bash
* F. h8 u o8 p5 k$ {(ceph-mon)[root@node01 /]# ceph -s
2 w/ n* M, u( s7 D5 @8 H' L cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd- N% _" \: U3 K9 J9 ?+ k
health HEALTH_OK
% P5 t3 o* a( i. g# v, Q d 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}! e* _# {1 D3 o$ ]! P& l
election epoch 44, quorum 0,1 172.21.196.11,172.21.196.126 {( @9 b2 F7 G9 N4 L1 W0 w
osdmap e491: 15 osds: 15 up, 15 in" A/ d9 g, \( Y% W* \! c
flags sortbitwise,require_jewel_osds
R! j5 L- W& K+ i8 }0 N- ` pgmap v679711: 7096 pgs, 25 pools, 184 GB data, 50069 objects) @$ M8 C) M8 m1 L. {+ ?
555 GB used, 39643 GB / 40199 GB avail$ q! }9 J0 ^8 B3 z" K
7096 active+clean
3 v% D6 N% F0 g, a& Z |
|