Ceph块设备基础及快照、克隆操作

Ceph块设备

块是一个字节序列(例如,一个512字节的一块数据),基于块的存储接口是最常见的存储数据方法,他们基于旋转媒体,类似于硬盘、CD、软盘、甚至传统的磁带。无处不在的块设备接口使得虚拟块设备成为与Ceph这样海量存储系统交互的理想之选。

Ceph块设备是瘦接口、大小可以调整且数据被条带化存储在Ceph集群内的多个OSD上。Ceph块设备均衡多个RADOS的能力,快照、复制和一致性,Ceph的RADOS块设备用内核模块或librbd库与各个OSD交互。

ceph-block-rados-2020-08-03

Ceph 块设备靠无限伸缩性提供了高性能,如向内核模块、或向 abbr:KVM (kernel virtual machines) (如 QEMU 、依赖 libvirt 和 QEMU 的 OpenStack 和 CloudStack 云计算系统都可与 Ceph 块设备集成)。可以用同一个集群同时运营 Ceph RADOS 网关、 CephFS 文件系统、和 Ceph 块设备。

块设备的基本操作

rbd命令可以用于创建、罗列、自检和删除块设备的映像。当然也可以对映像进行克隆、创建快照并支持回滚等。

创建一个块设备存储池

在管理节点上,用ceph命令创建一个Pool池。了解更多关于Pool池可以访问OSD与Pool池的常见操作及管理

ceph osd pool create rbd 64 64

成功创建一个Pool后使用rbd工具再对这个Pool池进行初始化用于RBD。

rbd pool init <pool-name>

此处将新创建的rbdPool池进行初始化

注意:在接下来使用rbd的命令时如果需要填写<pool-name>参数的地方为空没有填写,那么默认会查找Pool池名为rbd并使用它。

创建块设备用户(非必须)

如果不指定用户的话,使用rbd命令会默认使用admin管理员访问Ceph集群,admin的用户权限最大,不应该分配给其他机器。所以最好创建一个权限尽可能小的用户访问块设备池。

1
2
3
osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]'

osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]'

如果要了解更多Ceph用户有关信息,可以访问阅读Ceph用户管理

创建块设备映像

如果想要将块设备添加到某一节点,你需要先在Pool中创建一个映像文件。

rbd create --size {megabytes} {pool-name}/{image-name}

例如,在rbd这个Pool池中创建一个名为42team-webnode.img,大小为20G的一个映像:

rbd create --size 20G --pool rbd --image 42team-webnode.img

罗列磁盘映像

要罗列rbdPool存储池中的全部映像,使用下面的命令:

rbd ls {poolname}

{poolname}如果不填写,则默认使用rbd存储池。

检索映像信息

使用下面的命令来检索某一个映像的信息:

rbd info {pool-name}/{image-name}

{poolname}如果不填写,则默认使用rbd存储池。

rbd info rbd/42team-webnode.img

返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@vm1 ~]# rbd info rbd/42team-webnode.img
rbd image '42team-webnode.img':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 17382bc345839
block_name_prefix: rbd_data.17382bc345839
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Aug 3 11:03:56 2020
access_timestamp: Mon Aug 3 11:03:56 2020
modify_timestamp: Mon Aug 3 11:03:56 2020

调整块设备映像大小

Ceph块设备是瘦接口设备,只有真正写入了数据后才开始占据物理空间,直到限制到它最大的存储大小,他们的最大存储容量就是设置的--size选项的值。如果需要增加或减少Ceph块设备的存储最大尺寸,使用下面的命令:

缩小映像最大尺寸

如果要缩小块设备的映像最大存储尺寸,需要添加--allow-shrink选项,才允许缩小映像尺寸。

rbd resize -p rbd --image 42team-webnode.img -s 5G --allow-shrink

如果已使用的存储尺寸大于要缩减之后的尺寸,强行缩减块设备映像尺寸会导致数据丢失!

扩大映像最大尺寸

rbd resize -p rbd --image 42team-webnode.img -s 25G

删除块设备映像

你可以直接将块设备中的映像删除,或者先将他们移动到垃圾桶中,等待一段时间删除或者手动进行清理。

直接删除块设备映像

rbd rm {pool-name}/{image-name}

rbd rm 42team-webnode.img

{poolname}如果不填写,则默认使用rbd存储池。

延期删除映像

延期删除可以现将要删除的映像存放到垃圾池中,即便他有快照或者正被克隆的镜像引用者也可以被放入到垃圾桶池中,但是不能将他们从垃圾池中删掉。

你可以用 –expires-at 设置延期时间(默认为 now ),并且,它的延期时间没到的话是不能删除的,除非你用 –force 选项。

rbd trash mv {pool-name}/{image-name}

rbd trash mv rbd/42team-webnode.img

rbd trash mv restore-42team-webnode.img --expires-at "20200805"

之后可以通过rbd trash ls --long查看放入到垃圾池的映像有哪些,如果设立日期保护的话还可以看到保护到期的时间。

还原块设备映像

当你突然醒悟不该放弃某个映像时,你当然可以从垃圾池中将映像还原!但是前提时你将它放入到了垃圾池而不是直接删除掉他们。

rbd trash restore {pool-name}/{image-id}

在还原映像时需要使用image-id进行还原。可以使用rbd trash ls查看image映像id。

1
2
3
[root@vm1 ~]# rbd trash ls
17382bc345839 42team-webnode.img
[root@vm1 ~]#

rbd trash restore 17382bc345839 --image restore-42team-webnode.img

在还原的同时,还可以指定--image选项对垃圾池内的映像重命名。

彻底删除在垃圾池中的映像

rbd trash rm {pool-name}/{image-id}

使用rbd trash rm命令可以将在垃圾池中的映像彻底删除,如果你设置了延期时间–expires-at ,那么没到延期时间内直接删除是不可以的,除非使用 –force 选项强制删除。

拍摄镜像快照

快照是某映像在一个特定时间点的一份只读副本。Ceph块设备的一个高级功能是可以为映像创建快照来保留历史。Ceph也支持分层快照,这样可以更快速的的克隆一个映像(如VM映像)。Ceph的快照功能还支持rbd命令和多种高级接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack

因为RBD不关心文件系统,如果没有与map挂载着的计算机协调的话,快照就是crash-consistent的。所以,在拍摄快照前应该将这个映像的I/O操作暂停,如果这个映像还包含文件系统,在拍摄这个包含文件系统的映像前系统还必须处于一致性状态,否则就要用fsck来修复它了…

可以使用fsfreeze命令冻结I/O。对于虚拟机来说,qemu-guest-agent 可在创建快照时自动冻结文件系统。

ceph-snap-ins-2020-08-06

快速操作快照

接下来的过程演示了如何用 rbd 命令创建、罗列、和删除快照。

创建快照

rbd snap create命令创建快照,需要声明存储池名和映像名。

rbd snap create {pool-name}/{image-name}@{snap-name}

如为rbd/5G.img拍摄快照:

rbd snap create 5G.img@2008050810

罗列快照

要列出某一个映像的快照,需要指定存储池名和映像名。

rbd snap ls {pool-name}/{image-name}

例如:

rbd snap ls 5G.img

1
2
3
[root@vm1 ~]# rbd snap ls 5G.img
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 2008050810 5 GiB Wed Aug 5 08:10:55 2020

回滚快照

要用rbd回滚到某一快照,使用rbd snap rollback命令。回滚快照时要求该映像不能处于map状态!不应该有任何资源占用这个映像。

rbd snap rollback {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rollback 5G.img@2008050810

把映像回滚到一快照的意思是,用快照中的数据覆盖映像的当前版本,此过程花费的时间随映像尺寸增长。从快照克隆要快于回滚到某快照。这也是回到先前状态的首选方法。

删除快照

删除某映像的一个快照

使用rbd snap rm命令删除某一映像的快照:

rbd snap rm rbd/5G.img@2008050810

删除后可以再查看一下当前快照,检查是否成功删除:

rbd snap ls rbd/5G.img

删除某映像的全部快照

当你要删除一个映像的全部快照时,使用rbd snap purge命令:

rbd snap purge {pool-name}/{image-name}

rbd snap purge rbd/5G.img

克隆快照映像

可以克隆一个映像,在原有映像基础之上建立新的分支。不过需要了解分层的概念,想要克隆一个快照必须先创建快照,并且将其保护,之后才能克隆快照。

了解分层

ceph-clone-2020-08-06

Ceph 块设备的分层是个简单的过程。你必须有个映像、必须为它创建快照、必须保护快照,执行过这些步骤后,你才能克隆快照。

克隆出的映像包含到父快照的饮用、存储池ID、映像ID和快照ID。包含存储池ID意味着你可以把存储池内的快照克隆到别的存储池中。

分层可以应用于以下方面:

  • 映像模版:块设备分层的一个常见用法是创建一个主映像及其快照,并作为模版以供克隆。例如管理员会创建一个Linux发行版的映像,之后周期性的升级维护(比如执行了dnf update操作之后等)。等映像文件稳定可用后,用户可以克隆任意快照。
  • 拓展模板:更高级的用法包括拓展映像模板,让它包含比基础映像更多的信息。例如,首先可以克隆一个基础映像,然后再此基础之上安装新的软件包(如数据库、博客平台、内容管理系统等),之后在此拓展上再次创建快照,拍下的快照可以像基础映像一样更新。
  • 模版存储池:块设备分层的一种用法是创建一个存储池,其中包含作为模版的主映像和那些模版快照。然后把只读权限分给用户,这样他们就可以克隆快照了,而无需分配此存储池内的写和执行权限。
  • 映像迁移/恢复:块设备分层的一种用法是把以存储池内的数据迁移或恢复到另一个存储池。

保护快照

克隆的映像要访问父快照。如果那个用户不小心删除掉了父快照,那么所有依赖这个父快照的克隆映像都会损坏。为了防止数据丢失,必须先保护快照,然后再当作父快照进行克隆。

rbd snap protect {pool-name}/{image-name}@{snapshot-name}

如下:

rbd snap protect 5G.img@202008051308

之后查看该映像的所有快照:

rbd snap ls 5G.img

1
2
3
4
5
[root@vm1 ~]# rbd snap ls 5G.img
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 202008051308 5 GiB yes Wed Aug 5 13:08:03 2020
11 202008051309 5 GiB Wed Aug 5 13:08:05 2020
12 2020080513010 5 GiB Wed Aug 5 13:08:10 2020

可以看到刚刚被保护的快照,在此处有了标记,接下来尝试能否删除这个快照:

rbd snap rm 5G.img@202008051308

ceph-snap-protect-rm-2020-08-06

结果显而易见,当快照被保护的情况下是不允许被删除的。这样我们就可以在这个快照的基础上进行克隆全新的映像!

克隆映像快照

要克隆快照,你得指定父存储池、映像、和快照,还有子存储池和映像名。克隆前必须先保护快照,否则不允许克隆。

rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

例如克隆我们刚刚保护的那个快照,并且把克隆后的映像叫做5G_new.img:

rbd clone 5G.img@202008051308 rbd/5G_new.img

你可以把一存储池中的映像的快照克隆到另一个存储池。例如,你可以把一存储池中的只读映像及快照当作模版进行维护,之后(比如映像调试完毕后)可以将其克隆到另一个存储池中进行发布使用。

现在,可以查看以下刚刚克隆的新映像的信息:

rbd ls --long

rbd info 5G_new.img

ceph-clone-ls-2020-08-06
ceph-clone-rbd-info-2020-08-06

罗列快照的后代

rbd children {pool-name}/{image-name}[@{snapshot-name}]

例如:

rbd children rbd/5G.img

取消快照保护

删除快照前,必须先需要快照保护。另外如果有其他的子映像使用着这个快照,那么你不能删除这个快照。除非你将引用这个快照的子映像执行拍平的操作。

rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

无法取消保护一个被克隆的子映像使用的快照,除非你将克隆后的映像拍平。
ceph-snap-unprotect-1-2020-08-06

拍平克隆的映像

克隆的映像一直保留着对父快照的引用,所以你无法取消保护一个被引用的父快照。如果你要从子克隆删除到父快照的这些引用,你可以把引用的父快照信息完整的复制到子克隆中,也就是拍平它。拍平克隆品的时间因快照尺寸而不同,要删除快照或者取消保护快照,必须将子映像拍平。

rbd flatten {pool-name}/{image-name}

例如:

rbd flatten rbd/5G_new.img

拍平子映像后,就不会再引用父快照的信息了。此时,你可以将父快照解除保护并删除。