CephFS 快照 Mirror(pacific版本)
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。
4. 接口
镜像模块(管理器插件)提供了管理目录快照镜像的接口。管理器接口(主要)是用于管理文件系统镜像的MON命令的包装器,并且是推荐的控制接口。
5. 镜像模块
镜像模块负责将目录分配给镜像守护进程以进行同步。可以产生多个镜像守护进程以实现目录快照同步的并发性。当镜像守护进程产生(或终止)时,镜像模块会发现修改后的镜像守护进程集,并在新集之间重新平衡目录分配,从而提供高可用性。
笔记:多个镜像守护程序当前未经测试。建议只使用一个镜像守护程序。
镜像模块默认关闭。要启用镜像,请使用:
$ ceph mgr module enable mirroring
镜像模块提供了一系列命令来控制目录快照的镜像。要添加或删除目录,需要为给定的文件系统启用镜像。要启用镜像,请使用:
$ ceph fs snapshot mirror enable <fs_name>
笔记:与使用 fs 镜像前缀的MON命令相比,镜像模块命令使用fs 快照镜像前缀。确保使用模块命令。
要禁用镜像,请使用:
$ 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 配置和用户密钥环在主集群中可用。请参阅Bootstrap Peers部分以避免这种情况。peer_add还支持传递远程集群MON地址和用户密钥。但是,Bootstrap Peers是添加对等点的推荐方法。
笔记:目前仅支持单个对等点。
要删除对等点,请使用:
$ 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。
$ 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 已被跟踪
一旦添加目录进行镜像,则不允许添加其子目录或祖先目录进行镜像:
$ 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. Bootstrap Peers
添加对等点(通过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接口的上下文中,site-name是从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的格式为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) 和规范。如镜像模块和接口部分所述,需要 peer-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`: 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命令将不会显示在命令帮助中。
8. 配置选项
cephfs_mirror_max_concurrent_directory_syncs
- 描述
-
cephfs-mirror 守护进程可以同时同步的目录快照的最大数量。控制同步线程的数量。
- 类型
-
64 位整数无符号
- 默认
-
3
cephfs_mirror_action_update_interval
- 描述
-
处理挂起的镜像更新操作的时间间隔(以秒为单位)。
- 类型
-
浮点数
- 默认
-
2
cephfs_mirror_restart_mirror_on_blocklist_interval
- 描述
-
重新启动列入黑名单的镜像实例的时间间隔(以秒为单位)。设置为零 (0) 将禁用重新启动列入黑名单的实例。
- 类型
-
浮点数
- 默认
-
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) 将禁用重新启动失败的镜像实例。
- 类型
-
浮点数
- 默认
-
20
cephfs_mirror_mount_timeout
- 描述
-
cephfs-mirror 守护进程挂载主要或次要(远程)ceph 文件系统的超时时间(以秒为单位)。如果集群不可访问,将其设置为更高的值可能会导致镜像守护进程在挂载文件系统时停止。此选项用于覆盖通常的 client_mount_timeout。
- 类型
-
浮点数
- 默认
-
10
9. 重新添加对等点
将对等点重新添加(重新分配)到另一个集群中的文件系统时,请确保所有镜像守护程序都已停止与对等点的同步。这可以通过fs mirror status admin socket 命令进行检查(Peer UUID不应显示在命令输出中)。此外,建议在将同步目录重新添加到另一个文件系统之前从对等方清除同步目录(尤其是那些可能存在于新主文件系统中的目录)。如果将对等点重新添加到之前同步的同一主文件系统,则不需要这样做。