CephFS快照镜像(官方教程)

发布时间 2023-08-04 13:36:45作者: Varden

CephFS 支持通过 cephfs-mirror 工具将快照异步复制到远程 CephFS 文件系统。通过镜像快照数据,然后创建与要同步的快照同名的快照(对于远程文件系统上的给定目录)来同步快照。

1. 要求

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

2. 创建用户

首先为镜像守护程序创建一个用户(在主/本地集群上)。此用户需要元数据池上的写入功能,以创建 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'

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

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

添加对等方时,应使用此用户(作为对等规范的一部分)。

3. 启动镜像守护程序

镜像守护进程应该使用 systemctl(1) 单元文件生成:

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

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

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

注意:此处指定的用户是mirror,其在创建用户部分中进行了描述。

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

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

$ ceph orch apply cephfs-mirror

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

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

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

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

4. 接口

【镜像模块(管理器插件)提供了用于管理目录快照镜像的接口。这些(主要是)围绕用于管理文件系统镜像的监视器命令的包装器,是推荐的控制接口。】

5. 镜像模块

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

【注意:建议部署单个镜像守护程序。运行多个守护程序未经测试。】

默认情况下,镜像模块处于禁用状态。若要启用镜像模块,请运行以下命令:

$ ceph mgr module enable mirroring

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

$ ceph fs snapshot mirror enable <fs_name>

注意:“镜像模块”命令以 fs snapshot mirror 为前缀。这将它们与以 fs 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> 是 <id>@<cluster_name>。

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

要使此命令成功,远程集群的 Ceph 配置和用户密钥环必须在主集群中可用。例如,如果在远程集群上创建了名为 mirror_remote 的用户,该用户对名为 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 命令支持传递远程群集监视器地址和用户密钥。但是,引导对等体是添加对等体的推荐方法。】

【注意:目前仅支持单个对等体。】

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

$ 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 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

“镜像状态”部分包含有关用于检查目录映射(到镜像守护程序)和检查目录分发的命令的信息。

6. 引导对等方

添加对等节点(通过 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=="}

站点名称是指用于标识远程文件系统的用户定义的字符串。在 peer_add 接口的上下文中,站点名称是从 remote_cluster_spec 传入的群集名称。

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

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

例如:

$ ceph fs snapshot mirror peer_bootstrap import cephfs eyJmc2lkIjogIjBkZjE3MjE3LWRmY2QtNDAzMC05MDc5LTM2Nzk4NTVkNDJlZiIsICJmaWxlc3lzdGVtIjogImJhY2t1cF9mcyIsICJ1c2VyIjogImNsaWVudC5taXJyb3JfcGVlcl9ib290c3RyYXAiLCAic2l0ZV9uYW1lIjogInNpdGUtcmVtb3RlIiwgImtleSI6ICJBUUFhcDBCZ0xtRmpOeEFBVnNyZXozai9YYUV0T2UrbUJEZlJDZz09IiwgIm1vbl9ob3N0IjogIlt2MjoxOTIuMTY4LjAuNTo0MDkxOCx2MToxOTIuMTY4LjAuNTo0MDkxOV0ifQ==

7. 镜像状态

CephFS 镜像模块提供镜像守护进程状态接口,用于检查镜像守护进程状态:

$ 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
            }
          }
        ]
      }
    ]
  }
]

将显示每个镜像守护程序实例的条目以及配置的对等方和基本统计信息等信息。有关更详细的统计信息,请使用管理套接字界面,如下所述。

CephFS 镜像守护程序提供用于查询镜像状态的管理套接字命令。要检查可用的镜像状态命令:

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

带有 fs mirror status 前缀的命令为启用镜像的文件系统提供镜像状态。请注意,cephfs@360 的格式为文件系统 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
  }
}

上述命令输出中的对等方部分显示对等方信息,例如唯一对等 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": 0.079997898999999997,
          "sync_time_stamp": "274900.558797s"
      },
      "snaps_synced": 2,
      "snaps_deleted": 0,
      "snaps_renamed": 0
  }
}

同步统计信息(如 snaps_synced、snaps_deleted 和 snaps_renamed )在守护程序重新启动或将目录重新分配给另一个镜像守护程序时(部署多个镜像守护程序时)重置。

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

- “idle”:目录当前未同步
- “syncing”:目录当前正在同步
- “failed”:目录已达到连续失败的上限

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

例如,添加用于同步的常规文件将导致失败状态:

$ 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": 120,
          "name": "snap1",
          "sync_duration": 0.079997898999999997,
          "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
  }
}

这允许用户添加不存在的目录进行同步。镜像守护程序会将目录标记为失败,然后重试(频率较低)。当目录存在时,镜像守护程序将在快照同步成功后取消标记失败状态。

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

8. 配置选项

cephfs_mirror_max_concurrent_directory_syncs

描述:cephfs镜像守护程序可以并发同步的最大目录快照数。控制同步线程数。
类型:64位无符号整数
默认:3

cephfs_mirror_action_update_interval

描述:处理挂起的镜像更新操作的间隔(以秒为单位)。
类型:Float
默认:2

cephfs_mirror_restart_mirror_on_blocklist_interval

描述:重新启动列入阻止列表的镜像实例的间隔(以秒为单位)。设置为零 (0) 将禁用重新启动列入阻止列表的实例。
类型:Float
默认:30

cephfs_mirror_max_snapshot_sync_per_cycle

描述:工作线程选取目录进行镜像时要镜像的最大快照数。
类型:64位无符号整数
默认:3

cephfs_mirror_directory_scan_interval

描述:扫描已配置目录以进行快照镜像的间隔(以秒为单位)。
类型:64位无符号整数
默认:10

cephfs_mirror_max_consecutive_failures_per_directory

描述:将目录标记为“失败”的连续快照同步失败次数。重试失败目录以进行同步的频率较低。
类型:64位无符号整数
默认:10

cephfs_mirror_retry_failed_directories_interval

描述:对失败目录重试同步的间隔(以秒为单位)。
类型:64位无符号整数
默认:60

cephfs_mirror_restart_mirror_on_failure_interval

描述:重新启动失败镜像实例的间隔(以秒为单位)。设置为零 (0) 将禁用重新启动失败的镜像实例。
类型:Float
默认:20

cephfs_mirror_mount_timeout

描述:由 cephfs 镜像守护程序挂载主 ceph 文件系统或辅助(远程)ceph 文件系统的超时(以秒为单位)。如果无法访问集群,将此值设置为更高的值可能会导致镜像守护程序在挂载文件系统时停止。此选项用于覆盖常用 client_mount_timeout 。
类型:Float
默认:10

9. 重新添加对等方

将对等节点重新添加(重新分配)到另一个集群中的文件系统时,请确保所有镜像守护程序都已停止与对等节点的同步。这可以通过 fs mirror status 管理套接字命令进行检查(对等 UUID 不应显示在命令输出中)。此外,建议在将同步目录重新添加到另一个文件系统(尤其是新主文件系统中可能存在的那些目录)之前,先从对等方清除同步目录。如果将对等体重新添加到之前同步的同一主文件系统,则不需要这样做。