-
Cephfs 快照介绍与使用
CEPFS支持快照功能,通常通过使用mkdir命令创建快照目录。注意这是一个隐藏的特殊目录,在目录列表中不可见。 概述
通常情况下,快照正如起名:它们保存数据变化过程中的状态。需要注意的一点事,CEPFS快照的一些功能与您可能期望的有所不同: -
Arbitrary subtrees:快照将在您选择的目录中创建,并覆盖该目录下文件系统中的所有数据。 -
Asynchronous:如果创建快照,缓冲数据会被延迟清除,包括从其他客户端清除。因此,“创建”快照的速度非常快。
数据结构
-
SnapRealm:每当您在新的位置创建快照时(或当快照索引节点移动到其父快照之外时),都会创建SnapRealm。SnapRealms包含一个sr_t srnode,以及作为快照一部分的inodes_with_caps。客户端还有一个SnapRealm概念,它维护的数据较少,但用于将SnapContext与每个打开的文件关联起来进行写入。 -
sr_t:sr_t是磁盘上的快照元数据。它是包含目录的一部分,包含序列计数器、时间戳、关联快照ID列表和父快照(past_parent_snaps)。 -
SnapServer:SnapServer管理快照ID分配、快照删除,并跟踪文件系统中有效快照的列表。文件系统只有一个snapserver实例。 -
SnapClient:SnapClient用于与snapserver通信,每个MDS列组都有自己的SnapClient实例。SnapClient还在本地缓存有效快照。
创建快照
默认情况下,新文件系统上会启用CEPFS快照功能。要在现有文件系统上启用它,请使用下面的命令。 $ ceph fs set <fs_name> allow_new_snaps true 启用快照后,CephFS中的所有目录都将有一个特殊的
.snap
快照目录。(如果愿意,可以使用客户端snapdir设置配置其他名称)要创建CephFS快照,请在
.snap
下创建子目录。用你选择的名字创建快照。例如,要在目录“/1/2/3/”下创建快照,请使用mkdir /1/2/3/.snap/my-snapshot-name
命令。客户端会将请求发送到MDS服务器,然后在服务器的Server::handle_client_mksnap()中处理。它会从 SnapServer中分配一个 snapid,利用新的 SnapRealm创建并链接一个新的inode,然后将其提交到 MDlog,提交后会触发 MDCache::do_realm_invalidate_and_update_notify(),此函数将此 SnapRealm广播给所有对快照目录下任一文件有管辖权的客户端。客户端收到通知后,将同步更新本地 SanpRealm层级结构,并为新的SnapRealm结构生成新的 SnapContext,用于将快照数据写入 OSD 端。同时,快照的元数据会作为目录信息的一部分更新到OSD端(即sr_t)。整个过程是完全异步处理的。
To create a CephFS snapshot, create a subdirectory under
<span class="pre">.snap</span>
with a name of your choice. For example, to create a snapshot on directory “/1/2/3/”, invoke<span class="pre">mkdir</span><span> </span><span class="pre">/1/2/3/.snap/my-snapshot-name</span>
.This is transmitted to the MDS Server as a CEPH_MDS_OP_MKSNAP-tagged MClientRequest, and initially handled in Server::handle_client_mksnap(). It allocates a snapid from the SnapServer, projects a new inode with the new SnapRealm, and commits it to the MDLog as usual. When committed, it invokes MDCache::do_realm_invalidate_and_update_notify(), which notifies all clients with caps on files under “/1/2/3/”, about the new SnapRealm. When clients get the notifications, they update client-side SnapRealm hierarchy, link files under “/1/2/3/” to the new SnapRealm and generate a SnapContext for the new SnapRealm.
Note that this is not a synchronous part of the snapshot creation!
更新快照
如果删除快照,将执行类似的过程。如果将inode从其父SnapRealm中删除,重命名代码将为重命名的inode创建一个新的SnapRealm(如果SnapRealm不存在),将在原始父SnapRealm上有效的快照ID保存到新SnapRealm的父快照(past_parent_snaps)中,然后遵循与创建快照类似的过程。 生成 SNAPCONTEXT
RADOS SnapContext由一个快照序列ID(snapid)和一个包含所有快照ID对象组成。为了生成该列表,我们将与SnapRealm关联的SnapID与父快照中的所有有效SnapID结合起来。过时的SnapID由SnapClient缓存的有效快照过滤掉。 快照存储
文件数据存储在RADOS“self-managed”快照中。在将文件数据写入OSD时,客户端会小心地使用正确的SnapContext。 快照元数据存储
快照的dentries(及其inode)作为快照时所在目录的一部分在线存储。所有dentries都包括第一个和最后一个有效的snapid。(非快照的dentries将最后设置为CEPH_NOSNAP)。 快照写回
有大量代码可以有效地处理写回。当客户端收到MClientSnap消息时,它会更新本地SnapRealm表示及其到特定Inode的链接,并为Inode生成CapSnap。CapSnap作为功能写回的一部分被清除,如果存在脏数据,CapSnap将用于阻止新的数据写入,直到快照完全清除到OSD。 在MDS中,我们生成代表牙齿的快照,作为冲洗牙齿的常规过程的一部分。具有杰出CapSnap数据的假牙被固定并记录在日志中。 删除快照
通过在快照的根目录“.snap”中调用“rmdir”来删除快照。(尝试删除根快照将失败的目录;必须先删除快照。)一旦删除,它们将被输入到已删除快照的OSDMap列表中,文件数据将由OSD删除。当目录对象被读入并再次写回时,元数据会被清除。 硬连接
具有多个硬链接的Inode被移动到一个虚拟全局SnapRealm。虚拟SnapRealm覆盖文件系统中的所有快照。inode的数据将为任何新快照保留。这些保留的数据将覆盖inode的任何链接上的快照。 多CephFS
需要注意的是,CephFS的快照和多个文件系统的交互是存在问题的——每个 MDS集群独立分配 snappid,如果多个文件系统共享一个池,快照会冲突。如果此时有客户删除一个快照,将会导致其他人丢失数据,并且这种情况不会提升异常,这也是 CephFS的快照不推荐使用的原因之一。 实践
手动快照
创建快照: -
从挂载 cephFS 的客户端,切换到要创建快照的目录。
[root@lab-ceph1 ~]# cd /mnt/cephfs/data/.snap
[root@lab-ceph1 data/]# cd .snap
[root@lab-ceph1 .snap]# mkdir new_snap_03-02-18从快照中恢复文件:
-
从挂载 cephFS 的客户端,导航到要恢复文件的目录。
[root@lab-ceph1 ~]# cd /mnt/cephfs/data
[root@lab-ceph1 data]# cd .snap- 找到正确的快照,
[root@lab-ceph1 .snap]# cd new_snap_03-02-18 - 找到要恢复的文件
[root@lab-ceph1 new_snap_03-02-18]# cp -R {file(s)} /mnt/cephfs/data - 删除快照
[root@lab-ceph1 .snap]# cd /mnt/cephfs/data/.snap
[root@lab-ceph1 .snap]# rmdir new_snap_03-02-18自动快照
使用cephfs-snap自动创建和删除旧快照。 下载文件到 /usr/bin
[root@lab-ceph1 ~]# curl -o /usr/bin/cephfs-snap http://images.45drives.com/ceph/cephfs/cephfs-snap
[root@lab-ceph1 ~]# chmod +x /usr/bin/cephfs-snap配合cron 一起使用。{hourly,daily,weekly,monthly} 使用示例:
To take hourly snaps, and delete the old ones after 24, create a file “/etc/cron.hourly/cephfs-snap”
And place the following in the file
#!/bin/bash
cephfs-snap /mnt/cephfs/ hourly 24To take monthly snaps and delete the old ones after 12 months, create a file “/etc/cron.monthly/cephfs-snap”
And place the following in the file
#!/bin/bash
cephfs-snap /mnt/cephfs monthly 12创建的 cron 文件必须设置为可执行
[root@lab-ceph1 ~]# chmod +x /etc/cron.daily/cephfs-snap 要验证配置的 cron 任务是否会正确执行,请手动运行上述步骤中创建的 cron.* 脚本
[root@lab-ceph1 ~]# /etc/cron.daily/cephfs-snap 现在检查 .snap 目录中是否创建了 cephfs 快照
[root@lab-ceph1 ~]# ls -al /mnt/cephfs/.snap 如果 cron 没有按预期触发快照,请验证“/usr/bin/cephfs-snap”和“/etc/cron.*/cephfs-snap”文件是否可执行
参考文章: - https://docs.ceph.com/en/latest/dev/cephfs-snapshots
- https://knowledgebase.45drives.com/kb/kb450160-cephfs-snapshots/
-