前言
本博客是Ceph官方文档操作手册的实践记录,本章节操作手册。
快照基础
以下分别为rbd 命令创建、罗列、和删除快照。
创建快照
用 rbd 命令创建快照,要指定 snap create 选项、存储池名和映像名。
# rbd snap create {pool-name}/{image-name}@{snap-name}
$ rbd snap create swimmingpool/bar@snap_bar
罗列快照
列出某个映像的快照,需要指定存储池名和映像名。
# rbd snap ls {pool-name}/{image-name}
$ rbd snap ls swimmingpool/bar
SNAPID NAME SIZE TIMESTAMP
4 snap_bar 1 GiB Tue Apr 14 19:25:19 2020
回滚快照
用 rbd 命令回滚到某一快照,指定 snap rollback 选项、存储池名、映像名和快照名。
rbd snap rollback {pool-name}/{image-name}@{snap-name}
$ rbd snap rollback swimmingpool/bar@snap_bar
Rolling back to snapshot: 100% complete...done.
删除快照
要用 rbd 删除一快照,指定 snap rm 选项、存储池名、映像名和快照名。
# rbd snap rm {pool-name}/{image-name}@{snap-name}
# 查看当前快照信息
$ rbd snap list swimmingpool/bar
SNAPID NAME SIZE TIMESTAMP
4 snap-bar 1 GiB Tue Apr 14 23:51:35 2020
# 删除snap-bar快照
$ rbd snap rm swimmingpool/bar@snap-bar
Removing snap: 100% complete...done.
清除快照
要用 rbd 删除某个映像的所有快照,指定 snap purge 选项、存储池名和映像名。
# rbd snap purge {pool-name}/{image-name}
# 查看当前快照信息
$ rbd snap list swimmingpool/bar
SNAPID NAME SIZE TIMESTAMP
6 snap01-bar 1 GiB Wed Apr 15 00:03:50 2020
7 snap02-bar 1 GiB Wed Apr 15 00:03:54 2020
8 snap03-bar 1 GiB Wed Apr 15 00:03:57 2020
# 清空所有快照信息
$ rbd snap purge swimmingpool/bar
Removing all snapshots: 100% complete...done.
# 查看当前映像bar中的快照信息
$ rbd snap list swimmingpool/bar
分层
保护快照
克隆映像要访问父快照。如果用户不小心删除了父快照,所有克隆映像都会损坏。为防止数据丢失,在克隆前必须先保护快照。
# 创建保护快照
# rbd snap protect {pool-name}/{image-name}@{snapshot-name}
# 在swimmingpool/bar@snap-bar的基础上创建保护快照
$ rbd snap protect swimmingpool/bar@snap-bar
# 保护快照不可以被删除
$ rbd snap remove swimmingpool/bar@snap-bar
Removing snap: 0% complete...failed.
rbd: snapshot 'snap-bar' is protected from removal.
2020-04-15 09:30:04.885 7f546b7a1840 -1 librbd::Operations: snapshot is protected
克隆快照
要克隆快照,你得指定父存储池、父映像名和快照,还有子存储池和子映像名。克隆前必须先保护快照。
# 在快照的基础上创建克隆
# rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
# 在快照swimmingpool/bar@snap-bar的基础上,创建swimmingpool/clone-bar
$ rbd clone swimmingpool/bar@snap-bar swimmingpool/clone-bar
取消快照保护
删除快照前,必须先取消保护。另外,你不可以删除被克隆映像引用的快照,所以在你删除快照前,必须先拍平( flatten )此快照的各个克隆。
# rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
$ rbd snap unprotect swimmingpool/bar@snap-bar
罗列快照的子孙
# rbd children {pool-name}/{image-name}@{snapshot-name}
rbd -p swimmingpool children bar@snap-bar
拍平克隆映像
克隆出来的映像仍保留了对父快照的引用。要从子克隆删除这些到父快照的引用,你可以把快照的信息复制给子克隆,也就是“拍平”它。拍平克隆映像的时间随快照尺寸增大而增加。要删除快照,必须先拍平子映像。
# rbd flatten {pool-name}/{image-name}
$ rbd flatten children-swimmingpool/clone-bar
Image flatten: 100% complete...done.
Note 因为拍平的映像包含了快照的所有信息,所以拍平的映像占用的存储空间会比分层克隆要大。
实验模拟
回滚实验
# 具体的挂载方式,可看上一个博客[链接地址](https://blog.youkuaiyun.com/u012720518/article/details/105517304)
# 1. 在挂载点目录下创建一个test文件
$ cat /mnt/zzm/test.txt
hello world
# 2. 创建一个快照
$ rbd snap create swimmingpool/bar@snap-bar
# 3. 删除挂载点下的test文件
$ rm -rf /mnt/zzm/test.txt
# 4. 卸载挂载点,放置有IO操作
$ umount /mnt/zzm
# 5. 回滚快照
$ rbd snap rollback swimmingpool/bar@snap-bar
# 6. 重新挂载挂载目录
$ mount /dev/rbd1 /mnt/zzm
# 7. 查看/mnt/zzm目录下文件是否恢复
$ ls /mnt/zzm/
test.txt
文件成功恢复!
克隆实验
# 0. swimmingpool/bar 映射的内核块/dev/rbd0下的文件
$ ls /mnt/zzm/
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 test.txt
# 1. 创建一个存储池children-swimmingpool
$ rbd osd pool create children-swimmingpool 128 128
# 2. 创建映像swimmingpool/bar的快照
$ rbd snap create swimmingpool/bar@snap-bar
# 3. 将快照swimmingpool/bar@snap-bar设置为保护快照
$ rbd snap protect swimmingpool/bar@snap-bar
# 4. 根据swimmingpool/bar@snap-bar创建children-swimmingpool的克隆映像
$ rbd snap clone swimmingpool/bar@snap-bar children-swimmingpool/clone-bar
# 如果不设置protect, 就创建克隆会出现如下错误提示
$ rbd clone swimmingpool/bar@snap01-bar swimmingpool/unprotect-bar
2020-04-15 09:49:31.357 7f8b25a45840 -1 librbd::image::CloneRequest: parent snapshot must be protected
rbd: clone error: (22) Invalid argument
# 5. 将映像children-swimmingpool/clone-bar映射到内核中
$ rbd map children-swimmingpool/clone-bar
# 6. 挂载目录/mnt/clone-zzm到/dev/rbd1上
$ umount /mnt/zzm # /mnt/clone-zzm是/mnt/zzm的克隆,此时二者的UUID相同,需要卸载/mnt/zzm
$ mount /dev/rbd1 /mnt/clone-zzm
# 7. 查看/mnt/clone-zzm的信息
$ ls /mnt/clone-zzm/
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 test.txt
信息完全一致,成功!
删除存在克隆的快照
克隆出来的映像仍保留了对父快照的引用。要从子克隆删除这些到父快照的引用,可以把快照的信息复制给子克隆,也就是“拍平”它。拍平克隆映像的时间随快照尺寸增大而增加。要删除快照,必须先拍平子映像。
# 1. children-swimmingpool/clone-bar是swimmingpool/bar的克隆,swimmingpool的快照是swimmingpool/bar@snap-bar
$ rados lspools
swimmingpool
children-swimmingpool
$ rbd snap list swimmingpool/bar
SNAPID NAME SIZE TIMESTAMP
14 snap-bar 1 GiB Wed Apr 15 09:25:48 2020
# 2. 查看快照的孩子信息
# rbd -p {pool-name} children {image-name}/{snap-name}
$ rbd -p swimmingpool children bar@snap-bar
# 3. children-swimmingpool/clone-bar存在父快照swimmingpool/bar@snap-bar的引用,所以先拍平克隆和快照
# rbd flatten {pool-name}/{image-name}
$ rbd flatten children-swimmingpool/clone-bar
Image flatten: 100% complete...done.
# 4. 解除快照swimmingpool/bar@snap-bar的protected的状态
$ rbd snap unprotect swimmingpool/bar@snap-bar
# 5. 移出快照
$ rbd snap remove swimmingpool/bar@snap-bar
Removing snap: 100% complete...done.
# 6. 查看此前的克隆块存储信息
$ ls /mnt/clone-zzm/
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 test.txt
信息没有受影响,成功!