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

cephfs 创建文件系统,已经恢复过程 1 filesystem is degraded

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2022-8-8 13:59:28 | 显示全部楼层 |阅读模式
1.创建 cephfs1 p3 f' G1 e7 y
一个cephfs至少要求两个librados存储池,一个为data,一个为metadata。
4 V0 c' S7 J$ y4 x9 |1 D
2 ~1 ~$ b$ j4 f5 l/ o  [step 1.创建cephfs存储池fs_metadata,fs_data
5 k& L9 W5 r" o# ?2 ?. {
' m* _2 D) T9 `$ C8 `# 元数据库存储池4 k9 y0 E" r, j8 |
ceph osd pool create cephfs_metadata 8 8
  r( [# N& q; n. E# 数据
; C' ]) C! E% q  {! xceph osd pool create cephfs_data 8 8
) J4 v2 o( \% [7 m% Z7 }step 2.使用fs new命令enable 文件系统# ^* y$ j+ }9 ?# t
0 a0 I+ W5 E: b& y( G  I7 ]6 K
ceph fs new cephfs cephfs_metadata cephfs_data
8 o8 I& e9 ]; x8 O- `3 J) b4 z使用mds来观察
6 V* `9 p- t3 E8 ~  i( }' n6 k! g! X+ W
[root@ceph-stroage01 ~]# ceph fs ls4 I. `$ o: O0 O3 ^/ p
name: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]
8 I5 }( i8 Z4 O, [: e+ F9 d[root@ceph-stroage01 ~]#" h* m: I& m8 x
文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:) M; A( U4 J: |! Y
- Y4 P+ {+ o6 `5 ?/ k* e2 c" C
[root@ceph-stroage01 ~]# ceph mds stat3 T- @! v- P1 W% Y* I
cephfs:06 o8 Z2 l  L6 w2 y  ~9 h9 |
[root@ceph-stroage01 ~]#: J% q1 W& f5 ~& G/ C# {
查看集群监控状态:! T) H3 @$ o+ S& `4 L( `
, P/ i6 @* w8 X
[root@ceph-stroage01 ~]# ceph -s
/ X9 C+ U6 e7 O7 ?% Z  cluster:
; M5 |9 w7 t# m9 a. \    id:     db51539c-d566-11eb-a3e9-e6f1aaf957fd& s( b5 E+ c+ E: ]1 ~, F$ u0 d
    health: HEALTH_ERR
( R, M9 s7 A/ f& R            2 filesystems are offline- y/ {( U! W: }' g7 D, n$ Z
            2 filesystems are online with fewer MDS than max_mds; O4 b/ j& Y, C7 Q  Y0 n
3 y0 b$ D$ T4 _0 Y0 E* `$ O
  services:9 t  q  m* J" M0 `! H9 q% L4 _
    mon: 3 daemons, quorum ceph-stroage01,ceph-stroage02,ceph-stroage03 (age 9m)
  Q, U" \: ~) a2 A3 g% u* a    mgr: ceph-stroage01.cdthyk(active, since 9m), standbys: ceph-stroage03.dtasrq
: ~! Z0 \# F1 w- x; }4 ^    mds: cephfs:0 cephfs_k8s:0
6 u: }3 A+ M6 X$ K4 p0 R    osd: 6 osds: 6 up (since 9m), 6 in (since 2w)
; t- J, n9 g5 L) M* a4 _  H2 i- k: C2 Z
  data:
$ g  X: A( a" |7 y* z3 u6 ?    pools:   8 pools, 201 pgs
& y' v' ?! t* Q3 y. l* `9 r6 g9 J    objects: 68 objects, 87 MiB
2 s5 Z* Z+ j4 v: e    usage:   6.6 GiB used, 593 GiB / 600 GiB avail7 O( H$ A2 Y! ?! w/ n0 j, g
    pgs:     201 active+clean
) J7 i6 [, ^3 z4 G[root@ceph-stroage01 ~]# ) e% x5 Y; z' U- N( m" k
[root@ceph-stroage01 ~]# ceph health detail
) C# m/ Z, k8 W0 CHEALTH_ERR 2 filesystems are offline; 2 filesystems are online with fewer MDS than max_mds
' o8 M$ e' P# J3 `[ERR] MDS_ALL_DOWN: 2 filesystems are offline
% N2 q' E  {* Y8 [    fs cephfs is offline because no MDS is active for it.* o6 W; U2 @3 j; E
    fs cephfs_k8s is offline because no MDS is active for it.
. q7 X/ n  N( q[WRN] MDS_UP_LESS_THAN_MAX: 2 filesystems are online with fewer MDS than max_mds# O$ r! i" @/ ^
    fs cephfs has 0 MDS online, but wants 13 k& n% T. X: ^  N; s7 P1 O0 C' j1 ^
    fs cephfs_k8s has 0 MDS online, but wants 1
( Z$ V. P# t/ ?1 d# x: t[root@ceph-stroage01 ~]# 1 B) b9 T4 p/ s( `  N% W
所有的mds都没有active的状态,造成元数据无法恢复,所以此时需要放弃原来的cephfs,重建构建基于原来data池生成新的cephfs.  y; @) N0 p; n% e7 R2 ?& f

) E5 p7 F; j& v  @1 B' I2.元数据故障恢复
9 \. y) n5 a: t$ Y1 g' lstep 1.设置允许多文件系统4 b9 A, Y/ f! b2 R1 q1 t( X) Q8 a. D
/ s0 C; n' Y/ v# w
ceph fs flag set enable_multiple true --yes-i-really-mean-it+ k) h$ E0 O2 `
step 2.创建一个新的元数据池,以免损坏原来的元数据( L. o) l7 ^/ t" f- _8 _
4 f; s7 D5 o3 h- u" A. H( x- ^/ O6 W3 L
ceph osd pool create recovery 8
, \5 V5 e" p( h& o# s+ e" Astep 3.将存储池fs_data和新的元数据池recovery关联创建一个新的recovery-fs7 `( a% c& I! r3 Z1 q
. \/ |0 O7 F5 V' S9 K1 L
ceph fs new recovery-fs recovery fs_data --allow-dangerous-metadata-overlay; k3 q( I* R4 p* D" J0 f
step 4.文件系统的初始化相关工作$ p$ @9 U5 d7 e# R$ I) G1 }2 O
  v6 q# |: k( B) V6 h7 D# T
cephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery$ b. u& \  p- k
step 5.reset fs' t7 \: ~9 z; w

  `! p7 U- V8 `  E1 i, Tceph fs reset recovery-fs --yes-i-really-mean-it
( d# y, P- {. k6 H3 ^. c* Z; `
2 n! r7 _- H* Y9 f2 _6 f. H! B! [, ~[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it8 J( i3 ^8 K- {5 y8 R0 w2 ^# I
Error EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so
3 X7 [' h! j* ~- C3 `+ I& }! u% E& [# t/ F& K3 U( s( L
若失败,要把所有mds fail掉或者stop掉,再快速执行上面命令。
1 G# l* _$ L3 p2 c6 [- j1 g1 r. I! T: ^0 T9 h. h* z
cephfs-table-tool recovery-fs:all reset session8 k+ j# h7 O# V" @( b9 Z
cephfs-table-tool recovery-fs:all reset snap
* j- I: ~% j* ^( N7 Icephfs-table-tool recovery-fs:all reset inode/ A& ^+ M' U+ G& f3 c6 ^
3 }1 g8 h2 c  Q, K) g# V% W
[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset session
: v. ?: c) m9 F, r% u# j5 j/ \{
& V  A* a% w0 g/ I( f    "0": {
/ |1 V7 S$ c* n% u3 S/ G# Y        "data": {},. b) d/ [+ B2 S/ Z  M: W
        "result": 0
, L3 G& j: |" B( N& |& z7 j    }) t' R7 Q3 S6 S+ b7 g) q; {
}
0 m# u- c: S! [( m) N- S
& _) C. K! ?4 ^  Y! M[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset snap
2 r8 ?0 D1 ^: A/ ]& O{( a  t& N  S& g' ?1 M1 c
    "result": 0" \6 H% c) D( n( V+ H5 q# R5 G( ?6 {' _
}
* v$ _: y" Z5 L4 }( t
& R- c' V# Y& O" d[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset inode1 x& A  h, Q5 R( @0 o
{; c( {) t1 {& U& E
    "0": {
% A7 s' W" ]# m1 W. S        "data": {},
. W% \+ w* w, b5 j2 C        "result": 0" m# U% K/ Y: F! p( t+ K
    }8 S+ K- }, v# j: }  u
}
8 z, r$ C' c/ e  C% G0 H  v0 e. v
) d# w' N/ \6 c
# A# W/ f7 H! O. B出现Address family not supported by protocol的错误忽略掉
9 _5 Z4 D4 V+ U2 ?$ p[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it. L0 z( Y. E- t/ n- t6 i. w
Error EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so
7 O% [* R2 ~2 b1 }4 I) g  X
8 h, @( v3 ?5 t
& k. f$ t) l3 n4 j/ s& }4 I( G8 F) K  H
[root@ceph-1 ~]# ceph fs status
2 @! c0 ?+ t- X8 d) P' p3 _, Tcephfs - 0 clients
4 u9 z" l4 q* u$ L( M7 b% ~! t======
9 U) r/ o( b9 R" H+------+--------+--------+----------+-------+-------+5 z! }8 W- o, F
| Rank | State  |  MDS   | Activity |  dns  |  inos |
; ~/ C4 k, e0 N1 u' f9 F4 Y7 I( ^+------+--------+--------+----------+-------+-------+
& c7 C; D* e. z3 |. D- I2 T' K|  0   | replay | ceph-2 |          |    0  |    0  |
7 f4 x( D9 b  s1 l+------+--------+--------+----------+-------+-------+* W) L* ^7 P( M+ p+ x6 W; \: z
+------------+----------+-------+-------+
& v# B5 L' e/ S9 b/ ?$ ?|    Pool    |   type   |  used | avail |
! M( z) ~3 `0 @, R* v+------------+----------+-------+-------+8 b/ b# f' n4 \
|  metedata  | metadata |  569k |  275G |) L% g. d2 c+ O2 _
| cephfsdata |   data   | 1273M |  275G |
/ F+ C, g8 m* {& x$ q. H3 ]( ?+------------+----------+-------+-------+
9 |' D, ^3 ~2 w7 Lrecovery-fs - 0 clients- I. V; c3 k3 G$ i/ X
===========3 D. b+ `2 Y/ d) ]4 m# E
+------+--------+--------+---------------+-------+-------+5 T7 S. e9 s6 _3 j7 j
| Rank | State  |  MDS   |    Activity   |  dns  |  inos |. R, ?, a9 [5 v2 y, G
+------+--------+--------+---------------+-------+-------+* z$ o/ h$ L* c. J. w% a; O
|  0   | active | ceph-1 | Reqs:    0 /s |   10  |   12  |
0 G( i0 Z7 s3 r, q+------+--------+--------+---------------+-------+-------+
/ G! @- k4 T) m3 V  M+------------+----------+-------+-------+
/ p! Q. {1 o7 b|    Pool    |   type   |  used | avail |
6 p; c7 G- @5 @- G+------------+----------+-------+-------+
( T4 F# P- F" X5 }# e* t& F3 P5 O|  recovery  | metadata | 2138  |  275G |
% Y; Z0 I% G1 w* a& o# L3 J| cephfsdata |   data   | 1273M |  275G |" b" b( [$ d7 ]/ j& O7 e
+------------+----------+-------+-------+
/ I. T% G8 D# F% z
# y4 F/ W$ l5 e0 r& s- ]! O4 d8 ~+-------------+4 ?- g! Q" A* ]7 _% G9 c3 J
| Standby MDS |- E+ S5 w5 Y) r- e
+-------------+
6 k% m4 n1 J: ?0 ?$ i& F8 S! w|    ceph-3   |. z3 T0 N3 p3 j. G# n; P
+-------------+
6 H( o* ?, K; S" S7 b; FMDS version: ceph version 12.2.8-52.el7 (3af3ca15b68572a357593c261f95038d02f46201) luminous (stable)# l3 h3 C' [9 e
1 V: m& y% Z" D) O9 _* J' E

8 O8 C, d& K! x' Y1 D- G% S; wstep 6.恢复相关
) I) E6 S3 r0 f# O1 {4 N) e2 H( r) D9 z; D* X  |- ]  L% \( n% n
9 Z  }& ^5 F7 X0 g
( a7 c" t1 B' J$ Y8 K+ c
确保新建的recovery-fs没有active的mds,有则stop掉,不然该mds容易crashed。. w; a$ F, g( U, o; s$ Y

7 u! V* r1 w+ D' j, @4 A. Z4 R# u. a2 J: ?: }
cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem cephfs fs_data
, V" s2 Z) P% M8 M8 U8 zcephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init fs_data
5 g; w, P  X  y& @# mcephfs-data-scan scan_links --filesystem recovery-fs5 _/ y% X- Y: _1 _% @; c9 N! Y5 u
[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem
# A( i8 Y9 n7 b[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init cephfsdata0 z1 i$ Q4 H) Q4 |
[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs
4 z' u  Y6 u7 W出现Address family not supported by protocol的错误忽略掉/ W" R+ |2 F% F; [1 w4 a
8 X+ ]; q' g2 n* b/ E7 u3 p
systemctl start ceph-mds@node82
& v4 X" E- Y1 p# q$ V2 N等待 mds active 以后再继续下面操作
% ?; m' J5 x8 F1 }1 m: t) [2 o4 |4 i- R! h; M. A& B2 g4 Z& N
ceph daemon mds.node82 scrub_path / recursive repair) T: J  O# t& q6 ^, T
设置成默认的fs
9 ~4 R  D5 V9 [) S
0 O6 _( D1 @$ M+ sceph fs set-default recovery-fs/ g2 g% b8 [0 g" v
[root@ceph-1 ~]# ceph fs set-default recovery-fs/ R( K  s/ |# u! q% k" i& p+ D
3 C9 K! T  g  y8 Y9 L) J
可以看到在lost+found里面就有数据了这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的。$ A) D) J0 [) r  f& b

% e1 g8 a+ ]  @6 h5 J: _1 M' O备份原始的元数据信息
. k: r( L3 c  \$ P# z+ ^* [) h) ^' m( s& X3 U/ y7 ~7 }' c& P6 A
ceph daemon mds.node82 dump cache > /tmp/mdscache
2 R9 p7 P2 d0 C9 @% M# H& `5 ]6 ?0 _" l& j; H3 i) \, k+ o
[root@ceph-1 ~]# ceph daemon mds.ceph-1 dump cache  >/tmp/mdscache
$ e) ]' P( Y- I; ^; f
3 K! z0 D- w! C7 ?- l4 Q7 W[root@ceph-1 ~]# ceph-fuse -m 192.168.120.23:6789 /mnt/# Y  ~6 M' ]# L3 ]0 S) s0 O% k
2022-08-08 14:34:55.355051 7fa47e9940c0 -1 init, newargv = 0x5588a05e0720 newargc=9ceph-fuse[43889]: starting ceph client
5 _5 N- m# B3 ~+ q  b7 |7 E/ y8 Q+ z
ceph-fuse[43889]: starting fuse$ A! B; ~" M' g7 K4 p
[root@ceph-1 ~]# df -Th- z5 ]( F6 r  f% p6 V& U
Filesystem            Type            Size  Used Avail Use% Mounted on7 X! s2 \: y% w  L
devtmpfs              devtmpfs        1.9G     0  1.9G   0% /dev
' d5 T: b" r0 ]8 p# Atmpfs                 tmpfs           1.9G     0  1.9G   0% /dev/shm# v' p4 f4 `5 B" a' j9 I
tmpfs                 tmpfs           1.9G   25M  1.9G   2% /run! h% Z4 x$ J+ ~
tmpfs                 tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup# S+ N8 |7 C( S! I8 h  E; e4 g
/dev/mapper/rhel-root xfs              50G  7.9G   42G  16% /
; d+ [  [* N% N" v6 c/dev/vda1             xfs             497M  143M  355M  29% /boot* O& [7 M) a# P' z& O0 @" j
/dev/vdb1             xfs              98G  529M   97G   1% /var/lib/ceph/osd/ceph-07 M- d5 c: n$ T$ i1 ?9 T) E
/dev/vdc1             xfs              98G  527M   97G   1% /var/lib/ceph/osd/ceph-1
+ Z1 Q5 B# |( z! L6 p3 `tmpfs                 tmpfs           379M     0  379M   0% /run/user/0$ }+ p. y4 X% {0 N8 J3 u
ceph-fuse             fuse.ceph-fuse  278G  1.3G  276G   1% /mnt
, E# G- A) R) M6 X/ Y[root@ceph-1 ~]# cd /mnt/
* X! b& y! ^6 m- z8 h) ]* q7 F[root@ceph-1 mnt]# ls+ k: Y* k8 k" \8 b
lost+found, N8 e& T- W1 Z3 Z
[root@ceph-1 mnt]# cd lost+found/
% t$ P. F# j" |/ ]1 C[root@ceph-1 lost+found]# ls& p$ Q) F5 p1 y. p- Y; s: [
10000000000  1000000000d  10000000019  10000000025  10000000031  1000000003d  10000000049
% }  |* v7 {- L# N) @" n- P10000000002  1000000000e  1000000001a  10000000026  10000000032  1000000003e  1000000004a
. |2 k6 @) ~6 {/ v, I) L2 h* ^2 U( l10000000003  1000000000f  1000000001b  10000000027  10000000033  1000000003f  1000000004b8 A$ M0 _1 P" E
10000000004  10000000010  1000000001c  10000000028  10000000034  10000000040  1000000004c# }6 t) c  |! m, o9 e' u
10000000005  10000000011  1000000001d  10000000029  10000000035  10000000041  1000000004d
& \  q, w7 `0 @; a10000000006  10000000012  1000000001e  1000000002a  10000000036  10000000042  1000000004e
5 _; w: L. k/ P6 Q: h10000000007  10000000013  1000000001f  1000000002b  10000000037  10000000043  1000000004f5 X0 G5 u8 n+ Y- N/ i
10000000008  10000000014  10000000020  1000000002c  10000000038  10000000044  100000000502 b0 [4 U; ]7 d7 o8 }* P1 u% d
10000000009  10000000015  10000000021  1000000002d  10000000039  10000000045  10000000051
7 M* D+ F  R# s- Q* T1000000000a  10000000016  10000000022  1000000002e  1000000003a  10000000046  100000000527 O& {: B7 G9 z
1000000000b  10000000017  10000000023  1000000002f  1000000003b  10000000047
8 ]4 N+ B/ t) c* d) R8 s; \! q1000000000c  10000000018  10000000024  10000000030  1000000003c  100000000482 ]* r5 M0 I' h( v' s, w- j
! d; P) k5 @; K8 r3 ]: l
元数据恢复原理& R8 Y2 O$ @1 s- }' d: x
一般文件系统采用的fsck命令来维护文件系统一致性,但是fsck对cephfs的难度是非常大的,主要原因在于其机制存在根本的区别:
" o  S3 K: D' T" c
- f3 S" E5 G" x$ }cephfs修复的是一个rados集群数据而非一块磁盘设备;8 R. I) \( T8 `0 u% c& x
需要精确的识别数据的所有数据片,及这些数据片所属的inode7 x4 D+ F7 d1 ^  z7 _# j6 q
大量的元数据不可能全部保存到内存中0 e, x5 G0 \; O# D
数据丢失原因可能在于0 v1 @# x4 i& f/ X* [) k$ v
(1)系统bug导致;
  i. _, w: P1 ?$ f(2)由于RADOS同步的灾难性故障——可能到时大量数据丢失;
: W; S5 {$ C) L- M7 K" i(3)bit位翻转(bitrot)
3 h( T) n. s2 r; b7 Wcephfs-data-scan4 x$ f% B6 `0 \( y. N, N( v! }
cephfs-data-scan根据数据存储池中的内容重新生成丢失文件和目录的元数据对象。% v5 }! t: q3 H1 T7 B9 B
step 1.初始化5 F: _3 f" J+ K2 C6 D. z
0 k( P( m$ I! U  X# t' E
cephfs-data-scan init( u! Y7 J, I: P" z) a

& v  Z: f2 ~1 N% ^* ~+ Q5 {! I7 astep 2.扫描所有对象以计算索引节点的尺寸和 mtime 元数据;) u& y2 ]3 b. ]# z

8 z& k% U7 G6 vcephfs-data-scan scan_extents <datapool>
  @+ a; U$ @' \7 G1 C0 R
0 T6 H3 }: |, W5 F* I. D```bash
4 x* q8 H( r, ^$ `2 O& p7 V* D" B/ d( f' `step 3.从每个文件的第一个对象扫描出元数据并注入元数据存储池。
: `  ?4 F' s! P3 V! o```bash
( C, C! j: z% ^! f: z- R+ Z( {) i; t0 c5 g% P
cephfs-data-scan scan_inodes <datapool>  y, @" C) c, }) W# h5 a
% A% J0 n. x& x, g# V5 r( b
如果数据存储池内的文件很多、或者有很大的文件,这个命令就要花费很长时间。要加快处理,可以让这个工具多跑几个例程。先确定例程数量、再传递给每个例程一个数字 N ,此数字应大于 0 且小于 (N - 1) ,像这样
6 ~4 B" M, A" X0 X3 ?+ g  i* Z! m& b! @# S, L
# Worker 0$ o0 |  E- H; w2 ]3 \3 l" U' U9 s
cephfs-data-scan scan_extents <data pool> 0 1
% E* U- K( [* x. d" w; B$ e7 `8 i$ U# Worker 1
" z! c, j9 O9 o4 Y' t4 ~cephfs-data-scan scan_extents <data pool> 1 1
2 B& d5 c8 e! ]# {# p" p# Worker 0  G1 g: ^  w  \; L8 ]
cephfs-data-scan scan_inodes <data pool> 0 1
0 o! J  [# x* c$ o# Worker 1( Z) {) T: {9 n; m& M
cephfs-data-scan scan_inodes <data pool> 1 18 ]0 T! z! Y" N+ c& Z/ V
8 \( e9 m+ {9 ]2 F6 S; h
8 C7 J+ L1 N5 u4 T6 Y0 C+ o% v
3.mds rank 0 is damaged
' }, X  x6 Y0 t# [; ], T! j启动ceph后,出现如下错误:
' c- R) u% |8 c- S# U0 F( ]3 b  s% I+ g2 d8 ~
[root@k8s-node2 ~]# ceph health detail
7 S8 Y. {  }6 W4 F% [5 w# C0 P) nHEALTH_ERR mds rank 0 is damaged; mds cluster is degraded0 w/ R# B. e4 P7 r' C
mds.0 is damaged
/ K2 T& f9 J6 b0 X0 i; o) emds cluster is degraded, f- h! H3 u, k& E8 {
提示 mds.0 不可用。
/ z2 h4 U; q# B* m/ x- Z在部署ceph时,安装了3个mds, 分别运行在3台服务器上。并且参考官方的配置,使其中一个作为 master 对外提供服务,另外两个作为 standby。来预防单点故障。(max_mds 设置为 2)+ k7 H6 }) G, d
http://docs.ceph.com/docs/jewel/cephfs/standby/#examples
+ |& _) w% B9 ?. z
2 M; h* [9 ^9 n( i& E! A该错误发生后,3 个mds,均为 standby 状态。按照官网的描述来看,当所有 mds 均处于 standby 状态时,其中一个 mds 会选举称为 master.8 i1 Q# W+ u' w/ X/ O6 v& d2 ]2 m
于是挨个停止mds, 随后又逐个启动并查看/var/log/ceph/ceph-mds.xx.log。发现 mds 在称为 master 时,出现了如下错误:2 g0 |% ]# i# |$ J' K( s8 W
: e) k- U1 w. b5 \' w
...4 D/ u$ n4 e3 J( k# A% o+ t: ^- f) f
2017-09-26 11:30:48.976326 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
% j5 \1 J1 R6 p4 G2017-09-26 11:30:48.976354 7f9ee1734700  0 mds.0.log _replay journaler got error -22, aborting$ \; k+ C9 n- a2 }' m4 [* f
2017-09-26 11:30:49.071230 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
) @4 A+ ?; t5 T9 B2017-09-26 11:30:49.071472 7f9ee1734700 -1 log_channel(cluster) log [ERR] : Error loading MDS rank 0: (22) Invalid argument  F- G  n* {( r; B
2017-09-26 11:30:49.076129 7f9ee1734700  1 mds.k8s-node1 respawn% q# z: L' l- w7 t1 R
...
% I$ ?6 U3 e+ V  C2017-09-26 11:30:49.099291 7f99e58be180  0 pidfile_write: ignore empty --pid-file
2 @( |, \- Q6 p/ g2017-09-26 11:30:49.571643 7f99dfacf700  1 mds.k8s-node1 handle_mds_map standby
) e6 E- B  M% T& Z( Q$ r8 N* N提示在读取 journal 的时候出现差错,因此可以确定问题出在 mds journal 上。  f1 o8 ^) l% g; w( @

7 J" h4 G5 T& t; h" I2 O' A$ ceph mds repaire 0
  U+ s; B4 w1 u0 N: m参考官方的故障恢复  u. N- _# h2 O* Y8 d
http://docs.ceph.com/docs/jewel/cephfs/disaster-recovery/
  S% M" }) R% o- p# n" L
" j& y' p  H- a( p- b7 e$ Mstep 1.导出 journal( E& }  y* g( V4 o
在执行有风险的操作之前,先将 journal 备份:
5 h1 U9 B6 B! D6 b: F6 i6 B6 W% E% y; d+ C
ceph-journal-tool journal export backup.bin7 Y  l3 w& D3 c. R
Note : 这个文件大小和ceph集群存储数据量成正比,会很大
$ {/ g3 M  _; I6 `, X0 y
8 s( P1 G# L+ N/ c  j+ S0 a- L1 W: istep 2.从 journal 恢复7 M  R; T( f1 W9 r" x
当 mds 因为 journal 损坏或者其他原因无法读取,为了恢复文件元数据可以执行:3 `) l3 X; L( P

# {1 i& h& F/ H# B5 t' t. @7 Q/ H8 qceph-journal-tool event recover_dentries summary1 z! Y# t& E& u. I
默认会从 mds.0 中恢复, 使用 –rank=<n> 来指定其他mds3 N6 M* I2 K" o* B) V: M

$ _6 [1 C+ V1 G- A4 S8 N这条指令会将 journal 中所有可回收的 inodes/dentries 写到后端存储,前提是要写入的 innodes/dentries 版本比后端存储里面的要高。 如果某个区块的 journal 丢失或者损坏,那么就不会被写到后端存储中。
7 a7 m7 ?. U4 w: z7 T) s" ]8 F: l  @# l! E
Note: 除了将inodes/dentries 写入之外, 这条命令还会更新每个 MDS 的 InoTables, 标明被写入的 inodes 号在使用中,在一般情况下,会让后端存储恢复正常状态。
0 |0 w* B0 f! R
' I" M) b4 j6 Q; R: q, L/ g6 s3 x此操作不能保证后端存储的状态达到前后一致,而且在此之后有必要执行 MDS 在线 scrub。此命令不会更改日志内容,恢复了能恢复的部分后应该把journal截短。/ m" S. Z7 `5 s9 k1 F- O
- O2 a& j" L. |7 i# V% W
Note : 然而在执行这个命令之后,集群并未恢复正常,因此还需要往下看  v4 h& s3 X; \0 F
* ~  [9 n1 v' s3 z) g9 N2 K* d
step 3. 截断日志9 j9 b& I1 ^+ |! v$ m

  ^# |, ?% S0 Dcephfs-journal-tool journal reset
$ X; t" [: E; s6 u重置journal 将会造成metadata丢失,除非你提前通过诸如 recover_dentries 的方式将metadata保存。该操作可能会在数据池里面产生一些孤儿对象。这会造成已写入的inodes再次被重新分配, 权限规则可能因此被违反。
2 J% m# V  g4 t" M+ A
- i8 F0 f/ n$ U( j' |) ANote : 有个类似的 issue中也提到了上述步骤(link),但执行到这一步后,就没往下走了。
* B+ a& v' L9 ^4 i+ D  zAnd mds rejoined again and everything seems to work fine now. 这点我没验证过,担心会有隐患。于是按照文档步骤继续执行了。
- _$ v6 \6 Y: ~9 e) p+ Z4 Z6 Y
, Z7 T% {. @' F7 dstep 4. 清除 MDS 表
* h' z6 h9 m7 |8 B) z在 journal 被 reset 之后, 它可能不再符合MDS表的内容(包括:InoTable, SessionMap, SnapServer). 重置 SessionMap (即擦除所有Session) , 通过命令:
8 c' |1 U) ]6 b, S5 @
8 u" _& W0 c" n! Q4 z$ l) E( Ocephfs-table-tool all reset session6 M- a3 c# |2 L$ r2 y9 R
这条命令会在所有mds中生效, 可以将 all 替换为指定 mds 标号。
( }- s7 B! q) b( [1 u4 G: |step 5.MDS MAP RESET. q3 w; K7 j+ y1 g
一旦文件系统底层的 RADOS 状态(即元数据存储池的内容)有所恢复,有必要更新 MDS 图以反映元数据存储池的内容。可以用下面的命令把 MDS MAP 重置到单个 MDS :
5 r8 N" F2 |7 }7 J( N4 F
4 J) m' m/ [  V4 Vceph fs reset <fs name> --yes-i-really-mean-it
/ `. b+ y, [8 j, P运行此命令之后, MDS rank 保存在 RADOS 上的任何不为 0 的状态都会被忽略:因此这有可能导致数据丢失。# @; g0 k( F0 l$ B# S8 E

; D+ r/ {4 B, N3 {$ NNote : fs name 可通过 ceph fs ls 查看" _  v0 t; p( _( M, L3 h# {
' i4 J: ^+ k' x
step 6. RECOVERY FROM MISSONG METADATA OBJECT' T2 |* u( u/ H
5 f" q0 Q6 R# g8 u8 O. B" p
# Session table
: e2 H3 y: I# }3 u: ^- w' D" \cephfs-table-tool 0 reset session
& T$ M- l7 }, J- B6 J+ G9 u& o2 W# SnapServer; f3 h  ]' K4 a; a$ B  o  ^, Q  H
cephfs-table-tool 0 reset snap
3 M( U( w, q3 |. k* l3 P/ y( f# InoTable) E1 t- \8 i8 Q6 l2 B( d2 N& N4 R9 g: E! r
cephfs-table-tool 0 reset inode
! x; E9 b* u9 n5 z( t# Journal/ S. n& q* [* K; M7 Y9 b" b
cephfs-journal-tool --rank=0 journal reset: ~0 m9 x0 t) n, ]5 `/ b
# Root inodes ("/" and MDS directory)
& v- u& m( x+ g' ^) Y6 ~cephfs-data-scan init
. M; ?' K  |9 Z9 U4 O3 \) a* O最后,会基于数据池中丢失的文件和目录来重新创建 METADATA OBJECT。分为2步。! T6 A4 b: ~& P' f
, F; U' S' n1 Z( s# Q# {5 v  x
扫描所有对象并计算出inodes 的大小和 mtime metadata
+ c5 T" m& N+ k% Y4 Y- I; W! I3 M- U; x8 n7 l- M  u
cephfs-data-scan scan_extents <data pool>. ^5 B0 @- a) t6 h& M; h
扫描每个文件中的第一个对象来收集METADATA,随后注入到 metadata pool3 q2 Z2 w4 B9 t) ^! Y8 D7 ]# j5 r

; u3 L8 p8 @4 Q( Scephfs-data-scan scan_inodes <data pool>
9 t# e7 s2 N" b( f; e5 QNote : 这两个步骤太耗时了,应该考虑起多个workers来同步处理。data pool 可通过 ceph fs ls 查看: w+ \4 V- ~8 I4 \

! Q( H2 v- [( |- ^2 d# Worker 0
$ {% A0 L+ P2 C) [6 Q% A: lcephfs-data-scan scan_extents <data pool> 0 16 j* Z1 Y" N0 u: o5 F( _/ d
# Worker 1) Q& v6 x0 [& c& q
cephfs-data-scan scan_extents <data pool> 1 1
' Y3 p$ }' \" O7 c( i  c: \. c# Worker 0
9 n' r; h1 e0 b  Vcephfs-data-scan scan_inodes <data pool> 0 1
7 g, I" F' N1 H0 {6 v+ f% G# Worker 1" c5 H& Q! \, `2 O7 V. `
cephfs-data-scan scan_inodes <data pool> 1 1
5 [  o  R: A- o6 Q# V5 QNote : 一定要确保在所有 workers 完成 scan_extents 之后再进行scan_inodes操作。==% b* U: U" o7 |" j( P
" c; v* Y) r7 s$ k/ X, X, S0 D
待所有操作执行完毕之后:
# a& p0 {  Z7 j7 d; s" `6 m* l/ A8 z: Q1 c
[root@k8s-master ~]# ceph -s1 C0 G$ e" C3 V! y" ^4 a
    cluster e61d687d-f43d-4f50-af66-da96e5856be9* W! @7 Z+ Y, @: @4 o4 S5 `" g# b. r- d
     health HEALTH_OK
. A8 E( T* k$ ]; C1 Y) ~4 `7 R     monmap e5: 3 mons at {k8s-master=172.16.18.30:6789/0,k8s-node1=172.16.18.6:6789/0,k8s-node2=172.16.18.7:6789/0}" o7 k! w2 Z5 r# `
            election epoch 676, quorum 0,1,2 k8s-node1,k8s-node2,k8s-master- n% u7 f' P) s9 O3 X3 a0 g' T5 Q
      fsmap e4970: 1/1/1 up {0=k8s-node1=up:active}, 2 up:standby
0 U6 t0 t4 f1 T0 D& z/ X- ~' b1 ~     osdmap e2914: 6 osds: 6 up, 6 in
. C: I6 `2 |# Y& D            flags sortbitwise,require_jewel_osds
5 b& o9 Q# K2 s1 p      pgmap v10110565: 256 pgs, 4 pools, 25575 MB data, 372 kobjects
: D) `0 [$ Q) g            58730 MB used, 11115 GB / 11172 GB avail
; l9 k. G: |( X# n7 J, G) m/ e                 256 active+clean
* z. p7 H7 B# f! W; J- |! U! D; [, l4 P: C8 p/ z1 S5 D- L% c/ ]2 F% ?
4 |' o* C0 b1 F+ F
, Z  d7 b: h, H4 W
$ N5 n7 d* y( P) U/ p1 m3 }
7 w2 T5 ]6 m& X; t1 m8 ]
3 L" K5 {1 d7 {3 d$ @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 22:57 , Processed in 0.028955 second(s), 25 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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