|
|
楼主 |
发表于 2022-8-11 15:39:59
|
显示全部楼层
创建文件系统初始化! r) t* W. C% B) B8 ]. ]* A$ }1 |3 X
9 S! n) _7 T+ i( _% F
" {4 {9 _9 I) g! ]) u+ o( l |
7 }8 n- _2 X3 O7 K8 X; `
ceph osd pool create metadata_pool 64 64 replicated cache_rule(cache_rule为ssd)
+ R$ u& f2 a4 ?* [ D1 ~4 ~. f8 z2 S0 L
ceph osd pool create data_pool 256 256
: `0 B; K1 {$ @' \/ ]
! I, }' m& A3 [+ F+ X* j/ i3 eceph fs new cephfs metadata_pool data_pool( U9 T9 k# C4 l7 K
4 c- i+ H- f2 b
systemctl start ceph-mds.target! x6 o/ Z* x0 t! x4 h+ U
4 y8 y5 g3 d! V& n% _/ Z5 x- N# R- R* H4 O$ X
' y6 P0 M5 L2 r; U- b9 U' h# w; U6 ?7 e% _0 T
, O* h/ P- {4 L; u$ u/ b
- Z$ e. n$ U9 t3 q6 Q# h, L
6 ]( H) S: C8 Z2 H V挂载客户端,注入测试数据
) m5 d# ]- `% A2 v+ \/ ^ M# y F
( O$ D& `7 w/ k3 w; T5 R- c a* H" O8 k: K: h
& ^3 `5 v1 v" ]ceph-fuse -n client.admin -m 10.10.0.7 –key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w== /mnt/cephfs
: G4 ?4 l5 R' t; f: l9 E* g+ Z7 v2 ]$ Z. {
mkdir -p /mnt/cephfs/a1/a2/a3/a4
( v& ^* x. n; _% ~5 Y" R( E' ]5 _/ N( T% H
echo hello1>/mnt/cephfs/1& S# M7 Z y: C6 p# s
! e6 x1 [) _& M8 p+ m+ _
echo hello2>/mnt/cephfs/a1/2
* ?8 @! L( ]$ b) e0 A% ^) ~5 F K0 a5 Y2 f
echo hello3>/mnt/cephfs/a1/a2/3
1 J k! A0 m8 ]) k P
- ]9 p5 ~3 H/ [! T7 p7 Recho hello4>/mnt/cephfs/a1/a2/a3/4& x! ?0 U8 M1 p; a! f, B9 e! ]
- i2 k# \5 k8 O* t+ _; R
umount -l /mnt/cephfs
6 O1 F/ Y% s' i4 ~# ]$ H- W; Z! H9 w; a' R4 C5 ~ j
Z- a; c4 z. P8 Z; J4 n1 [
# Y9 u h4 x$ P+ F3 L2 b! r, e! V/ t$ L& Y
! s7 Q8 t5 N+ ^0 O4 B模拟故障
) @( v4 T4 U) g. b& y% T
" I& T! K3 B! s% o将metadata_pool中所有obj删除,重启mds( E% y$ K* u- X* N
6 l+ x" X+ e5 {+ D4 q
5 P7 d) x, _1 A) [! z: _1 ]
8 N2 ^8 B4 W3 F) ?" A# Jfor i in rados -p metadata_pool ls;do rados -p metadata_pool rm $i;done4 D4 D. w; W& ]3 `) Y1 I+ ?
$ [4 ~3 z8 V' F2 n7 e0 bsystemctl restart ceph-mds.target( \; Q: s7 n3 Q7 N! ^4 {- f
5 z; M; k3 t# l9 Z$ B$ k. u
% K' ]) I; u y0 m5 T6 a3 A! Z7 `" L. k
. T X/ |& \1 b4 S& X6 f
' {# g7 g0 h: O$ h. c( g& a; R% p) f% H$ y4 Z
9 ~1 w# H, x9 d) L9 Y6 \恢复步骤4 E, w% ~0 @ V
: h J5 M. `! K7 k& e# a$ O
( \8 h( Y3 t" }, O: G, e& Q3 \, N" p1 f% F) f
设置允许多文件系统
% l6 h# y3 |, A; E: l3 I' R6 k& D- W$ v5 `; I3 Q
ceph fs flag set enable_multiple true –yes-i-really-mean-it
; s4 P8 a" }+ W4 `/ x2 N6 I6 c* D# R: h# l
创建一个新的元数据池,这里是为了不去动原来的metadata的数据,以免损坏原来的元数据! L h4 p( `" [1 B+ w1 d1 ^
- d, ]: u' F) ]3 qceph osd pool create recovery 8
( S3 a' q# H9 `
# c6 i/ j Y. B将老的存储池data和新的元数据池recovery关联起来并且创建一个新的recovery-fs
% M6 v8 [ J0 J5 c) Y
) E4 l" D+ Y1 E# K7 kceph fs new recovery-fs recovery data_pool –allow-dangerous-metadata-overlay
1 n. z, b6 d4 e& H* I' s5 A) j" y+ j) Q6 Z* C
做下新的文件系统的初始化相关工作+ A+ t" P4 a5 U( f3 P8 b% F4 ]" |! A
9 p+ C7 X( D8 E, b) y+ N8 f8 E
cephfs-data-scan init –force-init –filesystem recovery-fs –alternate-pool recovery3 o; g; G% O( f/ Z
' v, `2 w. J; x6 b9 a M9 z; c$ y, lreset下新的fs
0 B; g- D) W; I0 Q1 _( R! r2 L3 M) k- r* Q& r
ceph fs reset recovery-fs –yes-i-really-mean-it
( z- j9 V0 j g6 E4 X% u
# ^) s, L8 p# {3 H, Qcephfs-table-tool recovery-fs:all reset session' b$ g9 L' a- B, K9 U5 I
/ ^% _! J; }# rcephfs-table-tool recovery-fs:all reset snap0 J* c7 y- |7 N6 A! B
% `0 r7 `( P7 x/ Kcephfs-table-tool recovery-fs:all reset inode: r6 _' B+ _3 ]! ~2 }4 W+ i
8 P5 d3 O' r# R2 w( i8 f做相关的恢复; u; F; T1 V" C. q! u8 C; f- N2 r
. `5 Z7 c, A1 ]
cephfs-data-scan scan_extents –force-pool –alternate-pool recovery –filesystem cephfs data_pool
8 p. O8 S) c* E9 n6 m# k- {+ L( H& E0 u. }+ F+ k- ~
cephfs-data-scan scan_inodes –alternate-pool recovery –filesystem cephfs –force-corrupt –force-init data_pool0 d3 O/ R# G; J' t+ h# [! [1 o1 S
; N, k1 p! k0 T5 s8 o
cephfs-data-scan scan_links –filesystem recovery-fs
, I- o! \, B7 E4 b8 a$ A" [
4 u+ p/ p- F" H& x8 wsystemctl start ceph-mds.target
1 H. Z3 j5 z2 i& b" w$ U6 j7 I& G+ D! _1 |$ B8 d! K9 A
等待mds active 以后再继续下面操作" @- T( a3 m F$ M) c
' C: [5 w" P# T9 J V- h. Yceph daemon mds.mon0 scrub_path / recursive repair
/ h$ M ?- C4 F: P
5 |4 E% T- r1 x6 Xceph fs set-default recovery-fs" V' Y( a7 |5 z" d4 d( W) n
1 ]3 m+ {4 _2 A# A) b+ y, ~ U9 [) @7 m; O4 p: f/ F# [/ t% I
$ T" D/ l9 N, P, M& Y5 d挂载客户端验证* [& b7 S7 U, C+ [+ u
9 m0 b E+ G4 o% l3 b7 \. E9 l7 { C8 g2 ^5 |
: {! v9 s8 j- P
ceph-fuse -n client.admin -m 10.10.0.7 --key=AQDncgVfX4NDChAA4yAy6AmbK6YbfLha3zGA7w== /mnt/cephfs
4 s# G: Q8 }# d7 x2 K7 B: E4 p9 M+ P! F! n1 _
ls -la /mnt/cephfs( Q1 H& b/ P: H5 d
+ F# C4 B7 S" Z0 G8 {/ F( N
/ A0 D; o& }1 p, O8 L
# c, N J# C( \% C1 R& J1 D
2 d" Z: C. E% H/ y7 |
+ I' E% ? s0 H) f3 L' w
实际测试中为出现所有lost+found文件夹
/ k" k1 w7 {2 d# y/ d7 k9 E7 ?+ j/ h# d4 k+ ?( e5 j
分析1 w8 G/ f5 P- P5 Q; s
* y3 t* D$ e* G8 H) q- n通过查看cephfs-data-scan代码得知,cephfs-data-scan通过执行文件系统数据池,去扫描文件系统中对应保存文件内容的obj的backtrace,backtrace中保存该inode对应文件名以及对应目录结构,然后在新元数据池中构建各级目录对应的inode obj。对于在journal中还未flush到data池的数据,此时data池中无backtrace,此时无法确定该inode目录结构,会在根目录下建立lost+found文件夹,将没有flush值data池中的数据放入lost+found文件夹中。该文件夹对应元数据4.0000000 obj。
" Y/ I4 r" i, h- B! ]8 S0 l) Q
( X$ Y0 C" L" G! q* y. X根目录先保存lost+found文件夹信息" G' R' @& C# ]7 b- z
- u, B0 X U) P% _( [0 J$ ~6 @
+ m: {$ a$ a- ?( o' U' m+ J% o& X* ]& I( V$ E, q/ K2 g( `
lost+found obj中保存没backtrace ojb信息* K8 E1 d/ q; I: D8 X: c
3 Y! H! C8 J8 G2 l
% m/ u' e$ w @6 ]" f2 |4 O" m; }& I! q% l" ^/ X" d0 |6 X
此时recover池中根目录下已有对应元数据信息,启动mds时却没有加载1.0000000obj信息。
! [# ?; P0 u6 d0 u# _( L: E7 r" l' e0 X: d. G' k4 d
通过查看mds相关代码,根目录信息通过MDCache.cc中open_root()函数进行加载
$ i: e$ B1 i- u! R9 v" b$ e4 s! g1 h: f% n( C
% b& ^4 F' D: O8 k9 ]& [. g
# W' {$ }1 K+ G# J5 T9 Rvoid MDCache::open_root()
; t! r a! ]- a3 U8 Y7 X6 v% P/ {5 G5 ^) r
{
" K' z# o2 q* b& f! b% T) e
/ d2 r* W6 S/ g3 q( j dout(10) << "open_root" << dendl;) j, w- C; ?! @2 J, J
$ e* S5 M2 A8 x( U) K. m' l- A7 C4 S7 f: z/ x3 m$ L
# p# y9 f0 K8 D0 {* @
if (!root) {8 T% n4 a: M v) D# B6 `% j
- o* A& \5 Y7 u+ q T* `! t1 `
open_root_inode(new C_MDS_RetryOpenRoot(this));7 Q. l1 p% a3 Q% X
8 R' K/ `* _" \) [2 s" W, ~! r
return;7 A/ J6 Q, B0 ]6 W @
, S0 P0 j! C0 t u5 o6 o5 E
}
+ A5 W- M3 L6 i- m: G! Q" @' S: U1 w, B* |% z) S9 z5 Q
if (mds->get_nodeid() == mds->mdsmap->get_root()) {
% t8 F' N( V; N
6 L- q! U1 G2 y3 X+ r9 U& O! R assert(root->is_auth()); $ v+ E) o( Y: ?' o. Z2 Y
2 @$ k2 l" p7 P/ K3 x4 D3 O CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
4 L4 d( v2 z+ ^7 d
5 G. ]2 l0 i4 K assert(rootdir);
, V: X+ h( c. r* `9 f1 @0 i H$ Z$ P' @' y7 I+ l: E* s3 o
if (!rootdir->is_subtree_root()), Y' Z* B7 D/ [% @
" n5 f2 ^* |1 k+ b: p
adjust_subtree_auth(rootdir, mds->get_nodeid());
$ w$ [* t. O @: v" }) P- v5 v6 o5 r T3 I4 P/ {$ [$ v
if (!rootdir->is_complete()) {: i7 U7 n; T4 e* l
! S" N4 u* X/ S6 ?2 z rootdir->fetch(new C_MDS_RetryOpenRoot(this)); //读取1.0000000 obj中omap信息
6 n* ~, L3 e8 h' H: g0 r; E+ H% c
return;
4 P: R" a0 l; U9 |1 m$ v$ l5 K8 `7 m, d7 c% T/ w* K" Q: [! e. n& J
}3 Q; i: O# Z, e& D$ r9 e
* e" H" S8 W6 N o! c, J5 S) C% m } else {
& d# B. |( t( i8 _3 K! W5 b# M* [8 A
2 S! V9 w$ A _3 j) T& y) Q" ? assert(!root->is_auth());
U9 `. x7 Z' y$ d
0 ?' y0 ^: M' B/ G CDir *rootdir = root->get_dirfrag(frag_t());
2 u9 @1 Q# N+ q/ B. X( ?
( f& f2 h; ]% g" K: z5 y: U2 X if (!rootdir) {
* p7 O; r0 e& i- W8 K/ _4 E t
open_remote_dirfrag(root, frag_t(), new C_MDS_RetryOpenRoot(this));7 `' W4 {# s7 C, O# Y3 W. _- R9 U
' [1 E( Z1 o. H/ l' D return;
( B9 t% u4 t& t* t* ^5 n
7 Q0 K2 C- y& P) o1 g$ @) ^ }
: y9 ], G" J0 i0 j
9 R$ Y' x* f3 d% ] }
7 X/ f @: Z# {# `% m# h
9 I0 z9 N' e5 G9 N
+ _2 l1 s( k+ S( R$ ~; j
* W9 b1 K/ L3 U+ k if (!myin) {8 x9 n& w- h% V$ N
8 C+ ?* q/ G: ]; _6 |) C! h( ?
CInode *in = create_system_inode(MDS_INO_MDSDIR(mds->get_nodeid()), S_IFDIR|0755); // initially inaccurate!3 h3 }) [! l# e) f) t8 S0 c
P% t% k) @- A9 m in->fetch(new C_MDS_RetryOpenRoot(this));
B. u- o p i7 h+ |- K) V; l* m* k) |, f
return;$ o& y3 K; ~" s4 N
( m' k0 T( c# U! h
}
- t9 ~ \4 @2 _" q+ [' D
3 n8 n8 v& q' I+ a- J CDir *mydir = myin->get_or_open_dirfrag(this, frag_t());7 C4 D7 B, ^3 s9 m
* l n& Q6 L0 f/ C3 w assert(mydir);
& J9 Z# f' d7 x/ ~4 U+ _" @# |* m! G8 F
adjust_subtree_auth(mydir, mds->get_nodeid());
& |3 L% ]: u; h, ]7 R2 x+ T
& G8 \+ O$ S, }: v; g8 c) U0 r# Q6 r% i. }+ F
; y( G% Z/ u4 F populate_mydir();/ F( F6 B" ?; S. D5 r7 w' D
+ f( L6 ?- |! V: }( Q0 ?& _}% w8 ?3 r& i8 W: k# v: q5 r+ m |
3 c5 [* T4 i2 x/ `2 X7 P
7 J/ p) o9 N2 O. j3 m6 L; `, W7 N w H% ~2 s
通过代码发现,只有rootdir->is_complete()不成立的时候会去读取1.0000000 obj的omap信息,rootdir->is_complete()代表此时根目录信息已经完全被加载至内存中。
3 n; O: F, y; V( y7 ]3 s, ^# o5 p! o) m
因为新文件系统recovery-fs在启动时,直接由creating状态进入active状态,在creating过程中调用boot_create()函数创建mds初始化相关信息及内存结构,其中create_empty_hierarchy()会去构建根目录信息
& v: M2 n/ `! s( ~# j/ A+ }
3 V7 Y' {1 D/ I' v) A% }) P0 z# o3 n
8 g$ L+ n, y" {7 x& e
3 L+ q! K+ \. @ i ivoid MDCache::create_empty_hierarchy(MDSGather *gather)
2 l7 z7 m A# M$ y8 d% |' U
& j7 @$ {$ ^0 `, ]) e3 [{8 @* O" u# ^% a* x4 m# x. h; _) W* t
& x- @$ ~; H. V
// create root dir4 ^8 G5 p' L1 S/ P* V7 M! J/ d
5 ]# [/ U5 v2 s' I$ A8 `& K
CInode *root = create_root_inode();# }3 h" n/ K$ _. B( x
! c2 F' M) }" P9 h7 s
2 d0 r. O/ q( C- p/ R+ X
9 ]4 |" [3 D' f- k // force empty root dir1 B5 n6 |' ^: G8 v, d, |
9 ^% m" G# m3 I* y' j- j4 ? CDir *rootdir = root->get_or_open_dirfrag(this, frag_t());
/ b, H8 P- L- [
# A( q' s* U) p adjust_subtree_auth(rootdir, mds->get_nodeid()); $ z G: k6 m3 f1 H& f m
3 D5 y2 U" P, B* M! }4 u1 W0 t
rootdir->dir_rep = CDir::REP_ALL; //NONE;
: m# u, e+ |2 G- c [% f a) T k5 Q8 O' g( ~
3 b' b$ {' q) }. ~$ S
& u8 [+ S) F: b' I- u assert(rootdir->fnode.accounted_fragstat == rootdir->fnode.fragstat);
& h+ g2 I _7 |2 I, u6 Y# a6 U; j
3 N/ {3 N& V% q2 S& E assert(rootdir->fnode.fragstat == root->inode.dirstat);6 H- y8 q' q/ @" E1 F F) J
7 Q" k8 g5 P/ f3 A assert(rootdir->fnode.accounted_rstat == rootdir->fnode.rstat);
4 n7 n$ ]- P9 T. [/ b1 F8 y! }
) j' u) U/ F6 Q /* Do no update rootdir rstat information of the fragment, rstat upkeep magic
7 B1 D- ^8 z% J Q6 l0 M, x% r, ]% d
* assume version 0 is stale/invalid.
/ T3 M4 a. m4 c6 W
7 v6 s5 C; B; V- Y */
1 H. \0 q$ l7 a* ?& S6 p& I( K) m" q- C4 Q, d b2 F; v
# V! Q6 n; T7 a; m4 ]) ]
' w8 c' B: L+ B' N* L$ \
rootdir->mark_complete();4 A0 X2 w+ a# }. g8 M% |
% P7 N6 `! D x3 l rootdir->mark_dirty(rootdir->dirty(), mds->mdlog->get_current_segment());
. _0 ^" n- ~; W) \4 x! q9 A* @5 p& R) e8 ^6 ]0 T/ D
rootdir->commit(0, gather->new_sub());/ }8 @; F! _3 X, b, R
( |( E8 i8 M2 R+ y
& i' \& W1 t3 ]3 {8 D4 X4 l3 J5 [- ~/ n: P
root->mark_clean();
2 G7 |. P c) q* {: l' p# \
, V5 Y5 z% w: O root->mark_dirty(root->dirty(), mds->mdlog->get_current_segment());
* I: B7 h9 k5 g! @5 J" Z0 t8 E7 k0 B" R, j. @
root->mark_dirty_parent(mds->mdlog->get_current_segment(), true);
4 o" N% u( |+ U( J
/ _* o1 y. e1 [# E; }, r root->flush(gather->new_sub());# R$ M/ y/ b& `2 [- e8 ?
6 l8 ], q- J, m5 n: d
}6 T& V4 b6 j. _) y9 @- Q
0 f B4 ~! b+ |) b1 @
6 v( F7 z6 u$ i! j( S( I+ m m! m: _* y
其中会将rootdir->mark_complete()标记为complete状态,进入active之后,将不会读取根目录信息。
5 }6 e% E4 _ _1 p, [! y, c# [; A% B9 v. z: i* J: G8 b
8 r& ?, l" R, B5 L, ~
! p3 b! }5 G( P& b. {
. N. w& n' I: P8 A |
|