|
|
1.创建 cephfs" r% B' e T) Y- D5 k7 f) e
一个cephfs至少要求两个librados存储池,一个为data,一个为metadata。" {9 w8 y) i7 ` F
" j+ u- S3 c, {, [- lstep 1.创建cephfs存储池fs_metadata,fs_data
' @2 p! k y2 Q- o) g! W
' r# {2 c1 |$ e1 }+ M# 元数据库存储池: p0 l+ H7 o/ ?7 U
ceph osd pool create cephfs_metadata 8 8
! c9 v+ K6 ~( q; z# 数据! z: z/ K; w1 T
ceph osd pool create cephfs_data 8 8
* ^' D2 d0 y) g+ J8 r) B3 wstep 2.使用fs new命令enable 文件系统
! P& N# ?1 q8 D7 J, a& e6 Z8 q2 Q$ v. L
ceph fs new cephfs cephfs_metadata cephfs_data
. i# `: x# j2 c) u& H使用mds来观察8 F: I5 F: ]' |5 {
' v9 _3 L# u& j+ v2 I4 L
[root@ceph-stroage01 ~]# ceph fs ls& m9 \7 d3 E b! p4 i
name: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]
) R: [' Z* Y; ~/ z# g2 g[root@ceph-stroage01 ~]#8 S& b- M( a, f- p9 M. L+ c9 d
文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:3 g& m' _8 u0 ]' s/ q
% Z0 c" A$ E& i) ~[root@ceph-stroage01 ~]# ceph mds stat: @7 p+ `/ J7 |& w3 [
cephfs:0! P$ [: H: [* W/ W# B
[root@ceph-stroage01 ~]#5 ~# _" L( o& p& k% ?! x8 @! t
查看集群监控状态:! M3 }% b, g3 ~, K
$ d" q$ h8 w# ?& \; }# n[root@ceph-stroage01 ~]# ceph -s
4 H( ]: n& u5 a cluster:
1 {6 A# q1 S! j; _5 } id: db51539c-d566-11eb-a3e9-e6f1aaf957fd: H- [8 P. O2 ?0 e5 [1 `8 Y" @
health: HEALTH_ERR. D. F! S/ D- o1 C
2 filesystems are offline. q' Q2 t; d: m' F |8 ]: |. D* P) j
2 filesystems are online with fewer MDS than max_mds; s/ R2 h4 r/ H2 w0 Y P9 c
; L, K$ |: W. \7 V3 G+ C5 Y0 l services:
9 Q1 Y1 @( N4 k* I1 l# b: q" { mon: 3 daemons, quorum ceph-stroage01,ceph-stroage02,ceph-stroage03 (age 9m)
3 P3 y3 Q/ v- X& } mgr: ceph-stroage01.cdthyk(active, since 9m), standbys: ceph-stroage03.dtasrq
" M0 I9 L, n! b7 X d* K mds: cephfs:0 cephfs_k8s:0
; u, e8 |5 B ]! r, ] osd: 6 osds: 6 up (since 9m), 6 in (since 2w)
2 k% w- G+ ~# y! J3 h( h1 M" c' O6 s0 ^; d
data:# q! w* A M1 ?9 |
pools: 8 pools, 201 pgs( h0 h& O6 Y1 j8 r" g. Y
objects: 68 objects, 87 MiB: C7 h) g+ h8 x) [8 U5 i
usage: 6.6 GiB used, 593 GiB / 600 GiB avail+ S0 l+ t$ d7 D! N' c
pgs: 201 active+clean# O! F/ J0 w+ `
[root@ceph-stroage01 ~]# 5 X7 S- l0 y' Q) J) K
[root@ceph-stroage01 ~]# ceph health detail
d2 F- a& f' M1 `HEALTH_ERR 2 filesystems are offline; 2 filesystems are online with fewer MDS than max_mds
+ _; O1 @7 U ^. s' o* g+ v" H3 ^[ERR] MDS_ALL_DOWN: 2 filesystems are offline
2 y3 h, X& k. f. u$ o fs cephfs is offline because no MDS is active for it.
" @ Y$ ~* b3 o9 h: b- w fs cephfs_k8s is offline because no MDS is active for it.# i9 v/ T9 s( b0 k- B2 \% l% ~
[WRN] MDS_UP_LESS_THAN_MAX: 2 filesystems are online with fewer MDS than max_mds
# @' q$ |; q) |- m: F fs cephfs has 0 MDS online, but wants 1( W5 o3 `: ?) j n" I+ s+ E) V/ r- @
fs cephfs_k8s has 0 MDS online, but wants 16 W/ p6 _" L4 e2 D: @' U3 H* u
[root@ceph-stroage01 ~]#
% |4 ^0 S. z/ N6 T1 ~" v6 L9 \8 k所有的mds都没有active的状态,造成元数据无法恢复,所以此时需要放弃原来的cephfs,重建构建基于原来data池生成新的cephfs.
! _# h/ w/ @" G* I$ `' W/ k9 i2 S
' S* Z% y u" k9 z( T: ~+ P0 n2.元数据故障恢复
. { R8 o% l( k" E0 [6 ^step 1.设置允许多文件系统
M: W2 R! h- Q- R2 C) G, ?
* M! [/ y G1 Z' c1 M: U; `, ?ceph fs flag set enable_multiple true --yes-i-really-mean-it
# r f( b1 \3 r' }step 2.创建一个新的元数据池,以免损坏原来的元数据* ]1 J2 w$ Z7 W4 z& Y9 p2 _
2 u. k+ `0 X/ H" _! Uceph osd pool create recovery 86 x3 Z/ x- Y# C# P" ?. _, G0 ^
step 3.将存储池fs_data和新的元数据池recovery关联创建一个新的recovery-fs3 ^4 e% y( Q4 L$ ] L/ v9 P# i9 S1 V
* f# C2 Y+ v, k3 G8 m3 g2 c4 N/ |ceph fs new recovery-fs recovery fs_data --allow-dangerous-metadata-overlay' J5 W$ h+ r9 f7 S L
step 4.文件系统的初始化相关工作
A) j0 ]9 S$ Q# v
! Q0 ?9 i E% \; F wcephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recovery9 g5 V* m' ]% `3 k- m8 d
step 5.reset fs
: v- S. \2 W/ |' z9 o0 g/ ~2 M) y2 x3 M
ceph fs reset recovery-fs --yes-i-really-mean-it$ q/ D2 p; O% e& v- c+ A( D# K
2 Y* Z" j$ R, w% T4 s% e! r[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it
( ~2 H, i; W A$ x8 z* h) eError EINVAL: all MDS daemons must be inactive before resetting filesystem: set the cluster_down flag and use `ceph mds fail` to make this so
; `$ j" k' R! O# U. Q3 C/ ]* d# z/ T0 X: R
若失败,要把所有mds fail掉或者stop掉,再快速执行上面命令。
9 ?* k1 L/ |4 Q& A n& S+ ?, v/ N+ k
cephfs-table-tool recovery-fs:all reset session1 U! u9 ~( h r3 S3 }
cephfs-table-tool recovery-fs:all reset snap
! E/ c" G( Q9 a) _- ?cephfs-table-tool recovery-fs:all reset inode
9 {* C: \+ C( l
, E& r! O" J# Z& ^( |0 o- v: `[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset session
I; o) O# v' E) y, e{( X1 v. f4 f$ _& |5 m2 {
"0": {. @! ?9 _0 o: y3 U
"data": {},
# X$ P& C3 j. T/ L$ D "result": 0
4 X# i! { ~/ x }8 E1 i" h+ p# e) ]$ u: h* T
}
$ H: A, O" G8 d" f7 s$ ^+ }0 y
. N/ Y" {/ ^6 P6 d; J9 c[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset snap
8 Z4 c: ?! ~8 u- G) D3 z{
* T# z" ?2 V2 A4 @* e* s" B* }7 T "result": 0
, s- w; Q& i5 J, V}
" Z j5 O7 I5 Y+ S% w
/ h- w! \6 S; W[root@ceph-1 ~]# cephfs-table-tool recovery-fs:all reset inode
1 k1 Y5 i6 f/ v' J! {2 A{
% R/ O; w5 R5 K) ] "0": {1 c5 B0 S' p$ p+ S6 E- U$ E+ A
"data": {},7 L2 y- V+ A2 ?' P/ v
"result": 0
1 W F1 i% N+ t }6 j( o1 t. ]5 G
}4 U ]+ T/ @& r M9 A$ ?( \
% w2 U+ B! j7 w# e. i4 n
' R Z& o' K2 t2 Y3 ]6 m% Z
出现Address family not supported by protocol的错误忽略掉5 f0 e3 `4 q6 ^
[root@ceph-1 ~]# ceph fs reset recovery-fs --yes-i-really-mean-it" N: t+ L% z( A7 P7 \ O, Y
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, e! f( W7 m6 l) @2 Z3 B( n
& U$ G/ ~# u7 T. b4 g% l/ o# }0 g( k, i3 m4 r% t
2 b6 j5 ]% a# C9 p6 d1 M
[root@ceph-1 ~]# ceph fs status
1 L5 c# L, q! E' Rcephfs - 0 clients1 ~7 @* N0 F' ?* w
======. _6 ]" w( F3 @, k+ L
+------+--------+--------+----------+-------+-------+
+ k O! Q7 B P$ x| Rank | State | MDS | Activity | dns | inos |
n: }0 G+ X) K9 w: b" W+------+--------+--------+----------+-------+-------+
! B# Z& a! Y2 ]$ i; c: p3 a! V7 F) V( Q| 0 | replay | ceph-2 | | 0 | 0 |4 e8 B" i* u9 z& n# H! n, t% i
+------+--------+--------+----------+-------+-------+* o" V" X r: V# S1 ]- G1 r
+------------+----------+-------+-------+
" @3 G3 m% g0 r$ G( a! u| Pool | type | used | avail |2 r5 w: E7 @5 C1 a& }; I: a) T5 |2 U7 e
+------------+----------+-------+-------+4 X$ q" Z8 L/ t! P" r% Q
| metedata | metadata | 569k | 275G |9 O- [) c+ l' j9 N' F5 a
| cephfsdata | data | 1273M | 275G |
: @( }7 y. F9 I: K3 b! i+------------+----------+-------+-------+. L7 C8 d+ `$ \) ]
recovery-fs - 0 clients* m7 Q8 e0 k" v4 @# f% y- l7 @# c
===========/ A$ {9 ^ N5 L6 U! S( d# I
+------+--------+--------+---------------+-------+-------+
# [- f; d6 c4 T| Rank | State | MDS | Activity | dns | inos |: X8 B* g7 t8 B3 m
+------+--------+--------+---------------+-------+-------+
i* U; d2 x g$ t! X| 0 | active | ceph-1 | Reqs: 0 /s | 10 | 12 |
* j, ^9 W$ O: b8 z/ ]0 g/ C: Y$ G+------+--------+--------+---------------+-------+-------+
. \1 Z0 i( y4 H) n& g, p+------------+----------+-------+-------+7 H- O4 m3 k* z+ Y1 g
| Pool | type | used | avail |
' C! {" a0 a8 S7 S+------------+----------+-------+-------+) l% v- M: |# n/ l
| recovery | metadata | 2138 | 275G |
: f( v Z2 S* b6 [. Z| cephfsdata | data | 1273M | 275G |0 ^$ H2 @4 K4 S3 X9 v7 E
+------------+----------+-------+-------+
* e4 w$ h5 V: I4 {% ?% |# s/ O! X4 G5 e8 F) q
+-------------+; p; |7 n" Z0 d/ \% f% P. F' D
| Standby MDS |# E; j; e# H5 w7 B+ o8 Z$ v5 T
+-------------+
" X% p4 b5 a9 c; z! y* G0 l' S| ceph-3 |
# f# q; W# o# G, g2 a% D! A" H- j+-------------+
, n6 v3 Z x# B; [$ ~MDS version: ceph version 12.2.8-52.el7 (3af3ca15b68572a357593c261f95038d02f46201) luminous (stable)
" p# p5 }8 `+ u+ t' n" E7 V* Q7 E8 s# d! i) r5 K* n
8 F( k8 X3 r N3 c
step 6.恢复相关& }4 @6 a7 k: {2 r3 }8 O
- D, c0 _) ~ O8 L! Z& ]! U9 _* v1 B
# {# k# ]7 t, d0 y
! v, ]7 o1 n7 U5 x
确保新建的recovery-fs没有active的mds,有则stop掉,不然该mds容易crashed。 Z/ w1 o4 Z! p! b" J
- i) t! t& _* C1 `! Y# e
, d, w: u4 A' ^. k d$ ]cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem cephfs fs_data+ s, g. R+ K. w9 w) g. E& h- O
cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init fs_data
& T* H% s7 L1 W! B. p. qcephfs-data-scan scan_links --filesystem recovery-fs: G* F, l) `, [( b
[root@ceph-1 ~]# cephfs-data-scan scan_extents --force-pool --alternate-pool recovery --filesystem0 G/ R4 A1 T. f& \% h ^7 n
[root@ceph-1 ~]# cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem cephfs --force-corrupt --force-init cephfsdata8 V) _0 R3 V8 \6 i, H
[root@ceph-1 ~]# cephfs-data-scan scan_links --filesystem recovery-fs4 Q9 Q/ N7 c2 T
出现Address family not supported by protocol的错误忽略掉3 L% E$ I9 Y: f2 t0 x& H
% m" g- @. D l# fsystemctl start ceph-mds@node82# `5 D# v, [4 Y7 d
等待 mds active 以后再继续下面操作) V/ n \. S. z% y, K2 A
/ p8 V a* ~* r6 T7 `/ Y
ceph daemon mds.node82 scrub_path / recursive repair$ @( ^3 s& t# {" ~: H# \
设置成默认的fs
. ^0 e3 X# t$ ~/ B, o4 n( b' Z
0 T/ }% N# l: g+ ~/ t1 Aceph fs set-default recovery-fs/ X. e8 P+ V: a# F6 j* C
[root@ceph-1 ~]# ceph fs set-default recovery-fs
- s' @1 Z+ p) R$ [ d) ~+ }3 |$ v( k3 _0 n. U7 R
可以看到在lost+found里面就有数据了这个生成的文件名称就是实际文件存储的数据的prifix,也就是通过原始inode进行的运算得到的。# Q) E% c4 f* \( G8 h; U# T: n. ~
7 W( b0 O4 r; n/ E4 Y9 F备份原始的元数据信息
' H A& ^& o+ l* ^
2 k+ R+ F9 E" { y2 pceph daemon mds.node82 dump cache > /tmp/mdscache
- Z$ j% a1 |# O! @; \& r5 M! H* w0 o; D+ Z
[root@ceph-1 ~]# ceph daemon mds.ceph-1 dump cache >/tmp/mdscache3 b3 F& T& H" {) Y8 S: K9 V& @0 W' ?
$ M7 d' |4 j% I0 ?+ P
[root@ceph-1 ~]# ceph-fuse -m 192.168.120.23:6789 /mnt/
8 Q; v* ~, t- ~" L; V2 D! u4 h2022-08-08 14:34:55.355051 7fa47e9940c0 -1 init, newargv = 0x5588a05e0720 newargc=9ceph-fuse[43889]: starting ceph client
' E2 }# b2 a& G' I: d9 H8 S2 R3 K9 Q0 ^' ^
ceph-fuse[43889]: starting fuse8 J; t& w2 b) s/ y# O! R- e& ]
[root@ceph-1 ~]# df -Th% H5 [3 U. a$ b8 p Q+ X* u3 L
Filesystem Type Size Used Avail Use% Mounted on
/ c1 q$ X$ t$ L- p' W( U7 Ddevtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
! T. F5 H7 V; q& E$ Z+ |tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
& ^5 F0 m, }. [1 h0 i, wtmpfs tmpfs 1.9G 25M 1.9G 2% /run
" u `! x, r+ f6 K5 s0 w+ ~; f- Htmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup$ M# o( P& @" c. f+ x B* B. R' D* L
/dev/mapper/rhel-root xfs 50G 7.9G 42G 16% /
4 M+ n9 K; p2 b; x y ~' R! R1 {/dev/vda1 xfs 497M 143M 355M 29% /boot
% s! d4 \5 t( Y" A5 r2 |/dev/vdb1 xfs 98G 529M 97G 1% /var/lib/ceph/osd/ceph-0
' A. J1 i# @, ~; n/dev/vdc1 xfs 98G 527M 97G 1% /var/lib/ceph/osd/ceph-1) @6 w& L, ?% u" Q' e! h1 |5 N
tmpfs tmpfs 379M 0 379M 0% /run/user/0( |, S8 C* n7 G0 }1 P
ceph-fuse fuse.ceph-fuse 278G 1.3G 276G 1% /mnt' P% ]5 s5 R" g" ^
[root@ceph-1 ~]# cd /mnt/' p' a+ q- @4 d& |) l3 \
[root@ceph-1 mnt]# ls: w7 h1 q$ }5 q
lost+found& \5 I6 [1 d1 [3 ]2 S
[root@ceph-1 mnt]# cd lost+found/
8 E. T5 q) _9 `3 p[root@ceph-1 lost+found]# ls$ w9 a+ D$ R$ |4 H* V! n: \
10000000000 1000000000d 10000000019 10000000025 10000000031 1000000003d 100000000491 {! a Q% F Y* P% A5 O, U
10000000002 1000000000e 1000000001a 10000000026 10000000032 1000000003e 1000000004a
2 d* F" W* w+ z/ ]10000000003 1000000000f 1000000001b 10000000027 10000000033 1000000003f 1000000004b5 n! n' r8 J: h" L8 s
10000000004 10000000010 1000000001c 10000000028 10000000034 10000000040 1000000004c
- p- Z; t: ^; L0 O. X* G. L10000000005 10000000011 1000000001d 10000000029 10000000035 10000000041 1000000004d
. @' y+ s$ t+ `0 E+ z10000000006 10000000012 1000000001e 1000000002a 10000000036 10000000042 1000000004e6 F: z" g$ ]) k& A2 k+ i* ^
10000000007 10000000013 1000000001f 1000000002b 10000000037 10000000043 1000000004f
. M4 A4 c' P: s+ _. ^10000000008 10000000014 10000000020 1000000002c 10000000038 10000000044 10000000050
' M! R% C- i; @9 Y; D) C; A10000000009 10000000015 10000000021 1000000002d 10000000039 10000000045 10000000051- j5 A5 S5 ?) u! Q* D9 h* v
1000000000a 10000000016 10000000022 1000000002e 1000000003a 10000000046 10000000052
B& N' R* O: h: z1000000000b 10000000017 10000000023 1000000002f 1000000003b 100000000470 q( M- p3 S4 s) D3 s/ ]
1000000000c 10000000018 10000000024 10000000030 1000000003c 10000000048; }, o0 u* i9 n7 c" @- t
/ N0 R* E8 b; r, X元数据恢复原理, e, P( o8 `6 `; p0 \
一般文件系统采用的fsck命令来维护文件系统一致性,但是fsck对cephfs的难度是非常大的,主要原因在于其机制存在根本的区别:3 N2 o& s1 f: J+ m' N. u9 \
2 e T% w. U( s" g
cephfs修复的是一个rados集群数据而非一块磁盘设备;5 a/ Z6 Q* f1 N4 ^0 D# `. \8 b
需要精确的识别数据的所有数据片,及这些数据片所属的inode
6 E' q5 n7 b+ D3 v大量的元数据不可能全部保存到内存中
# m4 ^. C2 @2 m数据丢失原因可能在于
+ [0 Q( l# z9 U. h" m/ q(1)系统bug导致;) M2 F) {% k, e: }$ X
(2)由于RADOS同步的灾难性故障——可能到时大量数据丢失;$ d' F( D3 J. w' i
(3)bit位翻转(bitrot)& Z$ u6 [3 V; n& l: N" }1 ?
cephfs-data-scan" u( B7 H1 ]! X. }5 @
cephfs-data-scan根据数据存储池中的内容重新生成丢失文件和目录的元数据对象。# P) `4 J7 y! ` O. J& T- K
step 1.初始化
; j- t1 T& S9 Y+ g5 D
( F* c$ x( N9 t: S! M/ _cephfs-data-scan init
1 o" u+ S% u9 C6 m5 M; z7 A0 H
* A2 n; X( ?$ ~- X; g5 K3 Y! [4 vstep 2.扫描所有对象以计算索引节点的尺寸和 mtime 元数据;1 I* w4 H& Z) X. ]. H5 p* ^; @
v$ F% `1 U3 e) [2 D) s1 ~7 G% ^
cephfs-data-scan scan_extents <datapool>" Y7 {% t8 j. y# F
1 A7 R7 R# T: K7 S
```bash
6 I- c& h* }' Z6 {, ~step 3.从每个文件的第一个对象扫描出元数据并注入元数据存储池。- D q" {+ c P- A8 |% Y6 k
```bash
+ w, o4 w' T" S3 z' L2 H$ \( O& `) ]
# i) I8 Z$ w. c3 Ecephfs-data-scan scan_inodes <datapool>
# H: y9 `* ]% _, j3 ?
1 c6 \9 j3 o5 U% ^4 T如果数据存储池内的文件很多、或者有很大的文件,这个命令就要花费很长时间。要加快处理,可以让这个工具多跑几个例程。先确定例程数量、再传递给每个例程一个数字 N ,此数字应大于 0 且小于 (N - 1) ,像这样
6 y3 e: U* M8 S* k5 P! |& k) y, D+ e3 T1 Q/ n
# Worker 06 P0 x7 z4 g- A( M. `5 B
cephfs-data-scan scan_extents <data pool> 0 1% S3 P# I, J3 a( N/ ^. Z2 J& M* b- O
# Worker 18 p. I- S! H4 Q! ]
cephfs-data-scan scan_extents <data pool> 1 1
) T) r5 V c3 l# Worker 0
, |+ Z( K+ U) W. g. M' u! j7 ecephfs-data-scan scan_inodes <data pool> 0 1# K+ ]2 ?( Z$ a; R. [. h
# Worker 1. U& K) }( e2 X$ D
cephfs-data-scan scan_inodes <data pool> 1 1" n: v2 Q0 I/ i" x' X
* a6 Q, L) o! x, Q/ x
8 i3 u3 B2 k8 b: y4 t9 _3.mds rank 0 is damaged
' b# ^% m0 P( R3 M6 x启动ceph后,出现如下错误:
: U) B4 ^- t% D# U O, G: B. D: Y2 D
[root@k8s-node2 ~]# ceph health detail
! q7 l6 e8 e1 cHEALTH_ERR mds rank 0 is damaged; mds cluster is degraded7 v/ E) B2 \3 A# @$ s# g
mds.0 is damaged
2 e h5 k: P0 M$ G6 S3 Jmds cluster is degraded3 k$ r7 ?$ A: l' _! {
提示 mds.0 不可用。# x7 f! I$ _9 n' L2 e( i& o
在部署ceph时,安装了3个mds, 分别运行在3台服务器上。并且参考官方的配置,使其中一个作为 master 对外提供服务,另外两个作为 standby。来预防单点故障。(max_mds 设置为 2)
7 C! q0 e7 B% I) |! ^& H S0 x( }% whttp://docs.ceph.com/docs/jewel/cephfs/standby/#examples( I7 {! x0 r0 J5 N1 g( E
2 [- n i6 K# R; V4 S$ I" O: z该错误发生后,3 个mds,均为 standby 状态。按照官网的描述来看,当所有 mds 均处于 standby 状态时,其中一个 mds 会选举称为 master.
9 K: ~' J) k0 I* S0 @0 o4 q# t于是挨个停止mds, 随后又逐个启动并查看/var/log/ceph/ceph-mds.xx.log。发现 mds 在称为 master 时,出现了如下错误:! g% p% _- n) I8 S0 ~. ~ [
. [& k- y) [5 T+ a2 ~4 U! Z
.... r) u, ]- I5 F1 l3 i
2017-09-26 11:30:48.976326 7f9ee3941700 0 mds.0.journaler(ro) _finish_read got less than expected (4194304)4 V! q( U0 x" b2 \+ r( o- ~8 h/ \
2017-09-26 11:30:48.976354 7f9ee1734700 0 mds.0.log _replay journaler got error -22, aborting8 P+ f6 i9 ^& z: ]
2017-09-26 11:30:49.071230 7f9ee3941700 0 mds.0.journaler(ro) _finish_read got less than expected (4194304)3 }4 J9 Q. [, |- V6 r9 E
2017-09-26 11:30:49.071472 7f9ee1734700 -1 log_channel(cluster) log [ERR] : Error loading MDS rank 0: (22) Invalid argument( G |# d1 F. d" q, x4 O
2017-09-26 11:30:49.076129 7f9ee1734700 1 mds.k8s-node1 respawn6 e* z/ m1 d! q0 I) g4 J
...
( h# S+ q, d$ {2017-09-26 11:30:49.099291 7f99e58be180 0 pidfile_write: ignore empty --pid-file) o D: {$ j; T
2017-09-26 11:30:49.571643 7f99dfacf700 1 mds.k8s-node1 handle_mds_map standby% F6 M; X B& z- j
提示在读取 journal 的时候出现差错,因此可以确定问题出在 mds journal 上。$ g0 a: O3 A* \; a4 r
- }4 U( C4 T1 x. [) q0 t2 t$ ceph mds repaire 0/ Q9 o% _9 J' B) h% {
参考官方的故障恢复$ @7 _0 U" {* b, K) |+ G
http://docs.ceph.com/docs/jewel/cephfs/disaster-recovery/
( u$ E1 y1 ]5 |) ]
# v5 O2 E7 p. X- {4 ^8 ]step 1.导出 journal G6 U% f4 a2 B& x* j' i+ \* Z6 E
在执行有风险的操作之前,先将 journal 备份:4 x% M5 Y( H. P4 B% w
% s9 m% A3 v+ M$ a( f' p' O- }
ceph-journal-tool journal export backup.bin
3 \7 c; R; V9 K% T ]9 P. Z+ D4 wNote : 这个文件大小和ceph集群存储数据量成正比,会很大
: |. G+ I* x& q" o7 V, }: t0 N2 z! Z/ H D6 v# ?# R6 r- u
step 2.从 journal 恢复
: Y% a9 }' Z I5 C" F当 mds 因为 journal 损坏或者其他原因无法读取,为了恢复文件元数据可以执行:! W/ c2 ^& N8 J5 f1 D* X- ~
2 J4 M; |5 Z# D# n, c$ P
ceph-journal-tool event recover_dentries summary
; s, U) k9 e q- W! a5 c# z; r4 s默认会从 mds.0 中恢复, 使用 –rank=<n> 来指定其他mds
# j8 i4 l1 j9 w6 G
5 G3 B C2 P! ^3 \这条指令会将 journal 中所有可回收的 inodes/dentries 写到后端存储,前提是要写入的 innodes/dentries 版本比后端存储里面的要高。 如果某个区块的 journal 丢失或者损坏,那么就不会被写到后端存储中。
9 Y% @4 g6 Q, P' N: x- S3 d, O( e, T, f; \
Note: 除了将inodes/dentries 写入之外, 这条命令还会更新每个 MDS 的 InoTables, 标明被写入的 inodes 号在使用中,在一般情况下,会让后端存储恢复正常状态。, }0 r, d- G. d9 o. o& G" b" k' P
u9 w7 [* t% \& Q# {4 R: a
此操作不能保证后端存储的状态达到前后一致,而且在此之后有必要执行 MDS 在线 scrub。此命令不会更改日志内容,恢复了能恢复的部分后应该把journal截短。7 Q7 L# ^# _$ A
$ B0 M$ T* H; r& D4 ?Note : 然而在执行这个命令之后,集群并未恢复正常,因此还需要往下看' I9 o+ r" R5 u J" g' l& f3 n% h
$ A8 |4 }2 R) ustep 3. 截断日志* F: U, P2 `; i% F* S+ F0 f
5 S) `7 _& n) M$ ~cephfs-journal-tool journal reset
* l( w( A( i# i. h3 v重置journal 将会造成metadata丢失,除非你提前通过诸如 recover_dentries 的方式将metadata保存。该操作可能会在数据池里面产生一些孤儿对象。这会造成已写入的inodes再次被重新分配, 权限规则可能因此被违反。
( f% _; i1 P/ G" A+ G" O( O5 V2 o* S' a8 O8 m Y
Note : 有个类似的 issue中也提到了上述步骤(link),但执行到这一步后,就没往下走了。6 [* L: N* L! q, |
And mds rejoined again and everything seems to work fine now. 这点我没验证过,担心会有隐患。于是按照文档步骤继续执行了。! |" P6 l* w. C y5 J& P7 {) W
: U) h& a% e G/ `step 4. 清除 MDS 表6 q/ @- I: Y' \: I5 V2 i3 s
在 journal 被 reset 之后, 它可能不再符合MDS表的内容(包括:InoTable, SessionMap, SnapServer). 重置 SessionMap (即擦除所有Session) , 通过命令:( ~& r, d/ U1 X3 P7 f# b( i* m
$ _! ^' ]! o. b3 H
cephfs-table-tool all reset session
0 ?; t. i( ^) K- v h# q; |* g2 }# Y这条命令会在所有mds中生效, 可以将 all 替换为指定 mds 标号。
7 f) ?1 A# c( l, xstep 5.MDS MAP RESET, n8 c; O' l2 i z) Z
一旦文件系统底层的 RADOS 状态(即元数据存储池的内容)有所恢复,有必要更新 MDS 图以反映元数据存储池的内容。可以用下面的命令把 MDS MAP 重置到单个 MDS :
& l. K5 r! X: g2 O6 f% N0 E3 {
ceph fs reset <fs name> --yes-i-really-mean-it
9 }5 o) @1 v9 R运行此命令之后, MDS rank 保存在 RADOS 上的任何不为 0 的状态都会被忽略:因此这有可能导致数据丢失。
" U5 Q, j' e! C& h, p- e- g1 N
- F9 ?; e; n! H2 z1 ?2 p1 G3 TNote : fs name 可通过 ceph fs ls 查看
; i: v# ^- a. k
. v; r0 E3 `3 g, v* R6 Z/ Estep 6. RECOVERY FROM MISSONG METADATA OBJECT& q$ g/ U! C' H, H4 {! W/ o; z
6 m# d& i0 q4 D3 O% B! c0 q9 L/ H# Session table7 e$ w; E, u! L, s) M! ]
cephfs-table-tool 0 reset session
7 R- _+ v- m' K& ?+ ^: T) Q0 w0 L# O# SnapServer
9 W) z9 J h1 Q; J4 |* @5 u3 ]cephfs-table-tool 0 reset snap' s: r+ i2 r* L8 ?' T- h* t* x' v) ^
# InoTable
# W/ C: M9 I7 P0 V; R8 b& zcephfs-table-tool 0 reset inode
0 T9 i9 O6 `& k' g; X- l# Journal# h% C5 D {+ }& ]3 @* y& m% [' f
cephfs-journal-tool --rank=0 journal reset
6 w" k4 t, E7 D, g. d# Root inodes ("/" and MDS directory)
/ q. x5 k! h3 k3 |cephfs-data-scan init; S7 ]1 \: m! Z. n" {
最后,会基于数据池中丢失的文件和目录来重新创建 METADATA OBJECT。分为2步。
- q- B1 A+ e' i& d
! O3 l5 E# E* w7 y2 U) D/ K# }# e9 W扫描所有对象并计算出inodes 的大小和 mtime metadata) t0 K# Y: p- m. v
1 w2 x N$ D& T3 k2 j W
cephfs-data-scan scan_extents <data pool>
# ?4 t) D9 B6 s扫描每个文件中的第一个对象来收集METADATA,随后注入到 metadata pool- S: S; ` A$ l4 g
) C8 T. ]6 r8 M. ^, _# g
cephfs-data-scan scan_inodes <data pool>9 u! ]6 b# Q: v
Note : 这两个步骤太耗时了,应该考虑起多个workers来同步处理。data pool 可通过 ceph fs ls 查看
f8 L6 R9 Y3 H+ w/ B1 {" Q( S
; i4 c8 e* b W& Z- `8 w6 g# Worker 0
4 \6 o- a! P, |1 xcephfs-data-scan scan_extents <data pool> 0 1+ L P4 i7 h- ?9 L
# Worker 1
; p* Q! T4 u; U mcephfs-data-scan scan_extents <data pool> 1 1
W- ~1 B" u0 k# Worker 0
0 ^$ M$ Y+ R# X( a6 W+ A' y5 Z* ccephfs-data-scan scan_inodes <data pool> 0 1# F5 \- d% H+ Q& c0 |
# Worker 1
8 M9 h& _) z- n: Vcephfs-data-scan scan_inodes <data pool> 1 1
* ~1 H/ y) ]! S# \- JNote : 一定要确保在所有 workers 完成 scan_extents 之后再进行scan_inodes操作。==; U' T V3 W7 D7 F c
- \6 O- P; _- O/ n: t2 A
待所有操作执行完毕之后:4 }0 a1 q: x5 u9 S% V) L$ J8 X
5 Q9 X% u4 b' n o/ h
[root@k8s-master ~]# ceph -s6 s- o$ }/ m/ I: T5 i
cluster e61d687d-f43d-4f50-af66-da96e5856be98 |7 |4 A( ]; M6 E, z1 O/ D" x
health HEALTH_OK
3 d& N4 v4 @; O 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}
* m" p. ^: p9 m* t0 w5 [! {/ f. t election epoch 676, quorum 0,1,2 k8s-node1,k8s-node2,k8s-master% Q2 d) r* Y1 m4 h' y7 H. V' ]! B
fsmap e4970: 1/1/1 up {0=k8s-node1=up:active}, 2 up:standby) J P+ a/ [% a8 S7 d, @, x% `
osdmap e2914: 6 osds: 6 up, 6 in
& o0 O$ C) }/ [" x$ ~0 Z9 u# _ flags sortbitwise,require_jewel_osds
; @" [- ^& ?& i; R& e pgmap v10110565: 256 pgs, 4 pools, 25575 MB data, 372 kobjects- K( x6 e1 M: i) v2 I
58730 MB used, 11115 GB / 11172 GB avail
, \: `9 G9 \! z 256 active+clean9 e0 q0 L6 [" f/ O# ^
4 ?+ F! _5 f# o6 }6 l0 z
1 j; h2 N! D! l( K. J" Y( w! r
5 L( R3 C3 J* Q+ b+ W
. ~3 K# n& x$ w$ F# J0 I
2 B% K" ]; x( R# f/ G
1 i) z4 F4 M$ c5 [4 p |
|