目录

测试CephFS的Snapshot功能

概述

测试 CephFS 的 Snapshot 功能,为 LLM 集群的 CephFS 集群提供备份容错的能力。

环境

在测试节点上操作,因为刚好在这个节点上挂载了 LLM 和备份 CephFS 的集群,可以做一些测试和验证(生产环境下谨慎操作)。

1
2
3
# df -h的截取结果
10.214.166.21:6789,10.214.228.25:6789,10.214.230.21:6789:/     512T  105T  408T  21% /ceph2
ceph-fuse                                                      524T  8.6T  516T   2% /ceph-bak

测试

下面将按照 How cephfs snapshots works 中的流程,在备份集群进行一次测试。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 测试目录
cd /ceph-bak/llm-snapshot-test
# 创建一个文件
touch test01
# 创建Snapshot
mkdir .snap/snapshot01
# 查看文件,可以看到test01的存在
ls .snap/snapshot01/
# 创建第二个文件
touch test02
# 创建新的Snapshot
mkdir .snap/snapshot02
# 查看文件,可以看到test01和test02的存在
ls .snap/snapshot02/
# 删除test01
rm -rf test01
# 创建新的Snapshot
mkdir .snap/snapshot03
# 查看文件,可以看到test02的存在,test01已经被删除
ls .snap/snapshot03/
# 从snapshot02恢复文件test01
cp .snap/snapshot02/test01 .
# 删除备份
rmdir .snap/snapshot01

问题

测试过程中发现在某些目录的 .snap 下无法创建 Snapshot。

/%E6%B5%8B%E8%AF%95cephfs%E7%9A%84snapshot%E5%8A%9F%E8%83%BD/img.png

最后发现在 subVolume 下,.snap 只能创建在 subVolume 名下,具体可以看下图。

/%E6%B5%8B%E8%AF%95cephfs%E7%9A%84snapshot%E5%8A%9F%E8%83%BD/img_1.png

如果是这样的话,鉴于 LLM 的 CephFS 集群基本都是以 subVolume 的形式来提供存储的,因此这个 Snapshot 只能做到以 subVolume 为粒度了。

另外在动态卷下的目录也进行了测试,发现这个 Snapshot 的备份的粒度,还是以这个 subVolume 为准。

/%E6%B5%8B%E8%AF%95cephfs%E7%9A%84snapshot%E5%8A%9F%E8%83%BD/img_2.png

计划

按照上述的测试过程,CephFS Snapshot 这个功能是可用的,那么可以考虑在某个节点或者容器上通过定期进行 subVolume 的 Snapshot 的定期创建以及定期清理。

/%E6%B5%8B%E8%AF%95cephfs%E7%9A%84snapshot%E5%8A%9F%E8%83%BD/img_3.png

定时任务

生产上,我们通过 Argo Workflow 来定时创建备份,下面是执行创建备份的脚本,每天定时创建 snapshot,7天轮替。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh
set -x

# 进入需要备份的目录
cd /ceph-bak/volumes/corpusGroup/corpusSubVolume/8ef15cf6-19ab-4658-8a32-34ae6e6bf55b

# 获取当前日期(格式为YYYY-MM-DD)
current_date=$(date +%Y-%m-%d)

# 创建以当前日期命名的文件夹
mkdir -p .snap/snapshot-$current_date

# 检查文件夹是否成功创建
if [ $? -eq 0 ]; then
  echo "成功创建文件夹 .snap/snapshot-$current_date"
else
  echo "无法创建文件夹 .snap/snapshot-$current_date"
  exit 1
fi

# 将当前日期转换为时间戳
current_timestamp=$(date -d $current_date +%s)

# 计算七天前的时间戳
seven_days_ago_timestamp=$(expr $current_timestamp - 7 \* 24 \* 60 \* 60)

# 将七天前的时间戳转换为日期
seven_days_ago=$(date -d @$seven_days_ago_timestamp +%Y-%m-%d)

# 删除7天前的文件夹
if [ -d .snap/snapshot-$seven_days_ago ]; then
  rmdir .snap/snapshot-$seven_days_ago
  
  # 检查文件夹是否成功删除
  if [ $? -eq 0 ]; then
    echo "成功删除文件夹 .snap/snapshot-$seven_days_ago"
  else
    echo "无法删除文件夹 .snap/snapshot-$seven_days_ago"
    exit 1
  fi
else
  echo "文件夹 .snap/snapshot-$seven_days_ago 不存在"
fi

参考资料

  1. cephfs-snapshots
  2. How cephfs snapshots works
  3. Unable to create CephFS snapshot: “Operation not permitted”
  4. Ceph快照详解——使用,原理与实现
  5. Cephfs的快照功能
  6. CephFS snapshots
警告
本文最后更新于 2023年9月29日,文中内容可能已过时,请谨慎参考。