|
|
楼主 |
发表于 2024-10-18 14:23:53
|
显示全部楼层
- Z( R: D9 h- b6 a其他文献解决办法:
4 \* J% [) t0 a, k$ }% A
5 \5 H# a$ D' M7 V1 D& `, g1 问题
0 @% G( b" i+ L. d% {* L3 l( @3 W2 o1 Y5 e4 V& J( z% F
一般来说,在实际运行中,ceph monitor的个数是2n+1(n>=0)个,在线上至少3个,只要正常的节点数>=n+1,ceph的paxos算法能保证系统的正常运行。所以,对于3个节点,同时只能挂掉一个。一般来说,同时挂掉2个节点的概率比较小,但是万一挂掉2个呢?
: V+ L4 \/ I& r1 N1 g- e E9 ~5 q, B: ^& c, w( A2 |
如果ceph的monitor节点超过半数挂掉,paxos算法就无法正常进行仲裁(quorum),此时,ceph集群会阻塞对集群的操作,直到超过半数的monitor节点恢复。 z. Y) k' o9 i( a0 |/ N1 [9 o
- _7 M9 Y% j4 N- W( |
If there are not enough monitors to form a quorum, the ceph command will block trying to reach the cluster. In this situation, you need to get enough ceph-mon daemons running to form a quorum before doing anything else with the cluster.# z9 {$ L* n7 S' u0 g: B; w; O( m
: Z2 r, T" S% F2 y6 C
7 e" p% Y. e3 u8 S6 e% i; r. k5 s, z! F4 t/ Z. S
所以,- @- T8 }4 j5 K' m5 u* D
+ D- B6 Q; z" O. v(1)如果挂掉的2个节点至少有一个可以恢复,也就是monitor的元数据还是OK的,那么只需要重启ceph-mon进程即可。所以,对于monitor,最好运行在RAID的机器上。这样,即使机器出现故障,恢复也比较容易。
2 b3 A( m! ~2 C+ T" n: K) F- |
& B# T# F3 \/ ~: t& L* Y: {(2)如果挂掉的2个节点的元数据都损坏了呢?出现这种情况,说明人品不行,2台机器的RAID磁盘同时损坏,这得多背?肯定是管理员嫌工资太低,把机器砸了。如何恢复呢?
7 N( @ Z* g9 T1 F" L% ^% s* f |6 f/ I: j: \" \5 O2 f% V3 Q4 M
2 恢复
# F3 X7 ?& q, K8 M7 @ Q" {其实,也没有其它办法,只能想办法将故障的节点恢复,但元数据已经损坏。幸好还有一个元数据正常的节点,通过它可以恢复。: }, k' v# \. T% y, F
R6 F" b0 E) }5 m
, k, }# t, m0 `. T2 R3 _2 x X- n# t6 P
添加monitor的步骤:
) h( @ b$ k% `1 g" x. ?6 ?+ V0 u6 I" c; g5 m7 ^6 M
$ ceph mon getmap -o /tmp/monmap # provides fsid and existing monitor addrs
! r8 b8 x( S& A F
+ w5 B& w4 U* i- x$ ceph auth export mon. -o /tmp/monkey # mon. auth key2 u9 I- `$ ~# `# `# K3 d7 u
/ D6 h: s- M+ v) L, P0 _' ]/ a$ ceph-mon -i newname --mkfs --monmap /tmp/monmap --keyring /tmp/monkey, L0 D9 \+ q5 |% Z, U% `# S1 a
0 C- z) \: P1 ]# Z+ H! K5 H
所以,只要得到monmap,就可以恢复monitor了。3 ]; C2 a. b* `* P
( b- F$ C4 \' z! A* ^& T为了模拟,考虑2个monitor节点,挂掉一个,此时通过网络访问ceph的所有操作都会被阻塞,但monitor的本地socket还是可以通信的。( S: `0 I- e) k! N0 ]8 a& _ I: Z9 R
; H8 { x7 l* f& tNewImage
b( K7 S* T e% q9 z3 u/ X2 z. T" j f0 w) I
7 g1 [( {/ ^# F8 n' A8 Q% A# r- W. r
/ G' h' F3 E3 K" U但是,让人蛋疼的是通过socket不能进行monmap的导出。不过,幸好有monmaptool工具,通过它,我们可以手动生成(注意fsid):
; L+ k' f$ Z& r2 \. I# m! k* a+ ~& P4 G' ?5 c8 o6 p
# monmaptool --create --add vm2 172.16.213.134:6789 --add vm3 172.16.213.135:6789 --fsid eb295a51-ec22-4971-86ef-58f6d2bea3bf --clobber monmap
+ _- K/ k2 p; s/ o8 u; O, h: z! ?* ?. q9 N
monmaptool: monmap file monmap! v0 @3 |6 @& W" K
1 v% o% |4 v8 Z, ymonmaptool: set fsid to eb295a51-ec22-4971-86ef-58f6d2bea3bf
7 G% z t) J) D0 x, r9 Z0 Y. W( `
& j- k* i+ q& {4 W/ T" omonmaptool: writing epoch 0 to monmap (2 monitors)) y5 `- r1 {1 b0 I0 Z
) |+ F0 R4 c1 c
将正常monitor节点的mon key拷贝过来:
' e- c) b3 Z# m, `' K P V! l3 G4 d7 \6 W5 S* `
# cat /var/lib/ceph/mon/cluster1-vm2/keyring
( M: W- }( K- u7 ?& o, p" R/ ?8 r" j. y' x8 z
[mon.]
2 B2 @8 _6 L. I0 K# |! P; o4 Q6 u* V+ q8 d% r* g
key = AQDZQ8VTAAAAABAAX9HqE0NITrUt7j1w0YadvA==
! D) `% ]3 I# T
/ H/ b% k+ j/ j% e5 p! c caps mon = "allow *"
% A4 ^0 l: ]: {
/ H f6 T) F' o: S* M
/ B4 W: {0 P, p" [+ e0 m5 s4 L k
9 B; ^' h* r. A0 A然后初始化:: v O" p; o3 Q5 ?0 Y
+ u1 c# h4 b. d! ^* M
# ceph-mon --cluster cluster1 -i vm3 --mkfs --monmap /root/monmap --keyring /tmp/keyring4 ~8 \& k- _* T l* L
% p+ W/ i0 b# ]+ h* n% Hceph-mon: set fsid to eb295a51-ec22-4971-86ef-58f6d2bea3bf& h% q- m" z; c- d! j
9 w) W: l9 h" j' c7 mceph-mon: created monfs at /var/lib/ceph/mon/cluster1-vm3 for mon.vm3, D' P% M* |$ f# U( q! Z/ H% G& ]
7 |/ @& F) d( n, y, K最后,启动故障节点:/ ~. y9 L1 _% o) w* Z) ^
2 K/ B4 b4 ^% n" e, @# ceph-mon --cluster cluster1 -i vm3 --public-addr 172.16.213.135:6789
" Y4 b3 l0 g* s! p/ c2 g* g0 U* l5 A0 v: H; t- _% G
6 u9 @0 r& I! w2 A) w3 N/ s a/ |- `# f" ~* W
NewImage
% W: o4 u5 b; w
: x) g: d4 e2 D- M一切OK! |
|