注意

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

CephFS 快照镜像

CephFS 支持通过 cephfs-mirror 工具将快照异步推送到远程 CephFS 文件系统。快照同步通过镜像快照数据,然后在远程文件系统上使用与源快照相同的名称(对于给定目录)创建远程快照来完成。

要求

主(本地)和辅助(远程)Ceph 集群版本应为 Pacific 或更高版本。

创建用户

首先,为 cephfs-mirror 守护进程创建一个 Ceph 用户(在主/本地集群上)。此用户需要对元数据池具有写入权限才能创建用于监视/通知操作的 RADOS 对象(索引对象),并对数据池具有读取权限。

$ ceph auth get-or-create client.mirror mon 'profile cephfs-mirror' mds 'allow r' osd 'allow rw tag cephfs metadata=*, allow r tag cephfs data=*' mgr 'allow r'

为每个文件系统对等体创建一个 Ceph 用户(在辅助/远程集群上)。此用户需要对 MDS(用于拍摄快照)和 OSD 具有完全权限。

$ ceph fs authorize <fs_name> client.mirror_remote / rwps

在添加对等体时,此用户将作为对等体规范的一部分提供。

启动镜像守护进程

镜像守护进程由 systemd 管理,但在大多数情况下,最好使用 cephadm 接口。

$ systemctl enable cephfs-mirror@mirror
$ systemctl start cephfs-mirror@mirror

cephfs-mirror 守护进程可以使用以下命令在前台运行:

$ cephfs-mirror --id mirror --cluster site-a -f

注意

此处指定的用户是 mirror,其创建在创建用户部分中描述。

可以部署多个 cephfs-mirror 守护进程以实现并发同步和高可用性。镜像守护进程使用简单的 M/N 策略共享同步负载,其中 M 是目录数,Ncephfs-mirror 守护进程数。

当使用 cephadm 管理 Ceph 集群时,可以通过运行以下命令部署 cephfs-mirror 守护进程:

ceph orch apply cephfs-mirror

要部署多个镜像守护进程,请运行以下形式的命令:

ceph orch apply cephfs-mirror --placement=<placement-spec>

例如,要在不同的主机上部署三个 cephfs-mirror 守护进程,请运行以下形式的命令:

$ ceph orch apply cephfs-mirror --placement="3 host1,host2,host3"

接口

管理器 mirroring 模块提供了用于管理目录快照镜像的接口。这些接口(大部分)是用于管理文件系统镜像的监视器命令的包装器,是推荐的控制接口。

镜像模块

镜像模块负责将目录分配给镜像守护进程进行同步。可以生成多个镜像守护进程以实现目录快照同步的并发性。当生成(或终止)镜像守护进程时,镜像模块会发现修改后的镜像守护进程集,并在新集合中重新平衡目录分配,从而提供高可用性。

注意

建议部署单个镜像守护进程。运行多个守护进程尚未经过测试。

镜像支持以下文件类型:

  • 普通文件 (-)

  • 目录文件 (d)

  • 符号链接文件 (l)

其他文件类型会被镜像忽略。因此,它们在成功同步的对等体上将不可用。

镜像模块默认禁用。要启用镜像模块,请运行以下命令:

ceph mgr module enable mirroring

镜像模块提供了一系列可用于控制目录快照镜像的命令。要添加或删除目录,必须为给定的文件系统启用镜像。要为给定文件系统启用镜像,请运行以下形式的命令:

ceph fs snapshot mirror enable <fs_name>

注意

“镜像模块”命令以 fs snapshot mirror 为前缀。这将其与以 fs mirror 为前缀的“监视器命令”区分开来。使用监视器命令启用镜像将导致镜像守护进程由于缺少 cephfs_mirror 索引对象而进入“失败”状态。因此,请确保(在这种情况下)使用模块命令。

要禁用给定文件系统的镜像,请运行以下形式的命令:

ceph fs snapshot mirror disable <fs_name>

启用镜像后,添加要镜像目录快照的对等体。对等体以 <client>@<cluster> 格式指定,本文档中将其称为 remote_cluster_spec。添加对等体时会为其分配一个唯一的 ID (UUID)。请参阅创建用户部分,了解有关如何为镜像创建 Ceph 用户的说明。

要添加对等体,请运行以下形式的命令:

ceph fs snapshot mirror peer_add <fs_name> <remote_cluster_spec> [<remote_fs_name>] [<remote_mon_host>] [<cephx_key>]

<remote_cluster_spec> 的格式为 client.<id>@<cluster_name>

<remote_fs_name> 是可选的,默认值与 <fs_name>(在远程集群上)相同。

要使此命令成功,远程集群的 Ceph 配置和用户密钥环必须在主集群中可用。例如,如果在远程集群上创建了一个名为 client_mirror 的用户,该用户对名为 remote_fs 的远程文件系统具有 rwps 权限(请参阅创建用户),并且远程集群名为 remote_ceph(即远程集群配置文件在主集群上名为 remote_ceph.conf),请运行以下命令将远程文件系统作为对等体添加到主文件系统 primary_fs

ceph fs snapshot mirror peer_add primary_fs client.mirror_remote@remote_ceph remote_fs

为了避免必须在主集群中维护远程集群配置文件和远程 ceph 用户密钥环,用户可以引导对等体(它将相关的远程集群详细信息存储在主集群上的监视器配置存储中)。请参阅引导对等体部分。

peer_add 命令支持传递远程集群监视器地址和用户密钥。但是,引导对等体是添加对等体的推荐方式。

注意

目前只支持单个对等体。peer_add 命令已弃用,并将在未来的版本中删除。请改用 peer_bootstrap 命令。

要删除对等体,请运行以下形式的命令:

ceph fs snapshot mirror peer_remove <fs_name> <peer_uuid>

要列出文件系统镜像对等体,请运行以下形式的命令:

ceph fs snapshot mirror peer_list <fs_name>

要配置要镜像的目录,请运行以下形式的命令:

ceph fs snapshot mirror add <fs_name> <path>

要列出已配置的目录,请运行以下形式的命令:

ceph fs snapshot mirror ls <fs_name>

要停止镜像目录快照,请运行以下形式的命令:

ceph fs snapshot mirror remove <fs_name> <path>

只允许使用绝对目录路径。

路径由镜像模块规范化。这意味着 /a/b/../b 等同于 /a/b。路径始终从 CephFS 文件系统根目录开始,而不是从主机系统挂载点开始。

例如

$ mkdir -p /d0/d1/d2
$ ceph fs snapshot mirror add cephfs /d0/d1/d2
{}
$ ceph fs snapshot mirror add cephfs /d0/d1/../d1/d2
Error EEXIST: directory /d0/d1/d2 is already tracked

将目录添加进行镜像后,不允许镜像子目录或祖先目录。

$ ceph fs snapshot mirror add cephfs /d0/d1
Error EINVAL: /d0/d1 is a ancestor of tracked path /d0/d1/d2
$ ceph fs snapshot mirror add cephfs /d0/d1/d2/d3
Error EINVAL: /d0/d1/d2/d3 is a subtree of tracked path /d0/d1/d2

镜像状态部分包含有关检查目录映射(到镜像守护进程)和检查目录分配的命令的信息。

引导对等体

通过 peer_add 子命令添加对等体需要对等体集群配置和用户密钥环在主集群中可用(管理器主机和运行镜像守护进程的主机)。可以通过引导和导入对等体令牌来避免这种情况。对等体引导涉及通过以下方式在对等体集群上创建引导令牌:

$ ceph fs snapshot mirror peer_bootstrap create <fs_name> <client_entity> <site-name>

例如:

$ ceph fs snapshot mirror peer_bootstrap create backup_fs client.mirror_remote site-remote
{"token": "eyJmc2lkIjogIjBkZjE3MjE3LWRmY2QtNDAzMC05MDc5LTM2Nzk4NTVkNDJlZiIsICJmaWxlc3lzdGVtIjogImJhY2t1cF9mcyIsICJ1c2VyIjogImNsaWVudC5taXJyb3JfcGVlcl9ib290c3RyYXAiLCAic2l0ZV9uYW1lIjogInNpdGUtcmVtb3RlIiwgImtleSI6ICJBUUFhcDBCZ0xtRmpOeEFBVnNyZXozai9YYUV0T2UrbUJEZlJDZz09IiwgIm1vbl9ob3N0IjogIlt2MjoxOTIuMTY4LjAuNTo0MDkxOCx2MToxOTIuMTY4LjAuNTo0MDkxOV0ifQ=="}

site-name 指的是一个用户定义的字符串,用于标识远程文件系统。在 peer_add 子命令的上下文中,site-nameremote_cluster_spec 中包含的名称。

通过以下方式在主集群中导入引导令牌:

$ ceph fs snapshot mirror peer_bootstrap import <fs_name> <token>

例如:

$ ceph fs snapshot mirror peer_bootstrap import cephfs eyJmc2lkIjogIjBkZjE3MjE3LWRmY2QtNDAzMC05MDc5LTM2Nzk4NTVkNDJlZiIsICJmaWxlc3lzdGVtIjogImJhY2t1cF9mcyIsICJ1c2VyIjogImNsaWVudC5taXJyb3JfcGVlcl9ib290c3RyYXAiLCAic2l0ZV9uYW1lIjogInNpdGUtcmVtb3RlIiwgImtleSI6ICJBUUFhcDBCZ0xtRmpOeEFBVnNyZXozai9YYUV0T2UrbUJEZlJDZz09IiwgIm1vbl9ob3N0IjogIlt2MjoxOTIuMTY4LjAuNTo0MDkxOCx2MToxOTIuMTY4LjAuNTo0MDkxOV0ifQ==

快照镜像

要启动快照镜像,请在主集群中创建已配置目录的快照:

$ mkdir -p /d0/d1/d2/.snap/snap1

镜像状态

CephFS 镜像模块提供了 mirror daemon status 接口来检查镜像守护进程状态:

$ ceph fs snapshot mirror daemon status
[
  {
    "daemon_id": 284167,
    "filesystems": [
      {
        "filesystem_id": 1,
        "name": "a",
        "directory_count": 1,
        "peers": [
          {
            "uuid": "02117353-8cd1-44db-976b-eb20609aa160",
            "remote": {
              "client_name": "client.mirror_remote",
              "cluster_name": "ceph",
              "fs_name": "backup_fs"
            },
            "stats": {
              "failure_count": 1,
              "recovery_count": 0
            }
          }
        ]
      }
    ]
  }
]

显示每个镜像守护进程实例的条目以及配置的对等体和基本统计信息等信息。有关更详细的统计信息,请使用如下所述的 admin socket 接口。

CephFS 镜像守护进程提供 admin socket 命令来查询镜像状态。要检查可用于镜像状态的命令,请使用:

$ ceph --admin-daemon /path/to/mirror/daemon/admin/socket help
{
    ....
    ....
    "fs mirror status cephfs@360": "get filesystem mirror status",
    ....
    ....
}

fs mirror status 开头的命令提供镜像已启用文件系统的镜像状态。请注意,cephfs@360 的格式为 filesystem-name@filesystem-id。需要此格式,因为镜像守护进程会异步收到有关文件系统镜像状态的通知(文件系统可以被删除并使用相同的名称重新创建)。

此命令目前提供有关镜像状态的最低限度信息:

$ ceph --admin-daemon /var/run/ceph/cephfs-mirror.asok fs mirror status cephfs@360
{
  "rados_inst": "192.168.0.5:0/1476644347",
  "peers": {
      "a2dc7784-e7a1-4723-b103-03ee8d8768f8": {
          "remote": {
              "client_name": "client.mirror_remote",
              "cluster_name": "site-a",
              "fs_name": "backup_fs"
          }
      }
  },
  "snap_dirs": {
      "dir_count": 1
  }
}

上述命令输出中的 peers 部分显示了对等体信息,包括唯一的对等体 ID (UUID) 和规范。如*镜像模块*部分所述,删除现有对等体时需要对等体 ID。

fs mirror peer status 开头的命令提供对等体同步状态。命令参数的格式为 filesystem-name@filesystem-id peer-uuid

$ ceph --admin-daemon /var/run/ceph/cephfs-mirror.asok fs mirror peer status cephfs@360 a2dc7784-e7a1-4723-b103-03ee8d8768f8
{
  "/d0": {
      "state": "idle",
      "last_synced_snap": {
          "id": 120,
          "name": "snap1",
          "sync_duration": 3,
          "sync_time_stamp": "274900.558797s",
          "sync_bytes": 52428800
      },
      "snaps_synced": 2,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  }
}

同步统计信息(包括 snaps_syncedsnaps_deletedsnaps_renamed)在守护进程重新启动和/或目录被重新分配给另一个镜像守护进程时(部署多个镜像守护进程时)会重置。

目录可以处于以下状态之一:

  • idle:目录当前未同步。

  • syncing:目录当前正在同步。

  • failed:目录已达到连续失败的上限。

当目录当前正在同步时,镜像守护进程将其标记为 syncingfs mirror peer statuscurrent_syncing_snap 下显示正在同步的快照:

$ ceph --admin-daemon /var/run/ceph/cephfs-mirror.asok fs mirror peer status cephfs@360 a2dc7784-e7a1-4723-b103-03ee8d8768f8
{
  "/d0": {
      "state": "syncing",
      "current_syncing_snap": {
          "id": 121,
          "name": "snap2"
      },
      "last_synced_snap": {
          "id": 120,
          "name": "snap1",
          "sync_duration": 3,
          "sync_time_stamp": "274900.558797s",
          "sync_bytes": 52428800
      },
      "snaps_synced": 2,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  }
}

同步完成后,镜像守护进程会将其重新标记为 idle

当目录经历配置的连续同步失败次数时,镜像守护进程将其标记为 failed。将重试这些目录的同步。默认情况下,目录被标记为失败之前的连续失败次数由 cephfs_mirror_max_consecutive_failures_per_directory 配置选项控制(默认值:10),失败目录的重试间隔由 cephfs_mirror_retry_failed_directories_interval 配置选项控制(默认值:60 秒)。

例如,添加一个普通文件进行同步将导致失败状态:

$ ceph fs snapshot mirror add cephfs /f0
$ ceph --admin-daemon /var/run/ceph/cephfs-mirror.asok fs mirror peer status cephfs@360 a2dc7784-e7a1-4723-b103-03ee8d8768f8
{
  "/d0": {
      "state": "idle",
      "last_synced_snap": {
          "id": 121,
          "name": "snap2",
          "sync_duration": 5,
          "sync_time_stamp": "500900.600797s",
          "sync_bytes": 78643200
      },
      "snaps_synced": 3,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  },
  "/f0": {
      "state": "failed",
      "snaps_synced": 0,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  }
}

这允许用户添加一个不存在的目录进行同步。镜像守护进程会将此类目录标记为失败并重试(频率较低)。当创建目录时,镜像守护进程将在成功同步后清除失败状态。

在远程文件系统的 .snap 目录中添加新快照或新目录将导致相应已配置目录的失败状态。在远程文件系统中:

$ ceph fs subvolume snapshot create cephfs subvol1 snap2 group1
or
$ mkdir /d0/.snap/snap2

$ ceph --admin-daemon /var/run/ceph/cephfs-mirror.asok fs mirror peer status cephfs@360 a2dc7784-e7a1-4723-b103-03ee8d8768f8
{
  "/d0": {
      "state": "failed",
      "failure_reason": "snapshot 'snap2' has invalid metadata",
      "last_synced_snap": {
          "id": 120,
          "name": "snap1",
          "sync_duration": 3,
          "sync_time_stamp": "274900.558797s"
      },
      "snaps_synced": 2,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  },
  "/f0": {
      "state": "failed",
      "snaps_synced": 0,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  }
}

当快照或目录从远程文件系统中删除时,如果存在任何待处理的快照,镜像守护进程将在成功同步后清除失败状态。

注意

在正在镜像的目录的远程文件系统上设置快照计划将导致镜像守护进程报告错误,例如 invalid metadata

注意

将远程文件系统视为只读。CephFS 本身没有强制执行任何操作。但是,通过正确的 MDS 功能,用户将无法在远程文件系统中拍摄目录快照。

禁用镜像时,文件系统的相应 fs mirror status 命令将不会显示在命令帮助中。

指标

CephFS 将镜像指标导出为带标签的性能计数器,这些计数器将被 OCP/ODF 仪表板使用以提供地理复制监控。这些指标可用于衡量 cephfs-mirror 同步的进度,从而提供监控功能。CephFS 导出以下镜像指标,这些指标使用 counter dump 命令显示。

镜像状态指标

名称

类型

描述

mirroring_peers

Gauge

参与镜像的对等体数量

directory_count

Gauge

正在同步的目录总数

mirrored_filesystems

Gauge

已镜像的文件系统总数

mirror_enable_failures

计数器

启用镜像失败次数

复制指标

名称

类型

描述

snaps_synced

计数器

成功同步的快照总数

sync_bytes

计数器

正在同步的总字节数

sync_failures

计数器

快照同步失败的总次数

snaps_deleted

计数器

已删除的快照总数

snaps_renamed

计数器

已重命名的快照总数

avg_sync_time

Gauge

所有快照同步的平均时间

last_synced_start

Gauge

上次同步快照的同步开始时间

last_synced_end

Gauge

上次同步快照的同步结束时间

last_synced_duration

Gauge

上次同步的时间持续时间

last_synced_bytes

计数器

上次同步快照正在同步的总字节数

配置选项

cephfs_mirror_max_concurrent_directory_syncs

cephfs-mirror 守护进程可以并发同步的最大目录快照数。控制同步线程数。

类型:

uint

默认值:

3

min:

1

cephfs_mirror_action_update_interval

处理待处理镜像更新操作的时间间隔(以秒为单位)。

类型:

默认值:

2

min:

1

cephfs_mirror_restart_mirror_on_blocklist_interval

重新启动被阻止列表中的镜像实例的时间间隔(以秒为单位)。设置为零 (0) 将禁用重新启动被阻止列表中的实例。

类型:

默认值:

30

min:

0

cephfs_mirror_max_snapshot_sync_per_cycle

当工作线程选择一个目录进行镜像时,要镜像的最大快照数。

类型:

uint

默认值:

3

min:

1

cephfs_mirror_directory_scan_interval

扫描已配置目录以进行快照镜像的时间间隔(以秒为单位)。

类型:

uint

默认值:

10

min:

1

cephfs_mirror_max_consecutive_failures_per_directory

连续快照同步失败次数,用于将目录标记为“失败”。失败的目录会以较低的频率重试同步。

类型:

uint

默认值:

10

min:

0

cephfs_mirror_retry_failed_directories_interval

重试失败目录同步的时间间隔(以秒为单位)。

类型:

uint

默认值:

60

min:

1

cephfs_mirror_restart_mirror_on_failure_interval

重新启动失败镜像实例的时间间隔(以秒为单位)。设置为零 (0) 将禁用重新启动失败的镜像实例。

类型:

默认值:

20

min:

0

cephfs_mirror_mount_timeout

cephfs-mirror 守护进程挂载主或辅助(远程)ceph 文件系统的超时时间(以秒为单位)。将其设置为更高的值可能导致在集群无法访问时挂载文件系统时镜像守护进程停滞。此选项用于覆盖通常的 client_mount_timeout。

类型:

默认值:

10

min:

0

cephfs_mirror_perf_stats_prio

如果优先级不低于 mgr_stats_threshold,守护进程将向管理器守护进程发送性能计数器数据。

类型:

int

默认值:

5

允许范围:

[0, 11]

重新添加对等体

当将对等体重新添加(重新分配)到另一个集群中的文件系统时,请确保所有镜像守护进程已停止同步到该对等体。这可以通过 fs mirror status admin socket 命令进行检查(命令输出中不应显示 *Peer UUID*)。此外,建议在将对等体重新添加到另一个文件系统之前,从对等体中清除已同步的目录(特别是那些可能存在于新主文件系统中的目录)。如果将对等体重新添加回它之前同步的同一主文件系统,则不需要这样做。

由 Ceph 基金会为您呈现

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