注意
本文档适用于 Ceph 的开发版本。
Ceph 文件系统 Scrub
CephFS 允许集群管理员(操作员)通过一组 scrub 命令来检查文件系统的一致性。Scrub 可以分为两个部分
正向 Scrub:Scrub 操作从文件系统根目录(或子目录)开始,查看层次结构中所有可触及的内容以确保一致性。
反向 Scrub:Scrub 操作查看文件系统池中的每个 RADOS 对象,并将其映射回文件系统层次结构。
本文档详细介绍了启动和控制正向 scrub(下文称为 scrub)的命令。
警告
CephFS 正向 scrub 在 rank 0 上启动和操作。所有 scrub 命令都必须指向 rank 0。
启动文件系统 Scrub
要启动目录树的 scrub 操作,请运行以下形式的命令
ceph tell mds.<fsname>:0 scrub start <path> [scrubopts] [tag]
其中 scrubopts 是 recursive、force 或 repair 的逗号分隔列表,tag 是一个可选的自定义字符串标签(默认值是生成的 UUID)。示例命令如下
ceph tell mds.cephfs:0 scrub start / recursive
{
"return_code": 0,
"scrub_tag": "6f0d204c-6cfd-4300-9e02-73f382fd23c1",
"mode": "asynchronous"
}
递归 scrub 是异步的(如上面输出中的 mode 所暗示)。异步 scrub 必须使用 scrub status 进行轮询以确定状态。
scrub 标签用于区分 scrub,也用于将每个 inode 在默认数据池中的第一个数据对象(存储回溯信息的位置)标记一个 scrub_tag 扩展属性,其值为该标签。您可以使用 RADOS 实用程序查看扩展属性来验证 inode 是否已 scrub。
Scrub 适用于多个活动 MDS(多个 rank)。scrub 由 rank 0 管理并根据需要分配给 MDS。
监控(正在进行的)文件系统 Scrub
可以使用 scrub status 命令来监控和轮询正在进行的 scrub 的状态。此命令列出正在进行的 scrub(由标签标识)以及用于启动 scrub 的路径和选项
ceph tell mds.cephfs:0 scrub status
{
"status": "scrub active (85 inodes in the stack)",
"scrubs": {
"6f0d204c-6cfd-4300-9e02-73f382fd23c1": {
"path": "/",
"options": "recursive"
}
}
}
status 显示在任何给定时间安排要 scrub 的 inode 数量。因此,它可能会在后续的 scrub status 调用中发生变化。此外,scrub 操作的高级摘要(包括操作状态和触发 scrub 的路径)会显示在 ceph status 中
ceph status
[...]
task status:
scrub status:
mds.0: active [paths:/]
[...]
当 scrub 不再显示在此列表中时,它就完成了(尽管这在未来的版本中可能会有所变化)。任何损坏将通过 集群健康警告 进行报告。
控制(正在进行的)文件系统 Scrub
暂停:暂停正在进行的 scrub 操作会导致在进行中的 RADOS 操作(针对当前正在 scrub 的 inode)完成后,不再 scrub 新的或挂起的 inode
ceph tell mds.cephfs:0 scrub pause { "return_code": 0 }
暂停后的
scrub status反映了暂停状态。此时,启动新的 scrub 操作(通过scrub start)只会将 inode 排队等待 scrubceph tell mds.cephfs:0 scrub status { "status": "PAUSED (66 inodes in the stack)", "scrubs": { "6f0d204c-6cfd-4300-9e02-73f382fd23c1": { "path": "/", "options": "recursive" } } }
恢复:恢复会重新启动已暂停的 scrub 操作
ceph tell mds.cephfs:0 scrub resume { "return_code": 0 }
中止:中止正在进行的 scrub 操作会在进行中的 RADOS 操作(针对当前正在 scrub 的 inode)完成后,从 scrub 队列中移除挂起的 inode(从而中止 scrub)
ceph tell mds.cephfs:0 scrub abort { "return_code": 0 }
损坏
文件系统 Scrub 可以报告和修复的损坏类型有
DENTRY:Inode 的 dentry 丢失。
DIR_FRAG:Inode 的目录片段丢失。
BACKTRACE:数据池中 Inode 的回溯信息损坏。
上述 MDS 损坏类型可以通过运行以下形式的命令进行修复
ceph tell mds.<fsname>:0 scrub start /path recursive, repair, force
如果 scrub 能够修复损坏,相应的条目将自动从损坏表中删除。
注意
使用 repair 选项调用的 scrub 可以识别损坏的硬链接,但无法修复它。
使用递归 Scrub 评估 Strays
要评估 strays,即清除 ~mdsdir 中的 stray 目录,请运行以下形式的命令
ceph tell mds.<fsname>:0 scrub start ~mdsdir recursive
在 CephFS 根目录进行 scrub 时,默认情况下不会将 ~mdsdir 入队。要在根目录执行 stray 评估,请运行带有 scrub_mdsdir 和 recursive 标志的 scrub
ceph tell mds.<fsname>:0 scrub start / recursive,scrub_mdsdir
转储 Stray 文件夹内容
要在特定的 MDS 上转储 stray 文件夹内容,请运行以下形式的命令
ceph tell mds.<fsname>:0 dump stray
{
"strays": [
{
"ino": "0x100000001f7",
"stray_prior_path": "/dir/dir1",
"client_caps": [
{
"client_id": 4156,
"pending": "pAsLsXsFscr",
"issued": "pAsLsXsFscr",
"wanted": "-",
"last_sent": 3
}
],
"loner": -1,
"want_loner": -1,
"mds_caps_wanted": [],
"is_subvolume": false
}
]}