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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-8 13:59:28 | 显示全部楼层 |阅读模式
1.创建 cephfs
% L$ J; j. c* K8 \3 O一个cephfs至少要求两个librados存储池,一个为data,一个为metadata。; h  ~& F8 x, z1 r0 n0 w
/ o7 D/ J6 x, ?; r" q
step 1.创建cephfs存储池fs_metadata,fs_data8 q- N! i0 j# h3 O9 [7 [4 v
) o; w' q7 p: \1 i; g
# 元数据库存储池
  h. m' y$ m& i( {# @$ Pceph osd pool create cephfs_metadata 8 8
! l! s& i/ X- F5 p1 A- t/ h% A: Z# 数据8 w6 r# s* @. i! {5 ]6 C
ceph osd pool create cephfs_data 8 8. N0 T. c& h: Q" c) x
step 2.使用fs new命令enable 文件系统! b( w2 f0 S8 H0 `$ E
8 z3 C6 }' ]% \" X2 o7 ]9 X
ceph fs new cephfs cephfs_metadata cephfs_data
. C1 L7 c; [6 @2 q. M使用mds来观察
/ [: {7 D" g* U9 G) l$ a3 f2 b1 f* d6 }4 Y, S
[root@ceph-stroage01 ~]# ceph fs ls
; M) Y% s8 \9 Xname: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]/ V3 V- R; N& U" a) n% `& f7 ^: N
[root@ceph-stroage01 ~]#
" k% Y$ d( H4 j: F文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:
" W) U. V, U, T; K* Z# A% ?0 @1 e& g' k+ x: j% ~6 y) w. ~" B: n9 g
[root@ceph-stroage01 ~]# ceph mds stat
9 m7 F4 r  U3 A: S. ucephfs:0
$ f# t, e) N" P  ~, d3 D4 [) R[root@ceph-stroage01 ~]#
5 s( N8 B& F: {- X) y8 X  e查看集群监控状态:1 u+ C8 g  H# {

7 K/ b# `$ O* M7 l: y& Q# O[root@ceph-stroage01 ~]# ceph -s
4 H4 A- [* Z. A1 @8 t( X  cluster:8 t# J  [) S. U
    id:     db51539c-d566-11eb-a3e9-e6f1aaf957fd! q- t2 o0 l3 j0 w
    health: HEALTH_ERR2 D- a$ O; ^" l" V* u& x% U; c
            2 filesystems are offline" w5 H8 `: }+ w% R# [
            2 filesystems are online with fewer MDS than max_mds
. Z! H! e; h9 B' _9 Z7 G. f- c0 S; G$ p% y& ^) H( R" Y
  services:+ [8 o/ U) s0 P* e) _5 r
    mon: 3 daemons, quorum ceph-stroage01,ceph-stroage02,ceph-stroage03 (age 9m)& m( f! _+ V( w7 g' D) c' \
    mgr: ceph-stroage01.cdthyk(active, since 9m), standbys: ceph-stroage03.dtasrq
6 G+ v' @/ T! q, F    mds: cephfs:0 cephfs_k8s:0, G; N& P  V6 w. R
    osd: 6 osds: 6 up (since 9m), 6 in (since 2w)
6 x8 b$ L" Y, q' D! x* _; s& B  M- y3 P; {$ z6 g
  data:: n( w; y6 q6 x' P& {9 Q0 o2 U0 o9 H
    pools:   8 pools, 201 pgs9 w" G2 m% N1 [& y9 U0 g; j( u
    objects: 68 objects, 87 MiB% Q2 S' L3 a& V( U! N- S1 g
    usage:   6.6 GiB used, 593 GiB / 600 GiB avail' h( J8 u, w- X7 t. x3 O3 b. r
    pgs:     201 active+clean
6 e' `" u3 o( i3 i6 |' J[root@ceph-stroage01 ~]# 7 j7 D) ~% ^' L/ N% E8 p% C
[root@ceph-stroage01 ~]# ceph health detail
# U+ z% }* M; i' c* y1 S8 }9 sHEALTH_ERR 2 filesystems are offline; 2 filesystems are online with fewer MDS than max_mds$ g! g8 ~4 s$ r
[ERR] MDS_ALL_DOWN: 2 filesystems are offline( d, ?) {" O8 ?* ]: s1 G" g
    fs cephfs is offline because no MDS is active for it.  z  F. I. b! T% `! ~' m6 X$ Y
    fs cephfs_k8s is offline because no MDS is active for it.
: Q- d9 m& w7 p7 P- |[WRN] MDS_UP_LESS_THAN_MAX: 2 filesystems are online with fewer MDS than max_mds
! c6 R/ u$ m' N! R, S4 h    fs cephfs has 0 MDS online, but wants 1* z3 g. Q8 `0 q& ~) m# d
    fs cephfs_k8s has 0 MDS online, but wants 1
9 g% x0 a  R, y5 {3 q. n9 X6 d3 X[root@ceph-stroage01 ~]#
6 a2 N5 a# V4 A所有的mds都没有active的状态,造成元数据无法恢复,所以此时需要放弃原来的cephfs,重建构建基于原来data池生成新的cephfs.
2 Z! c, E  O/ s. a8 D% E6 v5 x/ T) d
2.元数据故障恢复) ~0 r9 N, m6 v% l  W
step 1.设置允许多文件系统/ N. q) [+ m+ c3 K

5 M6 u: Z% w) E5 \; E3 m9 i: p8 zceph fs flag set enable_multiple true --yes-i-really-mean-it5 v8 z7 I+ b: N* m
step 2.创建一个新的元数据池,以免损坏原来的元数据* C. k- M# |  s) `  F7 t( v! p6 l
& \: e6 k+ \. e
ceph osd pool create recovery 8
8 M1 V( S% U9 [: {' Z5 I. Zstep 3.将存储池fs_data和新的元数据池recovery关联创建一个新的recovery-fs9 E& f+ {& q& a2 T/ H6 I* o
$ W3 ^( e- B$ V4 m. q
ceph fs new recovery-fs recovery fs_data --allow-dangerous-metadata-overlay
- u7 {% P$ B0 `! L% a' k! v! ]step 4.文件系统的初始化相关工作1 ~$ o7 j! u& Q

; T( w( @3 B* \3 q3 X" _cephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery5 u. a1 L/ d* f6 H" D% `
step 5.reset fs
7 t* m2 x* G( S/ l1 i" ^) O2 Y' v' X- J/ R$ @; @4 F
ceph fs reset recovery-fs --yes-i-really-mean-it# h5 {* j' E# d) K* Q; z

5 v9 F- ]. E% Q, V5 `[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it/ s! c$ Z! W3 n, ^
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& m4 ~9 l, G. n& E' w0 u
$ F; N3 `( k2 |. e3 ?$ c. {
若失败,要把所有mds fail掉或者stop掉,再快速执行上面命令。
4 l* C1 _. C" m" c- U# z7 V; K# f- j9 e6 X6 ?! x
cephfs-table-tool recovery-fs:all reset session& \0 i3 G. G8 o# f. E  |# X
cephfs-table-tool recovery-fs:all reset snap# N: f$ w# N3 M% v, K5 I$ e) P
cephfs-table-tool recovery-fs:all reset inode
4 X! I" x5 u: w5 X
8 j- x6 n" k1 J! A% J' J& H$ j8 O5 m[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset session
( z. M8 A. f) j: {5 R2 V! j{' y+ r% P1 Z! t
    "0": {# M6 a- f5 X% B8 D9 O7 \
        "data": {},
, J' q8 r8 j$ N# N. i% }' [3 `        "result": 0
+ R$ g2 w9 D8 B+ }* M6 p5 `6 P    }
. s- J. p( ~& o4 b}" {" \. J8 F! Z
4 T/ R1 k9 A# @$ `4 ^8 z
[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset snap
0 U$ {0 w4 @, [2 @, d5 J8 ~$ D{
/ b4 X2 a) _8 ~    "result": 0: x& Y& q0 c2 w5 s  [, d* v$ R
}: ?! i4 O. Y5 f/ Y$ a' i% `
/ l4 K" D3 M7 z* |3 {% ?: `! Q3 ]
[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset inode3 N$ X  g8 B6 g* d
{
2 g% _$ r) n# A$ \, a0 p    "0": {$ Q, D% E2 X' @7 F
        "data": {},6 \. o/ J. g5 u2 |% ~
        "result": 01 H  _' B5 K. a
    }
! A* w2 {: X/ Z  ^- W  ~, k}$ D& v, R' V4 @% P

8 D. N# p' I" z! ^* q9 x5 ?; |" r. y0 t3 o7 X
出现Address family not supported by protocol的错误忽略掉
% }7 p4 y2 M  {" m[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it
6 j0 }" n4 f6 m+ G2 k5 uError EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so
$ G& |. o' x* F. X
* C$ c& k9 d; _* D( @( r5 n) p1 `* U* o9 a- q
1 E/ y& y& K: F' m
[root@ceph-1 ~]# ceph fs status # q4 x+ x/ M6 U) E% t  Z9 I
cephfs - 0 clients
7 r( H/ |0 I3 x1 F2 U; b======( E" {3 @2 @5 s% O9 n' C
+------+--------+--------+----------+-------+-------+
7 }  L- V$ ^2 o* y5 b1 ]; v5 g$ g| Rank | State  |  MDS   | Activity |  dns  |  inos |
- v& j9 M; M5 E. v) p- e$ E+------+--------+--------+----------+-------+-------+
* `( E  r9 T7 R6 [|  0   | replay | ceph-2 |          |    0  |    0  |1 @7 i/ ?" g, O9 r' n3 }
+------+--------+--------+----------+-------+-------+
& \8 g, Z! o4 g% Q, z+ t* e/ B+------------+----------+-------+-------+
: c% h# S5 Z: ?" P|    Pool    |   type   |  used | avail |
1 z& W! a$ o( N+ J" D+------------+----------+-------+-------+9 d* U1 X7 @9 j- ], d% z
|  metedata  | metadata |  569k |  275G |# b' w: u" r; t( f# g) B
| cephfsdata |   data   | 1273M |  275G |
  n  {& {+ y4 `9 l7 s: p3 c, T' I+------------+----------+-------+-------+% P: v" |# y' ^5 k
recovery-fs - 0 clients3 z2 x4 w. p8 @+ _: f* ?
===========
" l3 t% M  \1 T  D! Y, n+------+--------+--------+---------------+-------+-------+
' Q2 U# G( Y! |: e7 W| Rank | State  |  MDS   |    Activity   |  dns  |  inos |% l/ S, c, t6 o& ]
+------+--------+--------+---------------+-------+-------+
- N  I+ _; d8 j! A+ N& v8 r) K|  0   | active | ceph-1 | Reqs:    0 /s |   10  |   12  |
4 S( _1 P3 ^- N1 C' \* u+------+--------+--------+---------------+-------+-------+" F1 T  `- }- m1 |2 ?# H5 ~
+------------+----------+-------+-------+, B2 @; D8 Y  h9 l# i2 j! i. p
|    Pool    |   type   |  used | avail |5 _% e  ?# I5 r6 H+ }, ~" M7 B9 j5 w
+------------+----------+-------+-------+
5 B6 p% [! K9 B: K|  recovery  | metadata | 2138  |  275G |
0 G6 P# K6 e) r| cephfsdata |   data   | 1273M |  275G |
/ E8 s* ]2 l3 @+------------+----------+-------+-------+
/ y3 x4 t- e8 J" @7 g( v
0 |7 q8 Z! {1 O% l# g/ Q& n+-------------+4 y6 j0 y; v4 I8 R' c" n
| Standby MDS |
( k9 W: \' `3 j" J+-------------+/ [1 I9 i7 B/ L( v' Y% V' L
|    ceph-3   |4 h! J8 e3 h3 @$ t0 O7 n$ k
+-------------+- ^; C0 f, O& K8 o0 `
MDS version: ceph version 12.2.8-52.el7 (3af3ca15b68572a357593c261f95038d02f46201) luminous (stable)) O3 X! G# J" C% m+ F

8 {8 c1 N! ~5 D% p, K2 w
* X. Z5 J. `2 |3 x5 ]; sstep 6.恢复相关- R2 w+ p6 g/ [( W& G0 f4 m, ^

6 |& Q' U. S! @$ z1 C6 G3 C$ H
- {* s/ [4 O* @% Q* S
8 a- c: R: x! e2 P确保新建的recovery-fs没有active的mds,有则stop掉,不然该mds容易crashed。
' c* U# L& `: m6 [
4 h. E0 A8 F' r4 k& V# R- d
6 I- W) v4 j' A% n* pcephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem cephfs fs_data
# D6 G) A. y; I& J! ocephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init fs_data
+ {3 |: `1 s( f% \& N1 E% rcephfs-data-scan scan_links --filesystem recovery-fs
' U: h3 K# f4 g+ C5 ~3 \4 o[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem' V& \1 c( H( ~! M: ]
[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init cephfsdata" }3 g0 X% s* ]- F# A* _- }. o
[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs( g6 L7 K) t, ~. a  y, d' z2 f
出现Address family not supported by protocol的错误忽略掉
- z8 f  ~8 }) n* s( f0 e$ I( m
9 B0 r7 G3 p- W1 b, S7 ^8 T7 [$ g3 esystemctl start ceph-mds@node82' O% K2 L' h7 \; ?7 |
等待 mds active 以后再继续下面操作
9 w  u% [. Z5 |# D/ d' R: P1 k, s- z5 \# N% G7 g
ceph daemon mds.node82 scrub_path / recursive repair/ ?2 o: Z; f- g* S; _
设置成默认的fs8 [5 e2 e1 Q2 B9 X8 L9 W  W

/ S5 Y3 a5 L4 vceph fs set-default recovery-fs2 C6 S: r1 |- W4 M$ J" r$ W' _3 z' ?+ J
[root@ceph-1 ~]# ceph fs set-default recovery-fs
8 B" t: a/ K3 x; c. b, a" X
, a& ?6 \/ _# c可以看到在lost+found里面就有数据了这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的。
- Y/ x  L% D7 Q' k- P3 ]0 P$ x+ M4 }& d) R8 m
备份原始的元数据信息
- S+ a+ @  @: Z) q( S  M$ D0 q- i5 @# p# V  v' ]
ceph daemon mds.node82 dump cache > /tmp/mdscache9 Q, i( l" O; N( `0 I! {% N! `7 ]
& i* _* s$ O7 X
[root@ceph-1 ~]# ceph daemon mds.ceph-1 dump cache  >/tmp/mdscache
- ]2 S" t' r8 [+ V7 x+ X
4 g  _5 A* H" m8 O6 y( J[root@ceph-1 ~]# ceph-fuse -m 192.168.120.23:6789 /mnt/( l  ^' P" [3 q9 ]- f0 A
2022-08-08 14:34:55.355051 7fa47e9940c0 -1 init, newargv = 0x5588a05e0720 newargc=9ceph-fuse[43889]: starting ceph client
/ p. x0 ?! B( y7 K, K; e: A1 v5 i8 p7 n# q% f1 o
ceph-fuse[43889]: starting fuse
( {$ S4 t  q  z5 f1 c" p" q% I[root@ceph-1 ~]# df -Th
7 ~& K6 y$ @1 i5 j1 RFilesystem            Type            Size  Used Avail Use% Mounted on- r& d" ~" \& n3 G# a2 P$ n" }
devtmpfs              devtmpfs        1.9G     0  1.9G   0% /dev
2 O$ S- F0 @+ n2 c/ Ntmpfs                 tmpfs           1.9G     0  1.9G   0% /dev/shm6 D% n! c! e7 ~! m8 ^0 D& m& }
tmpfs                 tmpfs           1.9G   25M  1.9G   2% /run, f% z0 @9 A  c6 E, N
tmpfs                 tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
+ a# J! }% O' v- `& y% Y/dev/mapper/rhel-root xfs              50G  7.9G   42G  16% /" X* N- I1 K+ g' T# z: {# m
/dev/vda1             xfs             497M  143M  355M  29% /boot: E7 R* X6 p* S; q% S$ z2 `: Y+ R
/dev/vdb1             xfs              98G  529M   97G   1% /var/lib/ceph/osd/ceph-04 H' |# j9 Z& |
/dev/vdc1             xfs              98G  527M   97G   1% /var/lib/ceph/osd/ceph-1) w' K2 N9 |- g9 N
tmpfs                 tmpfs           379M     0  379M   0% /run/user/0# S% c# o1 a4 e& J9 F1 q/ }& p
ceph-fuse             fuse.ceph-fuse  278G  1.3G  276G   1% /mnt
6 G4 [- J# P  _3 r[root@ceph-1 ~]# cd /mnt/8 G$ d/ B/ g( [3 e; |
[root@ceph-1 mnt]# ls2 d  |  S5 l1 ?$ `* K
lost+found
0 s, _/ _! w+ w+ o# w5 G[root@ceph-1 mnt]# cd lost+found/8 s( _& {# H3 k: i. A) Q
[root@ceph-1 lost+found]# ls+ x1 L7 i" U3 y; Y# K
10000000000  1000000000d  10000000019  10000000025  10000000031  1000000003d  10000000049  `/ ?# w. X. M* l+ ?" e
10000000002  1000000000e  1000000001a  10000000026  10000000032  1000000003e  1000000004a4 O  l: Q2 x/ C, I0 E
10000000003  1000000000f  1000000001b  10000000027  10000000033  1000000003f  1000000004b( o7 k9 g+ i# X3 U* V3 Q6 j
10000000004  10000000010  1000000001c  10000000028  10000000034  10000000040  1000000004c
2 w! f7 t3 w. M' N10000000005  10000000011  1000000001d  10000000029  10000000035  10000000041  1000000004d% i: q, v( w, ?
10000000006  10000000012  1000000001e  1000000002a  10000000036  10000000042  1000000004e+ ]3 E0 r' H& P( x) Q
10000000007  10000000013  1000000001f  1000000002b  10000000037  10000000043  1000000004f- v- K0 r5 n% z* x3 q
10000000008  10000000014  10000000020  1000000002c  10000000038  10000000044  10000000050* o. V0 b8 W" |  c: b6 n
10000000009  10000000015  10000000021  1000000002d  10000000039  10000000045  100000000512 `$ r" B. h7 s4 t  U! h, i
1000000000a  10000000016  10000000022  1000000002e  1000000003a  10000000046  10000000052
& O" a4 e9 s  D( M# h2 j, E1000000000b  10000000017  10000000023  1000000002f  1000000003b  10000000047! o( X4 q6 V( u2 P; \& S
1000000000c  10000000018  10000000024  10000000030  1000000003c  10000000048
3 w6 g% z/ \  x. h6 l
2 h$ |1 ~# w' v. m元数据恢复原理
) H6 X/ x; Y/ P- M6 Y) Z- `6 b一般文件系统采用的fsck命令来维护文件系统一致性,但是fsck对cephfs的难度是非常大的,主要原因在于其机制存在根本的区别:
0 J4 i, x, O" H2 D  D
3 E) S1 Z* A4 G3 P" H, g3 N1 Gcephfs修复的是一个rados集群数据而非一块磁盘设备;
& u$ x6 V; w$ O+ K4 w" n需要精确的识别数据的所有数据片,及这些数据片所属的inode
" D: @) B, [6 l  s: `: K大量的元数据不可能全部保存到内存中5 t7 d0 Q. R. I, }
数据丢失原因可能在于
, T- A' z* Z& c  a$ o0 Y) Q(1)系统bug导致;3 _- c1 W; X5 k! [/ u5 l  b) C
(2)由于RADOS同步的灾难性故障——可能到时大量数据丢失;: \* j- y3 b5 k/ ?# h" S- X' Z9 K
(3)bit位翻转(bitrot)
' I! c' L$ @" V# F; I1 z' k% zcephfs-data-scan
* U$ E4 z) }) V* X% p( [( y5 Hcephfs-data-scan根据数据存储池中的内容重新生成丢失文件和目录的元数据对象。0 k; J7 o, y" p" ^* l( z
step 1.初始化
% w5 [1 |/ E: W
; Y6 h; x& {! Wcephfs-data-scan init
# m% ~2 D0 Z2 I1 n) w- X4 ?3 o2 \) @* q0 T0 |$ V. g! ?2 Z1 E/ w" @
step 2.扫描所有对象以计算索引节点的尺寸和 mtime 元数据;: W" I% \$ h1 Q3 p; O/ O7 w

% l1 M% o) ?; z, W8 P9 icephfs-data-scan scan_extents <datapool>
! @( U3 w$ ?$ {& B/ _) R( y/ Y  M9 m2 `5 w4 F3 o, b! [
```bash
" w/ f& k4 _/ s* y. n( J0 Fstep 3.从每个文件的第一个对象扫描出元数据并注入元数据存储池。0 Z7 |! W, u, v0 |! U# q
```bash# n8 r/ F9 l* w

* C* `! j, r; ~, Qcephfs-data-scan scan_inodes <datapool>
% z5 g% j$ S" O3 _( y
+ J7 @/ f9 a" Y如果数据存储池内的文件很多、或者有很大的文件,这个命令就要花费很长时间。要加快处理,可以让这个工具多跑几个例程。先确定例程数量、再传递给每个例程一个数字 N ,此数字应大于 0 且小于 (N - 1) ,像这样8 L9 i9 R: o* C% M# q

4 ?6 ]3 i% o/ r% j# Worker 0
' m- ?- ]1 v3 s2 F" scephfs-data-scan scan_extents <data pool> 0 17 k: `( F, o+ I3 r
# Worker 1$ @! Y$ L5 @+ t9 j& ?0 W
cephfs-data-scan scan_extents <data pool> 1 17 v" S7 X4 A( K$ f7 n1 u/ o
# Worker 04 ~4 U( z7 e. x! M& }; X$ [
cephfs-data-scan scan_inodes <data pool> 0 1. o1 }5 k; F( _. v" v+ g& N
# Worker 16 @9 g& m9 r6 B# w1 u7 f- G1 y0 d
cephfs-data-scan scan_inodes <data pool> 1 1
5 v/ O( _; p4 P. F% {" \' }, j: m- ?% ^
" C! {. S) [5 |; Z! P
3.mds rank 0 is damaged8 `) f# ~' t6 g! S
启动ceph后,出现如下错误:- a3 a6 s2 f" f: u# B7 e$ L. L

5 n( n" }5 I$ U! i[root@k8s-node2 ~]# ceph health detail
1 o3 J: h" o2 G6 WHEALTH_ERR mds rank 0 is damaged; mds cluster is degraded
' t1 V" R9 Q+ a9 W3 f  [0 o- u. gmds.0 is damaged6 C; D6 ]5 y5 {8 X
mds cluster is degraded- B9 y3 f( e5 H
提示 mds.0 不可用。5 `. X  d, G% s& I
在部署ceph时,安装了3个mds, 分别运行在3台服务器上。并且参考官方的配置,使其中一个作为 master 对外提供服务,另外两个作为 standby。来预防单点故障。(max_mds 设置为 2)
# Q4 S; F7 }7 k) c  ~* Ohttp://docs.ceph.com/docs/jewel/cephfs/standby/#examples" L: \8 `3 E1 S! H/ p; y% A" Y
/ v( o" Y! C3 B0 f% O
该错误发生后,3 个mds,均为 standby 状态。按照官网的描述来看,当所有 mds 均处于 standby 状态时,其中一个 mds 会选举称为 master.
; \) I7 F* R* q; |% p- _2 Z: h! V于是挨个停止mds, 随后又逐个启动并查看/var/log/ceph/ceph-mds.xx.log。发现 mds 在称为 master 时,出现了如下错误:
8 z; r  o$ |& `' p% y* X$ b/ @
1 ]- x+ c7 U. s& M3 |4 L...% p& g. M2 M, \; @
2017-09-26 11:30:48.976326 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
' Y6 z4 C- y# e6 Y% ~0 ?2017-09-26 11:30:48.976354 7f9ee1734700  0 mds.0.log _replay journaler got error -22, aborting. l5 z) a0 f; w4 S
2017-09-26 11:30:49.071230 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)' ?' h2 P& H* r7 I; ?; A/ M5 r  d" l
2017-09-26 11:30:49.071472 7f9ee1734700 -1 log_channel(cluster) log [ERR] : Error loading MDS rank 0: (22) Invalid argument
$ C2 @; z5 E4 P% ^7 P3 g" ~2 w4 n% h2017-09-26 11:30:49.076129 7f9ee1734700  1 mds.k8s-node1 respawn" ~2 H: l, y7 P* A7 y. U
...6 @" j+ g  ^' }
2017-09-26 11:30:49.099291 7f99e58be180  0 pidfile_write: ignore empty --pid-file
3 Q, d' L# s/ G- A- q2017-09-26 11:30:49.571643 7f99dfacf700  1 mds.k8s-node1 handle_mds_map standby
2 w+ [6 e" H3 |, }6 ?  d/ a" r提示在读取 journal 的时候出现差错,因此可以确定问题出在 mds journal 上。& p& N* G- x& z" j$ H

- z3 z% p8 b* L0 E. x$ j! W$ ceph mds repaire 0- Q& f1 I5 J/ a9 X. h1 _, ^
参考官方的故障恢复9 I  ?% k3 ^6 r
http://docs.ceph.com/docs/jewel/cephfs/disaster-recovery/
4 _( {, z; y/ F! P9 _$ a3 U' v5 T
step 1.导出 journal
8 v6 |1 j" F: P在执行有风险的操作之前,先将 journal 备份:" c) _% ^8 M, |6 I9 b2 Q# H! E/ h
2 u$ v7 T1 C! r+ e: l2 ]0 d
ceph-journal-tool journal export backup.bin
8 w7 c1 k& E/ S. Z' F, gNote : 这个文件大小和ceph集群存储数据量成正比,会很大$ W8 r6 o8 a% r* s) L$ K2 z; t0 K7 u
8 s: M% ?  J9 N( Z/ D
step 2.从 journal 恢复
0 {  }9 [9 V1 K9 r当 mds 因为 journal 损坏或者其他原因无法读取,为了恢复文件元数据可以执行:& R: k% U8 O# N+ u) s" U! ]

  J" g& V( G- a7 hceph-journal-tool event recover_dentries summary- W1 |3 o1 |2 R2 M, {/ [' U' f
默认会从 mds.0 中恢复, 使用 –rank=<n> 来指定其他mds( A) C# }7 d# K" ?" o' S7 v( O
$ P+ u) I2 K, k
这条指令会将 journal 中所有可回收的 inodes/dentries 写到后端存储,前提是要写入的 innodes/dentries 版本比后端存储里面的要高。 如果某个区块的 journal 丢失或者损坏,那么就不会被写到后端存储中。
% h0 a+ t& F% Z7 E; w( a
8 u6 i0 \# M6 ]: ~8 oNote: 除了将inodes/dentries 写入之外, 这条命令还会更新每个 MDS 的 InoTables, 标明被写入的 inodes 号在使用中,在一般情况下,会让后端存储恢复正常状态。
3 s, D. `8 y: {7 d/ |* {5 O: D) @0 L& M2 o; e5 b& ~  {
此操作不能保证后端存储的状态达到前后一致,而且在此之后有必要执行 MDS 在线 scrub。此命令不会更改日志内容,恢复了能恢复的部分后应该把journal截短。
3 E! c2 [& J6 F4 ]2 Y: q+ {% y( p) J1 m8 T* p% i8 k
Note : 然而在执行这个命令之后,集群并未恢复正常,因此还需要往下看
) Z' o- @! T1 Q' ^1 c) O) w2 R  Y" k
step 3. 截断日志; {1 _! L; x  j3 o5 ]5 N% J

8 F) `- i! B( t9 ^- h  Zcephfs-journal-tool journal reset
7 u6 {3 r: q' C重置journal 将会造成metadata丢失,除非你提前通过诸如 recover_dentries 的方式将metadata保存。该操作可能会在数据池里面产生一些孤儿对象。这会造成已写入的inodes再次被重新分配, 权限规则可能因此被违反。+ w( }, R" C. G' ?4 o) ^% N: z
" f6 ?. J' W. A% H. Z9 Z% r
Note : 有个类似的 issue中也提到了上述步骤(link),但执行到这一步后,就没往下走了。
9 M5 X7 D1 P2 }- y: ~5 M2 h% F5 TAnd mds rejoined again and everything seems to work fine now. 这点我没验证过,担心会有隐患。于是按照文档步骤继续执行了。
& a+ B0 m. `5 N) X0 l2 z
6 ]5 R6 v: v, `6 x9 u' Xstep 4. 清除 MDS 表: M: g7 o1 v1 E) h
在 journal 被 reset 之后, 它可能不再符合MDS表的内容(包括:InoTable, SessionMap, SnapServer). 重置 SessionMap (即擦除所有Session) , 通过命令:
; T/ w. E8 D" F/ T$ N( _; e3 r3 w3 ?+ p1 @# @% v
cephfs-table-tool all reset session
4 s6 b9 D8 b5 p6 q" |5 v: B这条命令会在所有mds中生效, 可以将 all 替换为指定 mds 标号。2 _# J* l: _: X+ |: m
step 5.MDS MAP RESET
% P/ N0 F" G' M2 O一旦文件系统底层的 RADOS 状态(即元数据存储池的内容)有所恢复,有必要更新 MDS 图以反映元数据存储池的内容。可以用下面的命令把 MDS MAP 重置到单个 MDS :
' N+ q/ T0 N% G, q6 I& o5 m/ ?
0 j3 a6 ~. z5 g! i$ F" u( m* {ceph fs reset <fs name> --yes-i-really-mean-it
2 k& g/ _% }) R* \运行此命令之后, MDS rank 保存在 RADOS 上的任何不为 0 的状态都会被忽略:因此这有可能导致数据丢失。- Z8 `$ c) R. w

) y! b" B3 D' T9 w' C; j  eNote : fs name 可通过 ceph fs ls 查看8 a# z7 s  T  k6 B! ^2 p" Y( U& v! S
$ ^1 z, f+ [4 L- F: C, E% L
step 6. RECOVERY FROM MISSONG METADATA OBJECT
+ P0 @# W# g3 P0 h
. B8 c7 D4 ], L- C- ~# Session table8 t! [6 d# m6 }# h
cephfs-table-tool 0 reset session! ]: |! F4 E) [$ k, ?) \: Q- L
# SnapServer
2 o) q: P8 d; ]* `9 b- `cephfs-table-tool 0 reset snap
" m: C$ T6 K4 O6 r& k# InoTable- s7 p" z1 D( B+ {( v
cephfs-table-tool 0 reset inode
3 r4 ]$ j, y9 ]) S6 K, }. e) o# Journal
$ Q$ _! b& ^% J$ U8 V9 q. A! u* acephfs-journal-tool --rank=0 journal reset
0 y. T* X$ G7 ]# Root inodes ("/" and MDS directory)
# k/ r' J+ O' O5 @) i/ O/ K  _0 Tcephfs-data-scan init
0 P- P9 _! a6 `最后,会基于数据池中丢失的文件和目录来重新创建 METADATA OBJECT。分为2步。. ]9 k- [* ]. @6 v
7 y, A" M3 g  t  a$ x
扫描所有对象并计算出inodes 的大小和 mtime metadata
! l8 [' i! z/ k5 w" s$ ~3 A' l6 ?! t' H5 v, w$ X
cephfs-data-scan scan_extents <data pool>; s5 X5 Z! i9 s
扫描每个文件中的第一个对象来收集METADATA,随后注入到 metadata pool
& |& b. W. x- I
7 I" w4 ]# e  r4 }8 D# wcephfs-data-scan scan_inodes <data pool>5 v" q, n( V* W. w2 ^) M
Note : 这两个步骤太耗时了,应该考虑起多个workers来同步处理。data pool 可通过 ceph fs ls 查看' r% Z4 V7 P; H0 C5 R
4 d1 r1 a( J3 z! D4 z
# Worker 0$ V$ P* Z' B0 m( x5 L6 C
cephfs-data-scan scan_extents <data pool> 0 1
, K/ i" `# c6 F4 I# Worker 1: |( T( a- D  r- o2 k, N/ P, @
cephfs-data-scan scan_extents <data pool> 1 15 w4 b, U6 f) z; l
# Worker 0$ R8 e. |6 P. x$ O
cephfs-data-scan scan_inodes <data pool> 0 1
: C7 I0 `7 z$ }% N2 q. |# Worker 1, F2 P3 H6 G1 q* u) l
cephfs-data-scan scan_inodes <data pool> 1 1* Q% a8 O+ `( O
Note : 一定要确保在所有 workers 完成 scan_extents 之后再进行scan_inodes操作。==1 |( d5 X1 W. o1 Q

0 y6 b& E5 U$ H) |3 b待所有操作执行完毕之后:
" Q3 n8 n6 z+ f, t" g5 G6 V
: l' Q3 s; |$ F# B4 _/ E# l1 S[root@k8s-master ~]# ceph -s
0 A, d7 m; q- a1 k* J    cluster e61d687d-f43d-4f50-af66-da96e5856be9
9 A6 f$ e; `  f& T* G8 N, s     health HEALTH_OK
* n8 m/ c1 C) N/ N! y     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}* {& l4 v. W( F, V$ K) _
            election epoch 676, quorum 0,1,2 k8s-node1,k8s-node2,k8s-master
1 p  Z1 w, H$ ~' u  p+ L      fsmap e4970: 1/1/1 up {0=k8s-node1=up:active}, 2 up:standby- Z3 _2 ?3 l: M' m5 x: V" m
     osdmap e2914: 6 osds: 6 up, 6 in
5 v6 J3 Q( H3 F% ~            flags sortbitwise,require_jewel_osds9 _6 H( y' ?) f1 l
      pgmap v10110565: 256 pgs, 4 pools, 25575 MB data, 372 kobjects. z# W: |3 U5 a" L1 _
            58730 MB used, 11115 GB / 11172 GB avail) s+ ^$ k, \- K
                 256 active+clean
8 L# g$ o+ m4 @! V7 i, f5 b7 h% x5 y* N6 t( {4 z
6 a$ T  g! y; y5 g; L# X( B3 w
& Z+ u+ N. ?  V- r+ K5 x6 u; r, _

8 b2 s3 K/ j, L$ q% l0 Y) [3 B1 L" V: `

$ }5 K3 X. I  ?, p$ r' S. Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 23:02 , Processed in 0.017335 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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