1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

RBD 快照概述

RBD 快照是创建于特定时间的 RBD 镜像的只读副本。RBD 快照使用 COW 技术来最大程度减少维护快照所需的存储空间。在将写入 I/O 请求应用到 RBD 快照镜像前,集群会将原始数据复制到 I/O 操作所影响对象的 PG 中的另一区域。快照在创建时不会占用存储空间,但会随着所包含对象的变化而增大。RBD 镜像支持增量快照

从下图看,RBD的快照并不会占用太大的空间

COW图示

在拍摄快照前,使用 fsfreeze 命令暂停对文件系统的访问。fsfreeze 命令可以停止对文件系统的访问并在磁盘上创建稳定的镜像。不要在文件系统未冻结时拍摄文件系统快照,因为这样会损坏快照的文件系统。拍摄快照后,使用 fsfreeze 命令可恢复文件系统操作和访问。

创建快照

现在Ceph的镜像默认是版本2,支持layering快照克隆

创建Ceph设备的快照,给rbdpool中的test创建一个名为snap1的快照

先冻结文件系统访问,然后拍摄快照,然后再解除冻结

1
2
3
4
5
6
7
[root@clienta ~]# fsfreeze --freeze /mnt
[root@clienta ~]# rbd snap create rbdpool/test@snap1
Creating snap: 100% complete...done.
[root@clienta ~]# rbd snap ls rbdpool/test
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 snap1 10 GiB Wed Aug 7 03:47:49 2024
[root@clienta ~]# fsfreeze --unfreeze /mnt

恢复数据

先把数据删除,然后挂载测试恢复后数据是否回来

1
2
3
4
5
6
7
8
[root@clienta ~]# ls /mnt
test.data
[root@clienta ~]# rm -rf /mnt/*
[root@clienta ~]# ls /mnt/
[root@clienta ~]# umount /mnt
[root@clienta ~]# rbd unmap rbdpool/test
[root@clienta ~]# rbd snap rollback rbdpool/test@snap1
Rolling back to snapshot: 100% complete...done.

挂载后发现数据已经恢复成功

1
2
3
4
5
[root@clienta ~]# rbd map rbdpool/test
/dev/rbd0
[root@clienta ~]# mount /dev/rbd0 /mnt/
[root@clienta ~]# ls /mnt/
test.data

删除快照

1
2
[root@clienta ~]# rbd snap rm rbdpool/test@snap1
Removing snap: 100% complete...done.

一个一个删除麻烦,如果需要,可以一起清空

1
2
[root@clienta ~]# rbd snap purge rbdpool/test
Removing all snapshots: 100% complete...done.

克隆与快照技术对比

快照就是针对RBD某个时间点状态的复制,以后出了问题,可以回到那个时间点,这么说来,快照是只读的,而克隆一般是基于某个快照,默认启用的是写时复制技术,克隆可以看做是一个可读可写的RBD镜像,其创建之初,并不占用任何物理空间,你在写入或修改某些东西时,从其基于的快照复制过来,然后修改并保存,此时才占用空间,当然,也可以用命令直接斩断其和上级的关系,成为一个独立的RBD镜像,此时会把所有缺失的内容从上级拷贝过来。

克隆支持 COW 和 COR,默认为 COW

创建克隆

创建克隆一般有三个步骤

  1. 创建快照

  2. 保护快照不被删除

  3. 创建克隆

我们重新创建名为snap1的快照,基于它,我们创建一个clone1的克隆

1
2
3
4
5
6
7
[root@clienta ~]# touch /mnt/lxh
[root@clienta ~]# ls /mnt
lxh
[root@clienta ~]# fsfreeze --freeze /mnt
[root@clienta ~]# rbd snap create rbdpool/test@snap1
Creating snap: 100% complete...done.
[root@clienta ~]# fsfreeze --unfreeze /mnt
1
2
3
4
5
[root@clienta ~]# rbd snap protect rbdpool/test@snap1
[root@clienta ~]# rbd clone rbdpool/test@snap1 rbdpool/clone1
[root@clienta ~]# rbd ls -p rbdpool
clone1
test

查询快照占用的空间,我们发现其实际上没有占用空间

1
2
3
4
5
6
[root@clienta ~]# rbd disk-usage -p rbdpool
NAME PROVISIONED USED
clone1 10 GiB 0 B
test@snap1 10 GiB 1.1 GiB
test 10 GiB 1.1 GiB
<TOTAL> 20 GiB 2.1 GiB

我们可以用info来看到它的父级关系

parent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@clienta ~]# rbd info rbdpool/clone1
rbd image 'clone1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: faade2ee4808
block_name_prefix: rbd_data.faade2ee4808
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Aug 7 04:01:15 2024
access_timestamp: Wed Aug 7 04:01:15 2024
modify_timestamp: Wed Aug 7 04:01:15 2024
parent: rbdpool/test@snap1
overlap: 10 GiB

使用克隆

我们将克隆映射到客户端本地,完成读写验证,并确认其磁盘占用空间变大

要挂克隆到本地,你需要卸载前面挂载的数据卷,挂载克隆后,我们发现其数据还在

1
2
3
4
5
6
7
[root@clienta ~]# umount /mnt
[root@clienta ~]# ls /mnt
[root@clienta ~]# rbd map rbdpool/clone1
/dev/rbd1
[root@clienta ~]# mount /dev/rbd1 /mnt
[root@clienta ~]# ls /mnt
lxh
1
2
3
4
5
6
[root@client ~]# rbd disk-usage -p rbdpool
NAME PROVISIONED USED
clone1 500 MiB 12 MiB
test@snap1 500 MiB 136 MiB
test 500 MiB 476 MiB
<TOTAL> 1000 MiB 624 MiB

扁平化克隆

将数据从快照中合并到我们的克隆在扁平化克隆时,Ceph 会将所有缺失的数据从父级复制到克隆,然后移除对父级的引用。克隆会变成独立的 RBD 镜像,不再是受保护快照的子级。

1
2
3
4
5
6
7
8
[root@clienta ~]# rbd flatten rbdpool/clone1
Image flatten: 100% complete...done.
[root@clienta ~]# rbd disk-usage -p rbdpool
NAME PROVISIONED USED
clone1 10 GiB 660 MiB
test@snap1 10 GiB 1.1 GiB
test 10 GiB 1.1 GiB
<TOTAL> 20 GiB 2.8 GiB

此时再看,就发现已经不再存在父级关系,成为了独立的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@clienta ~]# rbd info rbdpool/clone1
rbd image 'clone1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: fac9611f2d3
block_name_prefix: rbd_data.fac9611f2d3
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Aug 7 04:07:12 2024
access_timestamp: Wed Aug 7 04:07:12 2024
modify_timestamp: Wed Aug 7 04:07:12 2024