概述
测试 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。
最后发现在 subVolume 下,.snap 只能创建在 subVolume 名下,具体可以看下图。
如果是这样的话,鉴于 LLM 的 CephFS 集群基本都是以 subVolume 的形式来提供存储的,因此这个 Snapshot 只能做到以 subVolume 为粒度了。
另外在动态卷下的目录也进行了测试,发现这个 Snapshot 的备份的粒度,还是以这个 subVolume 为准。
计划
按照上述的测试过程,CephFS Snapshot 这个功能是可用的,那么可以考虑在某个节点或者容器上通过定期进行 subVolume 的 Snapshot 的定期创建以及定期清理。
定时任务
生产上,我们通过 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
|
参考资料
- cephfs-snapshots
- How cephfs snapshots works
- Unable to create CephFS snapshot: “Operation not permitted”
- Ceph快照详解——使用,原理与实现
- Cephfs的快照功能
- CephFS snapshots
警告
本文最后更新于 2023年9月29日,文中内容可能已过时,请谨慎参考。