|
灾难恢复[size=0.8em] 危险 本节中的说明面向专家,他们尽最大努力从损坏的文件系统中恢复他们所能做的。这些步骤有可能使事情变得更糟和更好。如果您不确定,请不要继续。
6 e' s l- |5 D' L日志导出[size=0.8em]在尝试危险操作之前,请像这样复制日志: cephfs-journal-tool journal export backup.bin
( U% Y& p6 a( m' h; @; Q1 F7 B! O3 J- E* m9 B+ }% b3 E+ w2 V
从日志中恢复牙签[size=0.8em]如果日志损坏或由于任何原因 MDS 无法重放它,请尝试恢复我们喜欢的文件元数据: cephfs-journal-tool event recover_dentries summary P0 u0 Q; {' r2 i4 ]* b
, A2 S! x K) {. f此命令默认作用于 MDS rank 0,通过 –rank=<n> 对其他 rank 进行操作。 如果这些 inode/dentries 的版本高于后备存储的先前内容,则此命令将从日志中恢复的任何 inode/dentries 写入后备存储。如果期刊的任何区域丢失/损坏,它们将被跳过。 请注意,除了写出 dentry 和 inode 之外,此命令还将更新每个“in”MDS rank 的 InoTables,以指示任何已写入的 inode 编号现在正在使用中。在简单的情况下,这将导致完全有效的后备存储状态。 警告 后备存储的结果状态不能保证是自洽的,之后需要在线 MDS 清理。该命令不会修改日志内容,您应该在恢复后单独截断日志。 + z$ E$ g+ d: E7 s8 ]7 X5 m
日志截断[size=0.8em]如果日志损坏或 MDS 因任何原因无法重播它,您可以像这样截断它: cephfs-journal-tool journal reset
0 E9 L: v# B+ B4 _1 V6 c
4 I1 g' ^; Q5 q* U7 W1 o警告 除非您通过其他方式(例如recover_dentries. 很可能会在数据池中留下一些孤立对象。这可能会导致重新分配已写入的 inode,从而可能违反权限规则。 ( N* ?# p8 Z' G( N4 z; ?# ]; z
MDS 表擦拭[size=0.8em]日志重置后,它可能不再与 MDS 表(InoTable、SessionMap、SnapServer)的内容保持一致。 要重置 SessionMap(擦除所有会话),请使用: cephfs-table-tool all reset session
+ q8 _0 c' ?& m ~+ @" W F
+ f: q% A6 B) L6 r4 F" U这个命令作用于所有'in' MDS rank 的表。将 'all' 替换为 MDS 等级以仅在该等级上运行。 会话表是最有可能需要重置的表,但如果您知道还需要重置其他表,则将“会话”替换为“快照”或“索引节点”。 MDS 地图重置[size=0.8em]一旦文件系统的 in-RADOS 状态(即元数据池的内容)有所恢复,可能需要更新 MDS 映射以反映元数据池的内容。使用以下命令将 MDS 映射重置为单个 MDS: ceph fs reset <fs name> --yes-i-really-mean-it
, a' ^' [- l6 @1 y6 z; e) o2 z1 u2 C: Y: v- Y. q
一旦运行,MDS rank 的任何非 RADOS 状态都将被忽略:因此,这可能会导致数据丢失。 有人可能想知道“fs reset”和“fs remove”有什么区别;fs新的'。关键区别在于,执行删除/新建将使 rank 0 处于“创建”状态,这样它将覆盖磁盘上任何现有的根 inode 并孤立任何现有文件。相反,“reset”命令将使 rank 0 处于“活动”状态,以便下一个声明该 rank 的 MDS 守护进程将继续使用现有的 in-RADOS 元数据。 从丢失的元数据对象中恢复[size=0.8em]根据丢失或损坏的对象,您可能需要运行各种命令来重新生成对象的默认版本。 # Session tablecephfs-table-tool 0 reset session# SnapServercephfs-table-tool 0 reset snap# InoTablecephfs-table-tool 0 reset inode# Journalcephfs-journal-tool --rank=0 journal reset# Root inodes ("/" and MDS directory)cephfs-data-scan init% Y. u8 v3 n5 H1 O( t" W% Z
& n j0 ^" C+ s, @
最后,您可以根据数据池的内容为丢失的文件和目录重新生成元数据对象。这是一个三阶段的过程。首先,扫描所有对象以计算 inode 的大小和 mtime 元数据。其次,扫描每个文件的第一个对象以收集此元数据并将其注入元数据池。第三,检查 inode 链接并修复发现的错误。 cephfs-data-scan scan_extents <data pool>cephfs-data-scan scan_inodes <data pool>cephfs-data-scan scan_links
7 }" @) X: {/ L4 n" y7 B9 v7 A% J+ m5 }$ i! V3 Y7 W$ G( ]" \! r! v1 A
如果数据池中有很多文件或非常大的文件,“scan_extents”和“scan_inodes”命令可能需要很长时间。 要加速该过程,请运行该工具的多个实例。 确定工人的数量,并为每个工人传递一个 0-(worker_m - 1) 范围内的数字。 下面的例子展示了如何同时运行 4 个 worker: # Worker 0cephfs-data-scan scan_extents --worker_n 0 --worker_m 4 <data pool># Worker 1cephfs-data-scan scan_extents --worker_n 1 --worker_m 4 <data pool># Worker 2cephfs-data-scan scan_extents --worker_n 2 --worker_m 4 <data pool># Worker 3cephfs-data-scan scan_extents --worker_n 3 --worker_m 4 <data pool># Worker 0cephfs-data-scan scan_inodes --worker_n 0 --worker_m 4 <data pool># Worker 1cephfs-data-scan scan_inodes --worker_n 1 --worker_m 4 <data pool># Worker 2cephfs-data-scan scan_inodes --worker_n 2 --worker_m 4 <data pool># Worker 3cephfs-data-scan scan_inodes --worker_n 3 --worker_m 4 <data pool>3 h; i+ ^5 Y- N, m" S; J5 I
5 w4 x' N! u2 ? }5 j在任何工作人员进入 scan_inodes 阶段之前,确保所有工作人员都完成了 scan_extents 阶段非常重要。 完成元数据恢复后,您可能需要运行清理操作以删除恢复期间生成的辅助数据。 cephfs-data-scan cleanup <data pool>0 B8 R( z( i. A+ E. [) F! r
9 P6 A5 f' O& z: q' N Y8 q
查找受丢失数据 PG 影响的文件[size=0.8em]丢失数据 PG 可能会影响许多文件。文件被分割成许多对象,因此确定哪些文件受到特定 PG 丢失的影响需要对文件大小内可能存在的所有对象 ID 进行全面扫描。这种类型的扫描可能有助于识别哪些文件需要从备份中恢复。 危险 此命令不会修复任何元数据,因此在这种情况下恢复文件时,您必须删除损坏的文件并替换它以获得新的 inode。不要在原地覆盖损坏的文件。 - k7 S$ h* d2 ?
如果您知道 PG 中的对象已丢失,请使用pg_files 子命令扫描可能因此而损坏的文件: cephfs-data-scan pg_files <path> <pg id> [<pg id>...]
) ~6 f9 R( g$ v/ r( j) `! D$ \; }+ b( _# O; r
例如,如果您丢失了 PG 1.4 和 4.5 中的数据,并且您想知道 /home/bob 下的哪些文件可能已损坏: cephfs-data-scan pg_files /home/bob 1.4 4.5
" }" ?* {6 W- C" L5 x# x' [
' J g$ F9 ?4 Y; N# G输出将是潜在损坏文件的路径列表,每行一个。 请注意,此命令充当普通 CephFS 客户端来查找文件系统中的所有文件并读取它们的布局,因此 MDS 必须启动并运行。 使用备用元数据池进行恢复[size=0.8em]警告 该程序尚未进行广泛的测试。应该非常小心地进行。
7 B6 C! m- X+ J8 z0 |$ O! T4 O+ T# b如果现有文件系统损坏且无法运行,则可以创建一个新的元数据池并尝试将文件系统元数据重建到这个新池中,而将旧元数据留在原处。这可用于进行更安全的恢复尝试,因为现有的元数据池不会被覆盖。 警告 在此过程中,多个元数据池将包含引用同一数据池的数据。在这种情况下,必须格外小心以避免更改数据池内容。恢复完成后,应删除损坏的元数据池。 , B" g) C; W; g" j( O
要开始此过程,首先创建新的元数据池并使用空文件系统数据结构对其进行初始化: ceph fs flag set enable_multiple true --yes-i-really-mean-itceph osd pool create recovery <pg-num> replicated <crush-rule-name>ceph fs new recovery-fs recovery <data pool> --allow-dangerous-metadata-overlaycephfs-data-scan init --force-init --filesystem recovery-fs --alternate-pool recoveryceph fs reset recovery-fs --yes-i-really-mean-itcephfs-table-tool recovery-fs:all reset sessioncephfs-table-tool recovery-fs:all reset snapcephfs-table-tool recovery-fs:all reset inode, _: L* T: `, M- G5 [
* h$ Z3 y6 r: Y2 B+ [
接下来,使用 –alternate-pool 参数运行恢复工具集以将结果输出到备用池: cephfs-data-scan scan_extents --alternate-pool recovery --filesystem <original filesystem name> <original data pool name>cephfs-data-scan scan_inodes --alternate-pool recovery --filesystem <original filesystem name> --force-corrupt --force-init <original data pool name>cephfs-data-scan scan_links --filesystem recovery-fs
9 ^( ]3 W3 V w8 R5 s) h U: P# N; b" q4 s8 W- L. {$ C; R# N
如果损坏的文件系统包含脏日志数据,则可以通过以下方式恢复它: cephfs-journal-tool --rank=<original filesystem name>:0 event recover_dentries list --alternate-pool recoverycephfs-journal-tool --rank recovery-fs:0 journal reset --force
* ^7 x: c" `6 x- X
R1 \6 h9 e# P2 T X; B; D9 v) ]恢复后,部分恢复的目录会有不正确的统计信息。确保参数 mds_verify_scatter 和 mds_debug_scatterstat 设置为 false(默认值)以防止 MDS 检查统计信息,然后运行前向清理以修复它们。确保您有一个 MDS 正在运行并发出: ceph daemon mds.a scrub_path / recursive repair/ {& A! D# k) W8 R, C; u
1 g t" u$ j' [$ ]3 p
0 [' a6 i! s0 V
|