注意

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

CephFS镜像

CephFS 支持通过工具异步复制快照到远程 CephFS 文件系统。快照通过镜像快照数据,然后创建与正在同步的快照具有相同名称(对于远程文件系统上的给定目录)的快照来进行同步。cephfs-mirror tool. Snapshots are synchronized by mirroring snapshot data followed by creating a snapshot with the same name (for a given directory on the remote file system) as the snapshot being synchronized.

要求

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

核心思想

对于给定目录中的某个快照对,守护进程将依赖 CephFS Snapdiff 功能来识别目录树中的更改。将这些差异应用于远程文件系统中的目录,从而仅同步两个快照之间更改的文件。cephfs-mirror daemon will rely on CephFS Snapdiff Feature to identify changes in a directory tree. The diffs are applied to directory in the remote file system thereby only synchronizing files that have changed between two snapshots.

目前,快照数据通过批量复制到远程文件系统进行同步。

Note

同步硬链接不受支持——硬链接文件作为单独的文件进行同步。

创建用户

首先在主要/本地集群上为镜像守护进程创建一个用户。该用户需要在元数据池上具有写入能力以创建 RADOS 对象(索引对象)用于 watch/notify 操作,并在数据池上具有读取能力。

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

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

启动镜像守护进程

通过使用systemctl(1)单元文件:

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

,则表示你位于正确的目录中。运行cephfs-mirror守护进程在前景中启动镜像守护进程,通过运行以下命令:-f选项:

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

Note

这里指定的用户是mirror,如创建用户部分。

镜像设计

CephFS 支持通过工具异步复制快照到远程 CephFS 文件系统。对于给定目录,快照通过将快照数据传输到远程文件系统并创建与正在同步的快照具有相同名称的快照来进行同步。cephfs-mirror tool. For a given directory, snapshots are synchronized by transferring snapshot data to the remote file system and by creating a snapshot with the same name as the snapshot being synchronized.

快照同步顺序

虽然同步快照的顺序并不重要,但快照是基于创建顺序(使用快照 ID)选择的。

快照化身

一个快照可以被删除并重新创建(使用相同的名称),但内容不同。一个“旧”快照可能已经被同步(较早),而快照的重新创建可能是在镜像禁用期间完成的。使用快照名称来推断连续点会导致“新”快照(化身)永远不会被选中进行同步。

在次要文件系统中存储的快照存储了它所同步的快照的快照 ID。此元数据存储在SnapInfo结构在 MDS 上。

接口

The 镜像模块(管理器插件)为管理目录快照镜像提供接口。管理器接口是(主要是)用于管理文件系统镜像的监控命令的包装器,并是推荐的控制接口。

镜像模块和接口

镜像模块为管理目录快照镜像提供了一个接口。该模块作为 Ceph 管理器插件实现。镜像模块不管理(和终止)镜像守护进程的启动。systemctl(1)是启动和停止镜像守护进程的首选方式。未来,镜像守护进程将由cephadm部署和管理(跟踪器:da066e: http://tracker.ceph.com/issues/47261http://tracker.ceph.com/issues/47261).

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

Note

具有多个镜像守护进程的配置目前尚未经过测试。建议仅使用单个镜像守护进程。

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

ceph mgr module enable mirroring

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

ceph fs snapshot mirror enable <fs_name>

Note

镜像模块命令使用fs snapshot mirror前缀,而监控命令使用fs mirror前缀。确保使用模块(即fs snapshot mirror)命令。

要禁用镜像,请运行以下格式的命令:

ceph fs snapshot mirror disable <fs_name>

启用镜像后,添加要镜像目录快照的对等体。对等体遵循<client>@<cluster>规范,并在添加时分配一个唯一的 ID(UUID)。有关如何为镜像创建 Ceph 用户的详细信息,请参阅创建用户部分。

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

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

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

这要求远程集群的 Ceph 配置和用户密钥环在主要集群中可用。有关更多信息,请参阅引导对等体部分。该peer_add子命令还支持传递远程集群的监控地址和用户密钥。但是,引导对等体是添加对等体的推荐方式。

Note

目前仅支持单个对等体。

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

ceph fs snapshot mirror peer_remove <fs_name> <peer_uuid>

Note

请参阅镜像守护进程状态如何确定对等体

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

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:

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-name是传递的集群名称来自remote_cluster_spec.

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

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

例如:

$ ceph fs snapshot mirror peer_bootstrap import cephfs eyJmc2lkIjogIjBkZjE3MjE3LWRmY2QtNDAzMC05MDc5LTM2Nzk4NTVkNDJlZiIsICJmaWxlc3lzdGVtIjogImJhY2t1cF9mcyIsICJ1c2VyIjogImNsaWVudC5taXJyb3JfcGVlcl9ib290c3RyYXAiLCAic2l0ZV9uYW1lIjogInNpdGUtcmVtb3RlIiwgImtleSI6ICJBUUFhcDBCZ0xtRmpOeEFBVnNyZXozai9YYUV0T2UrbUJEZlJDZz09IiwgIm1vbl9ob3N0IjogIlt2MjoxOTIuMTY4LjAuNTo0MDkxOCx2MToxOTIuMTY4LjAuNTo0MDkxOV0ifQ==

镜像守护进程状态

镜像守护进程异步接收文件系统镜像状态更改和/或对等体更新的通知。

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

$ ceph fs snapshot mirror daemon status

例如:

$ ceph fs snapshot mirror daemon status | jq
[
  {
    "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的格式为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上述命令输出中的Mirror Module and Interface部分。

命令具有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_deletedsnaps_renamed在守护进程重新启动时或当目录被重新分配给另一个镜像守护进程(当部署多个镜像守护进程时)时会被重置。

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

- `idle`: The directory is currently not being synchronized
- `syncing`: The directory is currently being synchronized
- `failed`: The directory has hit upper limit of consecutive failures

当目录达到配置的连续同步失败次数时,镜像守护进程将其标记为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 status命令不会在命令帮助中显示。

镜像模块提供了一些命令来显示目录映射和分布信息。要检查目录映射到哪个镜像守护进程,请使用:

$ ceph fs snapshot mirror dirmap cephfs /d0/d1/d2
{
  "instance_id": "404148",
  "last_shuffled": 1601284516.10986,
  "state": "mapped"
}

Note

instance_id是与镜像守护进程关联的 RADOS 实例 ID。

其他信息,例如状态last_shuffled在运行多个镜像守护进程时很有趣。

当没有镜像守护进程运行时,上述命令显示:

$ ceph fs snapshot mirror dirmap cephfs /d0/d1/d2
{
  "reason": "no mirror daemons running",
  "state": "stalled"
}

表示没有镜像守护进程运行,镜像已停滞。

重新添加对等体

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

功能状态

cephfs-mirror守护进程默认构建(遵循WITH_CEPHFSCMake 规则)。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.