Ceph RBD快照及分层(写时复制克隆)功能详解
快照
创建快照:
# rbd snap create rbd/test@snap-test
查看快照:
# rbd snap ls rbd/test
SNAPID NAME SIZE
4 snap-test 2048 MB
快照回滚:
# rbd snap rollback rbd/test@snap-test
ps: 回滚以后必须重新挂载卷
Note:把映像回滚到某一快照的意思是,用快照中的数据覆盖映像的当前版本,映像越大,此过程花费的时间就越长。从快照克隆要快于回滚到某快照,这也是回到先前状态的首选方法。
删除快照:
# rbd snap rm rbd/test@snap-test
ps: 是指删除某个特定的快照
Note:Ceph OSDs 异步地删除数据,所以删除快照后不会立即释放磁盘空间。
清除快照:
# rbd snap purge rbd/test
ps: 是指删除该rbd的所有快照
分层(写时复制克隆)
步骤:创建镜像 –> 创建快照 –> 保护快照 –> 克隆快照(多次)
保护快照
克隆映像要访问父快照。如果用户不小心删除了父快照,所有克隆映像都会损坏。为防止数据丢失,在克隆前必须先保护快照。
rbd snap protect {pool-name}/{image-name}@{snapshot-name}
例如:
rbd snap protect rbd/my-image@my-snapshot
Note:你删除不了受保护的快照。
克隆快照
克隆出的映像包含对父快照的引用,也包含存储池 ID 、映像 ID 和快照 ID 。包含存储池 ID 意味着你可以把一个存储池内的快照克隆到其他存储池。
- 映像模板: 块设备分层的一个常见用法是创建一个主映像及其快照,并作为模板以供克隆。例如,用户可以创建某一 Linux 发行版(如 Ubuntu 12.04 )的映像、并对其做快照。此用户可能会周期性地更新映像、并创建新的快照(如在 rbd snap create 之后执行 sudo apt-get update 、 sudo apt-get upgrade 、 sudo apt-get dist-upgrade )。当映像成熟时,用户可以克隆任意快照。
- 扩展模板: 更高级的用法包括扩展映像模板,来提供比基础映像更多的信息。例如,用户可以克隆一个映像(如 VM 模板)、并安装其它软件(如数据库、内容管理系统、分析系统等等),然后为此扩展映像做快照,做好的快照可以像基础映像一样进行更新。
- 模板存储池: 块设备分层的一种用法是创建一个存储池,存放作为模板的主映像和那些模板的快照。然后把只读权限分给用户,这样他们就可以克隆快照了,而无需分配此存储池的写和执行权限。
- 映像迁移/恢复: 块设备分层的一种用法是把某一存储池内的数据迁移或恢复到另一存储池。
要克隆快照,你得指定父存储池、父映像名和快照,还有子存储池和子映像名。克隆前必须先保护快照。
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
例如:
rbd clone rbd/my-image@my-snapshot rbd/new-image
Note:你可以把某个存储池中映像的快照克隆到另一存储池。例如,你可以把某一存储池中的只读映像及其快照作为模板维护,把可写克隆置于另一存储池。
取消快照保护
删除快照前,必须先取消保护。另外,你不可以删除被克隆映像引用的快照,所以在你删除快照前,必须先拍平( flatten )此快照的各个克隆。
rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
例如:
rbd snap unprotect rbd/my-image@my-snapshot
罗列快照的子孙
用下列命令罗列某个快照的子孙:
rbd children {pool-name}/{image-name}@{snapshot-name}
例如:
rbd children rbd/my-image@my-snapshot
拍平克隆映像
克隆出来的映像仍保留了对父快照的引用。要从子克隆删除这些到父快照的引用,你可以把快照的信息复制给子克隆,也就是“拍平”它。拍平克隆映像的时间随快照尺寸增大而增加。要删除快照,必须先拍平子映像。
rbd flatten {pool-name}/{image-name}
例如:
rbd flatten rbd/my-image
Note:因为拍平的映像包含了快照的所有信息,所以拍平的映像占用的存储空间会比分层克隆要大。