注意
本文档适用于 Ceph 开发版本。
高级:元数据修复工具
警告
如果你没有CephFS内部的专家知识,在使用这些工具之前,你需要寻求帮助。
这里提到的工具可能会轻易造成损坏,以及修复它。
在尝试修复文件系统之前,了解你的文件系统到底出了什么问题至关重要。
如果你无法获得对你集群的专业支持,请咨询ceph-users邮件列表或#ceph IRC/Slack频道。
日志导出
在尝试任何危险操作之前,通过运行以下命令复制日志:
cephfs-journal-tool journal export backup.bin
从日志中恢复dentry
如果一个日志损坏或由于任何原因MDS无法重放它,尝试通过运行以下命令来恢复文件元数据:
cephfs-journal-tool event recover_dentries summary
默认情况下,此命令作用于MDS等级0
. 传递选项--rank=<n>
传递给cephfs-journal-tool
命令来操作其他等级。
此命令将可从日志中恢复的所有inode和dentry写入后端存储,但仅当这些inode和dentry的版本高于后端存储的现有内容时。任何缺失或损坏的日志区域将被跳过。
除了写入dentry和inode之外,此命令还会更新每个in
MDS等级的InoTables,以指示写入的inode的编号现在正在使用。在简单的情况下,这将导致一个完全有效的后端存储状态。
警告
后端存储的最终状态不保证是自洽的,并且之后需要进行在线MDS清理。此命令不会修改日志内容。在恢复你能恢复的内容后,单独截断日志。
日志截断
使用以下形式的命令来截断任何损坏的或MDS无法重放的日志:
cephfs-journal-tool [--rank=<fs_name>:{mds-rank|all}] journal reset --yes-i-really-really-mean-it
当文件系统有或曾有多个活动的MDS守护进程时,使用--rank
选项指定文件系统和MDS等级。
警告
重置日志将导致元数据丢失,除非你已经通过其他方式提取了它,例如recover_dentries
. 重置日志很可能在数据池中留下遗弃的对象。重置日志可能导致已经写入的inode重新分配,这意味着权限规则可能会被违反。
MDS表擦除
在重置日志后,它可能不再与MDS表(InoTable、SessionMap、SnapServer)的内容一致。
使用以下命令重置SessionMap(这将删除所有会话):
cephfs-table-tool all reset session
此命令作用于所有MDS等级的表,这些表是in
. 要仅对指定等级操作,请将上述命令中的all
替换为MDS等级。
在所有表中,会话表是最有可能需要重置的表。如果你知道你还需要重置其他表,那么请替换session
with snap
或inode
.
MDS映射重置
当文件系统的RADOS状态(即元数据池的内容)在一定程度上恢复后,可能需要更新MDS映射以反映元数据池的新状态。使用以下命令将MDS映射重置为单个MDS:
ceph fs reset <fs name> --yes-i-really-mean-it
运行此命令后,除0
之外的所有MDS等级的RADOS状态都将被忽略。这意味着运行此命令可能导致数据丢失。
使用fs reset
命令和fs remove
命令。Thefs reset
命令将等级0
。Cephadm 还支持使用active
状态保留,以便下一个声明该等级的MDS守护进程使用现有的RADOS元数据。而fs remove
命令将等级0
。Cephadm 还支持使用creating
状态保留,这意味着磁盘上的现有根inode将被覆盖。运行fs remove
命令将遗弃任何现有文件。
从缺失的元数据对象中恢复
根据缺失或损坏的对象,你可能需要运行额外的命令来重新生成对象的默认版本。
# Session table
cephfs-table-tool 0 reset session
# SnapServer
cephfs-table-tool 0 reset snap
# InoTable
cephfs-table-tool 0 reset inode
# Journal
cephfs-journal-tool --rank=<fs_name>:0 journal reset --yes-i-really-really-mean-it
# Root inodes ("/" and MDS directory)
cephfs-data-scan init
最后,你可以根据数据池的内容重新生成缺失文件和目录的元数据对象。这是一个三阶段过程:
扫描all对象以计算inode的大小和mtime元数据。
扫描每个文件的第一个对象以收集此元数据并将其注入元数据池。
检查inode链接并修复发现的错误。
cephfs-data-scan scan_extents [<data pool> [<extra data pool> ...]]
cephfs-data-scan scan_inodes [<data pool>]
cephfs-data-scan scan_links
scan_extents
和scan_inodes
命令可能需要很长的时间,如果数据池包含许多文件或非常大的文件。 time if
the data pool contains many files or very large files.
要加速运行scan_extents
或scan_inodes
的过程,运行该工具的多个实例:
确定工作者的数量,并将每个工作者传递一个范围内的数字0-(worker_m - 1)
(即“零到‘worker_m’减一”)。
以下示例显示了如何同时运行四个工作者:
# Worker 0
cephfs-data-scan scan_extents --worker_n 0 --worker_m 4
# Worker 1
cephfs-data-scan scan_extents --worker_n 1 --worker_m 4
# Worker 2
cephfs-data-scan scan_extents --worker_n 2 --worker_m 4
# Worker 3
cephfs-data-scan scan_extents --worker_n 3 --worker_m 4
# Worker 0
cephfs-data-scan scan_inodes --worker_n 0 --worker_m 4
# Worker 1
cephfs-data-scan scan_inodes --worker_n 1 --worker_m 4
# Worker 2
cephfs-data-scan scan_inodes --worker_n 2 --worker_m 4
# Worker 3
cephfs-data-scan scan_inodes --worker_n 3 --worker_m 4
建议至少为 Ceph 监控器、Ceph 管理器主机、CephFS 元数据服务器元数据池和 Ceph 对象网关 (RGW) 索引池提供(企业级)SSD,即使为批量 OSD 数据提供 HDD。重要要确保所有工作者在进入scan_extents
阶段之前都已完成scan_inodes phase
.
在完成元数据恢复过程后,你可能想要运行清理操作以删除恢复过程中生成的辅助数据。使用以下形式的命令运行清理操作:
cephfs-data-scan cleanup [<data pool>]
Note
对于scan_extents
, scan_inodes
和cleanup
命令,数据池参数是可选的,并且工具通常能够自动检测池。但是,你可以覆盖它。对于scan_extents
命令,需要指定所有数据池,但对于scan_inodes
和cleanup
命令,只需要指定主要数据池。
使用备用元数据池进行恢复
警告
此程序尚未经过广泛测试。只有在非常小心的情况下才应进行此操作。
如果现有的CephFS文件系统损坏且无法运行,那么可以创建一个新的元数据池,并尝试将损坏且无法运行的文件系统的元数据重建到新池中,同时保留旧的元数据。这可以用来更安全地尝试恢复,因为现有的元数据池不会被修改。
注意
在此过程中,多个元数据池将包含指向同一数据池的数据。必须极端小心,以避免在这种情况下更改数据池的内容。恢复完成后,存档或删除损坏的元数据池。
停机现有的文件系统,以防止对数据池进行任何进一步修改。卸载所有客户端。当所有客户端都已卸载后,使用以下命令将文件系统标记为失败:
ceph fs fail <fs_name>
Note
<fs_name>
这里和下面指的是原始的、损坏的文件系统。创建一个恢复文件系统。这个恢复文件系统将用于恢复损坏池中的数据。首先,文件系统将部署一个数据池。然后,你会将一个新的元数据池附加到新的数据池。然后,你会将新的元数据池设置为由旧数据池支持。
ceph osd pool create cephfs_recovery_meta ceph fs new cephfs_recovery cephfs_recovery_meta <data_pool> --recover --allow-dangerous-metadata-overlay
Note
你可以在将来重命名恢复元数据池和文件系统。标志
--recover
防止任何MDS守护进程加入新的文件系统。为文件系统创建初始元数据:
cephfs-table-tool cephfs_recovery:0 reset session
cephfs-table-tool cephfs_recovery:0 reset snap
cephfs-table-tool cephfs_recovery:0 reset inode
cephfs-journal-tool --rank cephfs_recovery:0 journal reset --force --yes-i-really-really-mean-it
使用以下命令从数据池重建元数据池:
cephfs-data-scan init --force-init --filesystem cephfs_recovery --alternate-pool cephfs_recovery_meta
cephfs-data-scan scan_extents --alternate-pool cephfs_recovery_meta --filesystem <fs_name>
cephfs-data-scan scan_inodes --alternate-pool cephfs_recovery_meta --filesystem <fs_name> --force-corrupt
cephfs-data-scan scan_links --filesystem cephfs_recovery
Note
上述每个扫描过程都会扫描整个数据池。这可能需要很长时间。请参阅上一节,了解如何将此任务分配给工作者。
如果损坏的文件系统包含脏日志数据,可以使用以下形式的命令来恢复:
cephfs-journal-tool --rank=<fs_name>:0 event recover_dentries list --alternate-pool cephfs_recovery_meta
恢复后,一些恢复的目录将具有不正确的统计信息。确保将参数
mds_verify_scatter
和mds_debug_scatterstat
设置为false(默认值),以防止MDS检查统计信息:ceph config rm mds mds_verify_scatter
ceph config rm mds mds_debug_scatterstat
Note
验证配置是否已全局设置或使用本地
ceph.conf
文件。允许一个MDS守护进程加入恢复文件系统:
ceph fs set cephfs_recovery joinable true
运行一个正向清理,以修复递归统计信息。 to repair recursive statistics. Ensure that you have an MDS daemon running and issue the following command:
ceph tell mds.cephfs_recovery:0 scrub start / recursive,repair,force
建议尽快将任何数据从恢复文件系统迁移。在恢复文件系统运行期间,不要恢复旧的文件系统。
Note
如果数据池也损坏,由于丢失放置组等问题,一些文件可能无法恢复,因为与它们相关的回溯信息丢失了。如果任何数据对象丢失(由于数据池上的问题),恢复的文件将包含缺失数据的空洞。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.