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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2022-8-8 13:59:28 | 显示全部楼层 |阅读模式
1.创建 cephfs
+ C' w; q# ?! E# r! I一个cephfs至少要求两个librados存储池,一个为data,一个为metadata。- V, O1 V0 Q2 J9 Y- ^$ U
$ g3 f% v5 N0 ~8 S$ M0 v
step 1.创建cephfs存储池fs_metadata,fs_data/ M, F, r6 A0 I2 `. E' c2 d: o; z

# N- Q7 I) n6 i+ b$ K# 元数据库存储池
4 a/ F( S+ a% f' ?5 Uceph osd pool create cephfs_metadata 8 8
; ^5 T; c& Y( C' f# 数据
& x- j* W9 Y) p8 i7 Kceph osd pool create cephfs_data 8 8/ N; v5 l& M' c- S0 e% z$ x" W
step 2.使用fs new命令enable 文件系统
3 F# b9 w' g% {% `0 Z
# h% k- e. @! ]/ v1 N8 I7 V5 B% Mceph fs new cephfs cephfs_metadata cephfs_data
% ]* J8 m+ }/ s* I. v6 h  Z" j% f4 C使用mds来观察
( q9 |; x9 P1 y5 p
- w) ]' w; ?' @5 w4 h# |5 R[root@ceph-stroage01 ~]# ceph fs ls! T. H7 ?# r% T( P7 @
name: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]
# j9 T% Z/ v/ Y: y% J; |! O[root@ceph-stroage01 ~]#
" E& N% |6 i' k7 s文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:
. s* g5 s% a" {' y7 l6 ?7 X( M  u/ Z2 d4 c0 u) s9 H/ S: }* s. _
[root@ceph-stroage01 ~]# ceph mds stat9 S2 G7 c# ?# ]& I9 m
cephfs:0
8 D% S5 o. B. D, K[root@ceph-stroage01 ~]#  `7 Y  m8 D/ r- O8 Y' u
查看集群监控状态:
+ L$ I% K1 \( E* s7 N1 U4 j9 Y! r# Q0 {
[root@ceph-stroage01 ~]# ceph -s) ^2 {4 x) d7 l0 q/ t& J
  cluster:! @* e$ a; P  v: O8 j- q
    id:     db51539c-d566-11eb-a3e9-e6f1aaf957fd
; r9 u' _& o8 w2 R4 B    health: HEALTH_ERR
$ g* _2 A1 E3 q$ m( W            2 filesystems are offline
2 B, x2 G2 Q  d  T# E7 w* A- ?0 Y            2 filesystems are online with fewer MDS than max_mds
9 ^$ x: u! ^3 N8 l& V
3 r( S3 G- A: M3 A2 }  services:
" H1 t+ {: D8 T    mon: 3 daemons, quorum ceph-stroage01,ceph-stroage02,ceph-stroage03 (age 9m)! V' H' {' j% o7 T
    mgr: ceph-stroage01.cdthyk(active, since 9m), standbys: ceph-stroage03.dtasrq
# o/ T( d. r2 O* E& Q5 Y+ E    mds: cephfs:0 cephfs_k8s:0
! @' e3 R$ f* H; L" Z# v0 b7 m* Y    osd: 6 osds: 6 up (since 9m), 6 in (since 2w)5 [7 @. K% ~8 V# ~, }2 F

- [. Q3 B( |/ ?9 K- U  data:: L6 J* c$ u4 t1 M  h
    pools:   8 pools, 201 pgs
3 R( H. b) i5 b& W    objects: 68 objects, 87 MiB
1 `& E$ l* T( K0 i3 N: |    usage:   6.6 GiB used, 593 GiB / 600 GiB avail/ Z4 _6 E( M7 C% d: k3 B7 X& x- a: F2 r
    pgs:     201 active+clean. O/ E  X9 H+ t
[root@ceph-stroage01 ~]# 1 a+ h% D9 s  L& @, z
[root@ceph-stroage01 ~]# ceph health detail
: X- b( V, S8 }. W% f5 x) MHEALTH_ERR 2 filesystems are offline; 2 filesystems are online with fewer MDS than max_mds6 r/ E) b3 \7 ]1 n' ?) ]
[ERR] MDS_ALL_DOWN: 2 filesystems are offline
! c6 |1 \- S# N2 k1 ^* a3 _    fs cephfs is offline because no MDS is active for it.
! \  U5 f5 Q) p$ a% ?( e5 B1 h    fs cephfs_k8s is offline because no MDS is active for it.* D, C. Y5 d5 h* A
[WRN] MDS_UP_LESS_THAN_MAX: 2 filesystems are online with fewer MDS than max_mds
* @  r% r3 ]! W; R$ f    fs cephfs has 0 MDS online, but wants 1. O6 D3 }! N9 ^+ Y2 Q8 p6 p8 K# _# r
    fs cephfs_k8s has 0 MDS online, but wants 1' B" D6 f: e+ ]& R6 h
[root@ceph-stroage01 ~]# 9 l; m6 {# t7 r+ G, Z1 u$ j# X
所有的mds都没有active的状态,造成元数据无法恢复,所以此时需要放弃原来的cephfs,重建构建基于原来data池生成新的cephfs.
* V* }" H2 I: ^8 R1 [1 n* u7 x3 `0 {5 c8 }9 z/ {/ Y; m
2.元数据故障恢复0 A2 ]  Y9 q  E% ^( N
step 1.设置允许多文件系统* J' H6 P* |4 ~3 Z& d" r1 s8 p/ M
& e7 f" Z* [9 g/ h
ceph fs flag set enable_multiple true --yes-i-really-mean-it
* W) P! i1 ]5 w1 g& u7 ~step 2.创建一个新的元数据池,以免损坏原来的元数据
1 G: E# X+ p) |( N5 N" X( o
8 ^) u6 X! l4 N5 G+ oceph osd pool create recovery 8* G$ \9 Z4 a8 I' S( X4 c/ }
step 3.将存储池fs_data和新的元数据池recovery关联创建一个新的recovery-fs
" n/ e) E2 F' J! M8 Q7 [
8 G' S/ G) y4 mceph fs new recovery-fs recovery fs_data --allow-dangerous-metadata-overlay
& B+ \  H' I( Lstep 4.文件系统的初始化相关工作* `  S/ V0 C4 w7 k

0 q9 _/ U: P4 H; T" scephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery; ?+ ~& R  d, [# {
step 5.reset fs( f( ~$ \2 n3 D  O4 O0 n
+ N+ ]: V/ l3 F
ceph fs reset recovery-fs --yes-i-really-mean-it2 Q1 l+ @  W  B

# P3 T  N5 N! S6 P. i[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it
( H) o# z; m1 e+ nError EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so* r# w/ i. H5 N7 |$ U
4 V5 F/ Q  f! S# F: ?9 F
若失败,要把所有mds fail掉或者stop掉,再快速执行上面命令。
% f( l" S) G! o# S' T7 J8 `  c) j1 l
cephfs-table-tool recovery-fs:all reset session: k- U; m2 t. w$ z) j( q6 s0 f
cephfs-table-tool recovery-fs:all reset snap
0 o, B# J! O# e2 Pcephfs-table-tool recovery-fs:all reset inode
$ ]% v8 R, W/ M2 N( Y7 M- ?) i4 C1 ~
[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset session & R% E$ {/ |" i  z* d) l! o# G0 l
{+ o6 @+ f" f8 O& `
    "0": {  w' P3 m/ S6 p" `( ~7 E
        "data": {},
1 v# u' P; w, J9 a$ I4 s$ `        "result": 0
, v- c0 L& l4 x. S7 @    }
: e$ W/ U' q. a}5 j2 k6 Q4 h7 x  G3 Y! ?1 G( D
+ s# ?% P" j' B4 w* s
[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset snap
6 z0 M" f! X) K  P, F6 ^3 v( {0 k{
  w3 P3 a% R2 z# ~+ g- n5 P$ _    "result": 0
  M6 f. Z& _/ o  v}3 e; @/ Y: Z4 B$ v! [

$ j* D4 L( s- \[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset inode1 @8 H% {: p6 Q4 @& W3 s
{2 h* F$ ?" U5 q2 y4 u
    "0": {
/ s: `0 U, U- E1 ^3 H        "data": {},
5 \/ h5 `/ t5 P" L; Y        "result": 0
2 o7 j9 v. B; m$ W+ ?    }
" y+ `; w! C# A8 u0 J}
" O2 Z! U  x8 `. n) Z+ H, G9 O1 T. x8 D8 f

4 p' S$ ]# b0 h8 H出现Address family not supported by protocol的错误忽略掉
5 a9 {$ W( n* A; `/ U: `# Z; c[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it1 b) E+ w( V1 t  S& H
Error EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so5 w0 T& c$ [4 ~4 }# r' @4 h; _

& H) e1 |3 J, I8 z% \7 c2 b- l* b; S$ k
1 P; P6 q5 ?4 k$ }- [
[root@ceph-1 ~]# ceph fs status
$ K7 f! z2 d7 r' e3 bcephfs - 0 clients* c( }7 ~( C3 A7 _+ ?! l6 F: Y* j6 O
======
- Q* }. ~& v1 M- C# d* f+------+--------+--------+----------+-------+-------+
  l8 q- P, }% L% m9 H& V| Rank | State  |  MDS   | Activity |  dns  |  inos |) }1 B; f" Z3 _& `3 o# a
+------+--------+--------+----------+-------+-------+
, G0 ]% l1 ?9 e8 k|  0   | replay | ceph-2 |          |    0  |    0  |
- o- v6 C! ]! P/ |: Y7 f' d  v+------+--------+--------+----------+-------+-------+8 q. m2 @4 B( l: Q
+------------+----------+-------+-------+
: ~5 M9 q$ }% K. L|    Pool    |   type   |  used | avail |( h" ^4 }3 o/ l& T) B. {
+------------+----------+-------+-------+
5 X' J* A+ |: j|  metedata  | metadata |  569k |  275G |
5 q: [& N6 S" d- @6 T8 T1 L| cephfsdata |   data   | 1273M |  275G |
4 D" X5 [* O# Q+------------+----------+-------+-------+2 o  v2 q/ S' R. r
recovery-fs - 0 clients
2 Y3 g* d- ~( V7 a===========8 Q; |  ?% A) V2 {
+------+--------+--------+---------------+-------+-------+
2 \( n' u5 O3 K% w' p* k3 Y| Rank | State  |  MDS   |    Activity   |  dns  |  inos |& J) x6 B* L. ^( q
+------+--------+--------+---------------+-------+-------+: k+ Z, n$ M- i
|  0   | active | ceph-1 | Reqs:    0 /s |   10  |   12  |
# \& J( w* e: n! E( q5 w% x+------+--------+--------+---------------+-------+-------+2 c- a# N1 ~' l) Q0 `
+------------+----------+-------+-------+% M4 ^( t2 E# p) y
|    Pool    |   type   |  used | avail |$ ~" z' q8 S9 E5 Z3 h* f  i. }! q
+------------+----------+-------+-------+
- L1 ]; ]1 i8 s2 v" M2 ]7 E|  recovery  | metadata | 2138  |  275G |$ ^* f9 c1 o' A& z- l" ~
| cephfsdata |   data   | 1273M |  275G |/ i. U) x  Q$ q3 L4 y
+------------+----------+-------+-------+- Q" \( k  C1 I. i+ e2 N! Z

& ~$ `) L/ q6 J' C  w0 P1 \+-------------+
. {. q3 p' y+ w: L3 d& ^| Standby MDS |
6 M* y4 n7 [8 q2 E; V. P+-------------+3 {! h% ^! d2 r" b5 G
|    ceph-3   |- Q5 T9 c/ S( r# f4 f, a! P* N
+-------------+
( ~, K  V, ?1 x( e* N5 T: @% R5 f( _' u; sMDS version: ceph version 12.2.8-52.el7 (3af3ca15b68572a357593c261f95038d02f46201) luminous (stable)
8 f" h& D2 t! t  N1 D6 `# w+ y  s8 K7 j
: {, T8 q2 v; L0 s# ^
step 6.恢复相关- W  y1 }4 X+ U$ O% j: E# B1 L; S

* d/ ~6 r! [) h  B8 F5 L6 U% n' S- E, N% g; S6 I0 d* b

: Z' P4 e- z5 Q, O5 h确保新建的recovery-fs没有active的mds,有则stop掉,不然该mds容易crashed。8 L' H$ K3 u; K) Q: O

2 a2 H5 l/ i6 c8 `$ X$ e; L; _. w
cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem cephfs fs_data
0 q/ r3 t. Q4 W) W) Y8 Z; acephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init fs_data  b7 Y0 i6 f% j1 J' y' t) b! Q9 a
cephfs-data-scan scan_links --filesystem recovery-fs
2 ^$ k' B: f  O0 }[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem# U6 V' r* F% B4 o% |/ o* v+ R
[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init cephfsdata
" U7 f) J% l( \  _[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs
3 z% X# t) l7 @- j出现Address family not supported by protocol的错误忽略掉9 ^8 X6 F( M$ H$ u( N

  i9 k9 ^( l2 m% z- Usystemctl start ceph-mds@node82
& g! C: I/ Z$ [6 I8 Q等待 mds active 以后再继续下面操作! p9 T8 O4 i$ v" Z) V8 A
5 v2 e2 [' S* m" z  f4 e
ceph daemon mds.node82 scrub_path / recursive repair% |. y+ p. z6 T3 {
设置成默认的fs4 P+ }- l7 A9 U1 {$ u
/ l# j" T, r9 P4 \* v
ceph fs set-default recovery-fs& x+ l) t9 T3 K. T, J1 ?7 @* d
[root@ceph-1 ~]# ceph fs set-default recovery-fs) e4 g  g3 I# i0 x
8 Q* ]7 B: U# W9 D+ b- N
可以看到在lost+found里面就有数据了这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的。2 `. j' ^! Z+ y8 a
: z2 l! Q' k9 f: b* |
备份原始的元数据信息
. D! n( h2 E# W: f* p7 L
- ^$ |$ o) D3 n9 Wceph daemon mds.node82 dump cache > /tmp/mdscache% B* J% v! b2 G7 N& c" I2 H
: ]0 `( E0 P6 M- S5 H
[root@ceph-1 ~]# ceph daemon mds.ceph-1 dump cache  >/tmp/mdscache
. t  Z5 b7 d) ]  U$ r7 J0 M
/ V. a$ n& c: S( G/ I8 S' {[root@ceph-1 ~]# ceph-fuse -m 192.168.120.23:6789 /mnt/! I9 \! h. O) m6 L# {! V! B  ?
2022-08-08 14:34:55.355051 7fa47e9940c0 -1 init, newargv = 0x5588a05e0720 newargc=9ceph-fuse[43889]: starting ceph client
3 s+ `2 r7 B. K( V# [& Z, U3 j  t( r' s6 V4 b
ceph-fuse[43889]: starting fuse" O: {! d1 b) V  _+ o0 I
[root@ceph-1 ~]# df -Th
& o4 A5 p4 C* |Filesystem            Type            Size  Used Avail Use% Mounted on
2 }+ ?* D: M* }$ Sdevtmpfs              devtmpfs        1.9G     0  1.9G   0% /dev
; y( Y+ r# U3 l0 ~: Xtmpfs                 tmpfs           1.9G     0  1.9G   0% /dev/shm; t5 Y3 F! J4 d/ b. D; _5 i: z- O
tmpfs                 tmpfs           1.9G   25M  1.9G   2% /run/ o$ u, _1 ^0 y3 M
tmpfs                 tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
$ f& o; Q0 l2 F. c/dev/mapper/rhel-root xfs              50G  7.9G   42G  16% /
) o4 Z3 A2 E% J( j4 q/dev/vda1             xfs             497M  143M  355M  29% /boot
! S# ^4 _: p- p3 I% C' F5 _/dev/vdb1             xfs              98G  529M   97G   1% /var/lib/ceph/osd/ceph-0" g8 o! i, h& @7 k( N  P! S: G
/dev/vdc1             xfs              98G  527M   97G   1% /var/lib/ceph/osd/ceph-1/ a2 `6 u& f2 t2 f: |) x5 Y
tmpfs                 tmpfs           379M     0  379M   0% /run/user/0
" l) Z1 `4 r7 ]ceph-fuse             fuse.ceph-fuse  278G  1.3G  276G   1% /mnt
7 h: x7 C+ Q3 j% `. ~; A[root@ceph-1 ~]# cd /mnt/4 ], @5 B3 _+ P
[root@ceph-1 mnt]# ls
4 s# L$ T( Q$ @# [! i* T+ ~" I' Olost+found
% f( @8 z! z3 N  ?- j[root@ceph-1 mnt]# cd lost+found/$ |9 T+ e+ @- t8 l% N) b4 W6 f
[root@ceph-1 lost+found]# ls# o: s5 w; ]4 c
10000000000  1000000000d  10000000019  10000000025  10000000031  1000000003d  100000000497 o- O9 g2 R' n% v; Y
10000000002  1000000000e  1000000001a  10000000026  10000000032  1000000003e  1000000004a$ ^0 X! w  c$ |+ i' S
10000000003  1000000000f  1000000001b  10000000027  10000000033  1000000003f  1000000004b
, J1 @4 k$ K! X8 ^: D10000000004  10000000010  1000000001c  10000000028  10000000034  10000000040  1000000004c
5 k' {& \# |0 I, P2 ^5 ^% h10000000005  10000000011  1000000001d  10000000029  10000000035  10000000041  1000000004d
0 j9 ^. Y% y/ F0 {10000000006  10000000012  1000000001e  1000000002a  10000000036  10000000042  1000000004e) V. l# _+ v9 A$ F3 N
10000000007  10000000013  1000000001f  1000000002b  10000000037  10000000043  1000000004f5 j3 O9 Q* `, x( E
10000000008  10000000014  10000000020  1000000002c  10000000038  10000000044  100000000506 a, T0 u) C" e+ c) q0 L; U/ U
10000000009  10000000015  10000000021  1000000002d  10000000039  10000000045  10000000051
; b) K5 I- T7 j0 l: f1000000000a  10000000016  10000000022  1000000002e  1000000003a  10000000046  10000000052
- b/ x, r3 `3 x" N, W# T1000000000b  10000000017  10000000023  1000000002f  1000000003b  10000000047* l" T9 ~- l2 C2 D3 B
1000000000c  10000000018  10000000024  10000000030  1000000003c  100000000489 ~4 X4 ~8 u, a8 X) }5 j

1 }9 N3 ]+ w% m/ s0 ]1 g元数据恢复原理# y5 G+ x% g6 g, S) n- h
一般文件系统采用的fsck命令来维护文件系统一致性,但是fsck对cephfs的难度是非常大的,主要原因在于其机制存在根本的区别:
8 K" ~4 Y3 w  H2 P/ P* _
: i5 Y. O2 Z( [) Vcephfs修复的是一个rados集群数据而非一块磁盘设备;
4 P5 V  B7 c4 E4 V. A1 I- J7 ~9 v1 Y需要精确的识别数据的所有数据片,及这些数据片所属的inode% B  q" j$ u; ^0 K7 N9 A" }7 `
大量的元数据不可能全部保存到内存中
9 J2 ?& ]" v9 `& C数据丢失原因可能在于
5 `; e. q( \3 e- l" g(1)系统bug导致;
8 J# h* J4 H) G(2)由于RADOS同步的灾难性故障——可能到时大量数据丢失;7 T9 [# P: ^0 n
(3)bit位翻转(bitrot)
5 e/ t$ f! z8 w& t  P) _cephfs-data-scan' D5 |/ P  L! G; y/ |4 {. w" F
cephfs-data-scan根据数据存储池中的内容重新生成丢失文件和目录的元数据对象。$ R- [, B9 C: S" ~3 m2 @
step 1.初始化
& r! I% j. {, V) |8 p2 m6 I
& R, I2 G0 q' h! C( }' h; Zcephfs-data-scan init
  b8 _* i' g) i7 I! ?: L, D
# G) y: L0 g( N$ astep 2.扫描所有对象以计算索引节点的尺寸和 mtime 元数据;2 E" O0 p9 Z: V6 a

' i1 a# u# V8 w: h; R1 D6 Gcephfs-data-scan scan_extents <datapool>
( N! P. R) b* A1 z3 j6 S! ?$ @1 x& |2 a; [+ W! B$ b) }
```bash2 V6 @2 Z& u" N& L; X: k
step 3.从每个文件的第一个对象扫描出元数据并注入元数据存储池。
" j. H, F* k2 K2 V3 n```bash. U' o# o* Z# X( F; f0 U2 D7 c" F
9 K- S, i+ S, Y3 R8 ^/ r
cephfs-data-scan scan_inodes <datapool>* K7 x9 t, s$ y7 F

6 u) U! n" {' X6 t) H如果数据存储池内的文件很多、或者有很大的文件,这个命令就要花费很长时间。要加快处理,可以让这个工具多跑几个例程。先确定例程数量、再传递给每个例程一个数字 N ,此数字应大于 0 且小于 (N - 1) ,像这样+ I2 |8 Z/ N& F1 i* r, n" D. \& f: |' x
& T1 N0 _. c# @- s  i9 d: x! a9 {5 [
# Worker 0
; v, s2 b7 e4 r8 P4 {7 Q3 ecephfs-data-scan scan_extents <data pool> 0 1
# l. n6 d& h8 @) \0 k# P# Worker 1; X3 B' |. v9 X& O4 q
cephfs-data-scan scan_extents <data pool> 1 1' \+ [) Z" Y' r
# Worker 0% w/ c  V$ T8 h: U5 i# [4 F
cephfs-data-scan scan_inodes <data pool> 0 1
2 ^  i! M7 F' ^3 `5 E# h# Worker 1- k7 X5 f- Z3 N/ [3 v0 J3 k
cephfs-data-scan scan_inodes <data pool> 1 1
) a. e+ j+ `& k  t* Y) R7 P; H& u/ j! M8 X( R

& \, h8 \4 x4 w" j3 P" c: j; o+ I( u$ B3.mds rank 0 is damaged
4 g$ s7 `; r7 z, q3 \启动ceph后,出现如下错误:
$ k4 Z: g  P8 v2 h5 B3 Z$ k; p
$ c) A7 o& w" Y2 O6 |& F4 d6 x6 c( f[root@k8s-node2 ~]# ceph health detail
6 j" S$ ]4 ^4 t- u1 s& _HEALTH_ERR mds rank 0 is damaged; mds cluster is degraded
& z: ?5 m4 l  L& c( W8 V/ f  G+ `0 xmds.0 is damaged  Y/ H5 B+ @4 j5 Y; B
mds cluster is degraded
" p; W0 T9 T+ ~提示 mds.0 不可用。% C7 s# n9 V2 ~! Z4 H& G' b
在部署ceph时,安装了3个mds, 分别运行在3台服务器上。并且参考官方的配置,使其中一个作为 master 对外提供服务,另外两个作为 standby。来预防单点故障。(max_mds 设置为 2)- O5 v0 r. A: A) x# c( C' A' Q) {
http://docs.ceph.com/docs/jewel/cephfs/standby/#examples
& Y6 \& N: |" p/ E  u2 o; X' U2 R
该错误发生后,3 个mds,均为 standby 状态。按照官网的描述来看,当所有 mds 均处于 standby 状态时,其中一个 mds 会选举称为 master.
+ }9 X8 i' D. G- t0 S于是挨个停止mds, 随后又逐个启动并查看/var/log/ceph/ceph-mds.xx.log。发现 mds 在称为 master 时,出现了如下错误:; Y% F5 n0 x4 u1 _
3 }) r* Y; c) d0 V; E
...
' G$ D- {9 ^# l6 {4 E6 d- ]5 F& g2017-09-26 11:30:48.976326 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
2 m3 j7 f- q) B" ^1 G8 [2017-09-26 11:30:48.976354 7f9ee1734700  0 mds.0.log _replay journaler got error -22, aborting# A3 T0 o* g$ G
2017-09-26 11:30:49.071230 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)% J$ X  k. ]% S  ~/ z6 y6 A( p
2017-09-26 11:30:49.071472 7f9ee1734700 -1 log_channel(cluster) log [ERR] : Error loading MDS rank 0: (22) Invalid argument
: d* |. N4 \( K2017-09-26 11:30:49.076129 7f9ee1734700  1 mds.k8s-node1 respawn
; V/ ^( L4 X$ R5 e8 w...' k6 p# [- G# c# l/ o
2017-09-26 11:30:49.099291 7f99e58be180  0 pidfile_write: ignore empty --pid-file" p6 t0 U7 d9 p& o3 N" s1 i
2017-09-26 11:30:49.571643 7f99dfacf700  1 mds.k8s-node1 handle_mds_map standby
+ H- B$ s) V3 y提示在读取 journal 的时候出现差错,因此可以确定问题出在 mds journal 上。
7 I/ t+ T' t5 J, I+ O
1 u& V% m- E; W$ ceph mds repaire 0, }; ]( @! O/ [) ]+ \, {
参考官方的故障恢复5 u4 G: }9 r6 A
http://docs.ceph.com/docs/jewel/cephfs/disaster-recovery/3 r  x+ d! V: p/ g

  G, r: V& |# k7 p% Estep 1.导出 journal" ~. `1 ~! ^2 ]4 p* z2 ]( S7 u
在执行有风险的操作之前,先将 journal 备份:! f6 N+ n' O3 e% f
+ S& C5 s* G1 C! n! ~
ceph-journal-tool journal export backup.bin7 k# _- c- ]) E! M* T+ m8 i
Note : 这个文件大小和ceph集群存储数据量成正比,会很大7 b+ ]8 b. v# F! s" E

0 C: Z' C, F9 Cstep 2.从 journal 恢复
/ C. ?; g$ D4 W6 `/ q% v2 g当 mds 因为 journal 损坏或者其他原因无法读取,为了恢复文件元数据可以执行:) @& H1 j- [# C/ w# ]
, p1 w- U7 S2 r4 i0 {& W, i
ceph-journal-tool event recover_dentries summary# S# J& Q' X& x8 O1 c; p& T
默认会从 mds.0 中恢复, 使用 –rank=<n> 来指定其他mds
& i. z8 G/ B# |0 _$ i" }, V  A. {: Y) C
这条指令会将 journal 中所有可回收的 inodes/dentries 写到后端存储,前提是要写入的 innodes/dentries 版本比后端存储里面的要高。 如果某个区块的 journal 丢失或者损坏,那么就不会被写到后端存储中。
' n' f0 z; [6 Q$ S% U& @) r
4 G4 c' E$ n/ T+ O% `Note: 除了将inodes/dentries 写入之外, 这条命令还会更新每个 MDS 的 InoTables, 标明被写入的 inodes 号在使用中,在一般情况下,会让后端存储恢复正常状态。1 h# T$ L  N9 n$ `  `

4 p1 B6 D/ ^* l9 B3 q% t  g此操作不能保证后端存储的状态达到前后一致,而且在此之后有必要执行 MDS 在线 scrub。此命令不会更改日志内容,恢复了能恢复的部分后应该把journal截短。
' `8 ?1 K' n7 D" s3 m( w. [: K+ P" K# b) a$ m  u* p' j
Note : 然而在执行这个命令之后,集群并未恢复正常,因此还需要往下看
; }  M& R9 [& B; g' g1 Q9 a* K" S( C" O, [
step 3. 截断日志
/ `1 r3 t: H" s* M# C
5 g( q5 X0 {0 e# m! ~2 gcephfs-journal-tool journal reset
( H6 s# f1 l: k. y% }* D重置journal 将会造成metadata丢失,除非你提前通过诸如 recover_dentries 的方式将metadata保存。该操作可能会在数据池里面产生一些孤儿对象。这会造成已写入的inodes再次被重新分配, 权限规则可能因此被违反。) g. O$ F0 K7 x, K0 v. ^
7 @, n, Z/ u/ m9 z7 B' E
Note : 有个类似的 issue中也提到了上述步骤(link),但执行到这一步后,就没往下走了。" F+ [+ f+ V; P/ g% Y* ?0 o' I
And mds rejoined again and everything seems to work fine now. 这点我没验证过,担心会有隐患。于是按照文档步骤继续执行了。
" ?# j3 Z$ b) e7 F! z8 l; D8 e9 p/ |8 k! M9 [6 f& w* v& h; M2 l* u
step 4. 清除 MDS 表
* ^% `: g- w: s- k: d1 M' x在 journal 被 reset 之后, 它可能不再符合MDS表的内容(包括:InoTable, SessionMap, SnapServer). 重置 SessionMap (即擦除所有Session) , 通过命令:1 w$ I8 D5 \% F0 d4 |% G
& o0 t: f( g# S$ I3 J
cephfs-table-tool all reset session6 G+ I; ^- f# d" S! ~" T; }
这条命令会在所有mds中生效, 可以将 all 替换为指定 mds 标号。
. d" Q  T) Y5 ~7 z8 cstep 5.MDS MAP RESET
! A$ ]& K4 |+ z一旦文件系统底层的 RADOS 状态(即元数据存储池的内容)有所恢复,有必要更新 MDS 图以反映元数据存储池的内容。可以用下面的命令把 MDS MAP 重置到单个 MDS :. g# u7 H; C: h' v

  U1 r' @6 _  q3 @) Dceph fs reset <fs name> --yes-i-really-mean-it
; X$ V- ?+ A; D+ Y! H  z2 M* T+ B7 X运行此命令之后, MDS rank 保存在 RADOS 上的任何不为 0 的状态都会被忽略:因此这有可能导致数据丢失。- V: ~, L! |1 O. b- H0 X% m; q# P
* S; @8 d, i( A! Z2 _9 `8 P
Note : fs name 可通过 ceph fs ls 查看
6 G) \) X1 A8 M. |9 N( C
; Z6 Z9 ]( s0 u/ ^step 6. RECOVERY FROM MISSONG METADATA OBJECT
% ]6 w, W+ n9 R% D: E$ d5 E7 K% d' ?) z: x
# Session table# Z# _  N( d- V, |: ?
cephfs-table-tool 0 reset session" |7 W, L& L1 \4 G; f
# SnapServer$ x5 Y1 {/ E3 s) i6 H+ U6 ^4 A
cephfs-table-tool 0 reset snap
) ^" D8 Y8 t. o8 k/ }3 W( h, Z# InoTable6 J" G" n9 f& j5 S9 M
cephfs-table-tool 0 reset inode
8 P5 T, ]+ f1 _2 v0 ^; C# Journal
! C2 h6 b2 n4 Hcephfs-journal-tool --rank=0 journal reset
' e' I6 {$ S) V; e! Y# Root inodes ("/" and MDS directory)
6 E0 }: [* Z! U, e% ccephfs-data-scan init6 J' o8 y7 I) y! c7 C" G
最后,会基于数据池中丢失的文件和目录来重新创建 METADATA OBJECT。分为2步。
6 S% ]: h; \  [" s' i# o; C4 P5 ]. Z8 y! s* z$ m1 q: E
扫描所有对象并计算出inodes 的大小和 mtime metadata2 d" u) ?' j( \+ |
2 @1 [) W- a$ {! T
cephfs-data-scan scan_extents <data pool>
' I5 K0 S' }5 A扫描每个文件中的第一个对象来收集METADATA,随后注入到 metadata pool% J# L4 Z0 K* S6 T8 y
( T% a' g) e5 T% O1 s8 C3 s
cephfs-data-scan scan_inodes <data pool>( v5 l6 s  U% l% b; m% |
Note : 这两个步骤太耗时了,应该考虑起多个workers来同步处理。data pool 可通过 ceph fs ls 查看
$ U# U) G+ y) ?2 o4 i
! N/ |2 |$ w: ?5 Q# Worker 0
1 x6 t; o1 n5 I8 Ecephfs-data-scan scan_extents <data pool> 0 1, r0 o: X* [6 v( {& v  L' h* K+ I" `
# Worker 1
; g, b; K0 J8 k6 d% R+ t* l) \cephfs-data-scan scan_extents <data pool> 1 1; m. e' p3 i1 f- a; S+ v
# Worker 0  S  ^1 \  ]: V7 V) k8 Q
cephfs-data-scan scan_inodes <data pool> 0 1( E4 q( p7 ^( {
# Worker 1
: n8 F! q6 a$ F( k2 Ucephfs-data-scan scan_inodes <data pool> 1 1# n$ P; ]4 |' r8 V
Note : 一定要确保在所有 workers 完成 scan_extents 之后再进行scan_inodes操作。==
; J+ r# L3 F& O
0 Z( [/ U! R8 T待所有操作执行完毕之后:9 ]3 S4 Z6 j8 U8 P) z
, w' k' O# I: c3 T! R5 |
[root@k8s-master ~]# ceph -s% s& ~( M. h: s5 a' K
    cluster e61d687d-f43d-4f50-af66-da96e5856be9
8 q0 ^  P8 d7 |     health HEALTH_OK4 _2 ^" }3 J& C! Y$ z: z: a2 _
     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}
) L# k3 {; i& {8 [5 ?            election epoch 676, quorum 0,1,2 k8s-node1,k8s-node2,k8s-master% A  W4 c" S4 i( k- e8 [
      fsmap e4970: 1/1/1 up {0=k8s-node1=up:active}, 2 up:standby/ P9 b2 z( F; L- H! L1 \
     osdmap e2914: 6 osds: 6 up, 6 in
  L$ d$ w3 O- J$ j* t8 N$ P, V            flags sortbitwise,require_jewel_osds, Q6 c; S% w5 t" w! k. q: O8 ]
      pgmap v10110565: 256 pgs, 4 pools, 25575 MB data, 372 kobjects& E$ `3 F& r0 I7 G, a; h: s
            58730 MB used, 11115 GB / 11172 GB avail
7 L7 v% k- U& B! L) n& u) [                 256 active+clean0 ]3 S; J3 C$ F0 z
# J1 f9 H; g( p% T" q4 O5 e
% R4 J, ]7 }/ Y: {( h$ D9 U* |- ]

/ A1 b% R8 V- ]/ n1 a3 E) S' [
+ J$ ]9 [5 \4 b2 Z8 V) ?' e
" @- ~/ g0 r2 f- j) |7 C$ D
: j: M3 R! y) P9 ^9 |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 00:05 , Processed in 0.017938 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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