注意

本文档适用于 Ceph 的开发版本。

Ceph 文件系统 Scrub

CephFS 允许集群管理员(操作员)通过一组 scrub 命令来检查文件系统的一致性。Scrub 可以分为两个部分

  1. 正向 Scrub:Scrub 操作从文件系统根目录(或子目录)开始,查看层次结构中所有可触及的内容以确保一致性。

  2. 反向 Scrub:Scrub 操作查看文件系统池中的每个 RADOS 对象,并将其映射回文件系统层次结构。

本文档详细介绍了启动和控制正向 scrub(下文称为 scrub)的命令。

警告

CephFS 正向 scrub 在 rank 0 上启动和操作。所有 scrub 命令都必须指向 rank 0。

启动文件系统 Scrub

要启动目录树的 scrub 操作,请运行以下形式的命令

ceph tell mds.<fsname>:0 scrub start <path> [scrubopts] [tag]

其中 scruboptsrecursiveforcerepair 的逗号分隔列表,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 排队等待 scrub

    ceph 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_mdsdirrecursive 标志的 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
    }
]}

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入