块是一个字节序列(例如,一个 512 字节的数据块)。基于块的存储接口是最常见的存储数据方法,它们基于旋转介质,像硬盘、 CD 、软盘、甚至传统的 9 磁道磁带。无处不在的块设备接口使虚拟块设备成为与 Ceph 这样的海量存储系统交互的理想之选。
Ceph 块设备是精简配置的、大小可调且将数据条带化存储到集群内的多个 OSD 。 Ceph 块设备利用 RADOS 的多种能力,如快照、复制和一致性。 Ceph 的 RADOS 块设备( RBD )使用内核模块或 librbd 库与 OSD 交互。
注意:内核模块可使用 Linux 页缓存。对基于 librbd 的应用程序, Ceph 可提供 RBD 缓存
Ceph 块设备靠无限伸缩性提供了高性能,如向内核模块、或向 abbr:KVM (kernel virtual machines) (如 Qemu 、 OpenStack 和 CloudStack 等云计算系统通过 libvirt 和 Qemu 可与 Ceph 块设备集成)。你可以用同一个集群同时运行 Ceph RADOS 网关、 Ceph FS 文件系统、和 Ceph 块设备。
注意:要使用 Ceph 块设备,你必须有一个在运行的 Ceph 集群。
一、块设备命令
rbd 命令可用于创建、罗列、内省和删除块设备映像,也可克隆映像、创建快照、回滚快照、查看快照等等。 rbd 命令用法详情见 RBD – 管理 RADOS 块设备映像。
Important
要使用 Ceph 块设备命令,你必须有对应集群的访问权限。
创建块设备映像
要想把块设备加入某节点,你得先在 Ceph 存储集群中创建一个映像,使用下列命令:
rbd create --size {megabytes} {pool-name}/{image-name}
例如,要在 swimmingpool 这个存储池中创建一个名为 bar 、大小为 1GB 的映像,执行:
rbd create --size 1024 swimmingpool/bar
如果创建映像时不指定存储池,它将使用默认的 rbd 存储池。例如,下面的命令将默认在 rbd 存储池中创建一个大小为 1GB 、名为 foo 的映像:
rbd create --size 1024 foo
指定此存储池前必须先创建它,详情见存储池。
罗列块设备映像
要列出 rbd 存储池中的块设备,可以用下列命令(即 rbd 是默认存储池名字):
rbd ls
用下列命令罗列某个特定存储池中的块设备,用存储池的名字替换 {poolname} :
rbd ls {poolname} 例如: rbd ls swimmingpool
检索映像信息
用下列命令检索某个特定映像的信息,用映像名字替换 {image-name} :
rbd info {image-name} 例如: rbd info foo
用下列命令检索某存储池内的映像的信息,用映像名字替换 {image-name} 、用存储池名字替换 {pool-name} :
rbd info {pool-name}/{image-name} 例如: rbd info swimmingpool/bar
调整块设备映像大小
Ceph 块设备映像是精简配置,只有在你开始写入数据时它们才会占用物理空间。然而,它们都有最大容量,就是你设置的 --size 选项。如果你想增加(或减小) Ceph 块设备映像的最大尺寸,执行下列命令:
rbd resize --size 2048 foo (to increase) rbd resize --size 2048 foo --allow-shrink (to decrease)
删除块设备映像
可用下列命令删除块设备,用映像名字替换 {image-name} :
rbd rm {image-name} 例如: rbd rm foo
用下列命令从某存储池中删除一个块设备,用要删除的映像名字替换 {image-name} 、用存储池名字替换 {pool-name} :
rbd rm {pool-name}/{image-name} 例如: rbd rm swimmingpool/bar
二、内核模块
要用内核模块操作,必须有一个在运行的 Ceph 集群。
获取映像列表
要挂载块设备映像,先罗列出所有的映像。
rbd list
映射块设备
用 rbd 把映像名映射为内核模块。必须指定映像名、存储池名、和用户名。若 RBD 内核模块尚未加载, rbd 命令会自动加载。
sudo rbd map {pool-name}/{image-name} --id {user-name} 例如: sudo rbd map rbd/myimage --id admin
如果你启用了 cephx 认证,还必须提供密钥,可以用密钥环或密钥文件指定密钥。
sudo rbd map rbd/myimage --id admin --keyring /path/to/keyring sudo rbd map rbd/myimage --id admin --keyfile /path/to/file
查看已映射块设备
可以用 rbd 命令的 showmapped 选项查看映射为内核模块的块设备映像。
rbd showmapped
取消块设备映射
要取消块设备映射,用 rbd 命令、指定 unmap 选项和设备名(即为方便起见使用的同名块设备映像)。
sudo rbd unmap /dev/rbd/{poolname}/{imagename}
例如:
sudo rbd unmap /dev/rbd/rbd/foo
三、快照
快照是映像在某个特定时间点的一份只读副本。 Ceph 块设备的一个高级特性就是你可以为映像创建快照来保留其历史。 Ceph 还支持分层快照,让你快速、简便地克隆映像(如 VM 映像)。 Ceph 的快照功能支持 rbd 命令和多种高级接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack 。
注意:要使用 RBD 快照功能,你必须有一个在运行的 Ceph 集群。
笔记:
如果在做快照时映像仍在进行 I/O 操作,快照可能就获取不到该映像准确的或最新的数据,并且该快照可能不得不被克隆到一个新的可挂载的映像中。
所以,我们建议在做快照前先停止 I/O 操作。如果映像内包含文件系统,在做快照前请确保文件系统处于一致的状态。
要停止 I/O 操作可以使用 fsfreeze 命令。详情可参考 fsfreeze(8) 手册页。对于虚拟机,qemu-guest-agent 被用来在做快照时自动冻结文件系统。
Cephx 注意事项
启用了 cephx 时(默认的),你必须指定用户名或 ID 、及其对应的密钥文件,详情见用户管理。你也可以用 CEPH_ARGS 环境变量来避免重复输入下列参数。
rbd --id {user-ID} --keyring=/path/to/secret [commands] rbd --name {username} --keyring=/path/to/secret [commands] 例如: rbd --id admin --keyring=/etc/ceph/ceph.keyring [commands] rbd --name client.admin --keyring=/etc/ceph/ceph.keyring [commands]
注意:把用户名和密钥写入 CEPH_ARGS 环境变量,这样就无需每次手动输入。
快照基础
下列过程演示了如何用 rbd 命令创建、罗列、和删除快照。
创建快照
用 rbd 命令创建快照,要指定 snap create 选项、存储池名和映像名。
rbd snap create {pool-name}/{image-name}@{snap-name} 例如: rbd snap create rbd/[email protected]
罗列快照
列出某个映像的快照,需要指定存储池名和映像名。
rbd snap ls {pool-name}/{image-name} 例如: rbd snap ls rbd/foo
回滚快照
用 rbd 命令回滚到某一快照,指定 snap rollback 选项、存储池名、映像名和快照名。
rbd snap rollback {pool-name}/{image-name}@{snap-name} 例如: rbd snap rollback rbd/[email protected]
把映像回滚到某一快照的意思是,用快照中的数据覆盖映像的当前版本,映像越大,此过程花费的时间就越长。从快照克隆要快于回滚到某快照,这也是回到先前状态的首选方法。
删除快照
要用 rbd 删除一快照,指定 snap rm 选项、存储池名、映像名和快照名。
rbd snap rm {pool-name}/{image-name}@{snap-name} 例如: rbd snap rm rbd/[email protected]
Ceph OSDs 异步地删除数据,所以删除快照后不会立即释放磁盘空间。
清除快照
要用 rbd 删除某个映像的所有快照,指定 snap purge 选项、存储池名和映像名。
rbd snap purge {pool-name}/{image-name} 例如: rbd snap purge rbd/foo
分层
Ceph 支持为某一设备快照创建很多个写时复制( COW )克隆。分层快照使得 Ceph 块设备客户端可以很快地创建映像。例如,你可以创建一个包含有 Linux VM 的块设备映像;然后做快照、保护快照,再创建任意多个写时复制克隆。快照是只读的,所以简化了克隆快照的语义 —— 使得克隆很迅速。
注意:这里的术语“父”和“子”指的是一个 Ceph 块设备快照(父),和从此快照克隆出来的对应映像(子)。这些术语对下列的命令行用法来说很重要。
各个克隆出来的映像(子)都存储着对父映像的引用,这使得克隆出来的映像可以打开父映像并读取它。
一个快照的 COW 克隆和其它任何 Ceph 块设备映像的行为完全一样。克隆出的映像没有特别的限制,你可以读出、写入、克隆、调整克隆映像的大小。然而快照的写时复制克隆引用了快照,所以你克隆快照前必须保护它。下图描述了此过程。
笔记:Ceph 仅支持克隆 format 2 的映像(即用 rbd create --image-format 2 创建的)。内核客户端从 3.10 版开始支持克隆的映像。
分层入门
Ceph 块设备的分层是个简单的过程。你必须有个映像、必须为它创建快照、并且必须保护快照,执行过这些步骤后,你才能克隆快照。
克隆出的映像包含对父快照的引用,也包含存储池 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 snap protect {pool-name}/{image-name}@{snapshot-name} 例如: rbd snap protect rbd/[email protected]
你删除不了受保护的快照。
克隆快照
要克隆快照,你得指定父存储池、父映像名和快照,还有子存储池和子映像名。克隆前必须先保护快照。
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name} 例如: rbd clone rbd/[email protected] rbd/new-image
你可以把某个存储池中映像的快照克隆到另一存储池。例如,你可以把某一存储池中的只读映像及其快照作为模板维护,把可写克隆置于另一存储池。
取消快照保护
删除快照前,必须先取消保护。另外,你不可以删除被克隆映像引用的快照,所以在你删除快照前,必须先拍平( flatten )此快照的各个克隆。
rbd snap unprotect {pool-name}/{image-name}@{snapshot-name} 例如: rbd snap unprotect rbd/[email protected]
罗列快照的子孙
用下列命令罗列某个快照的子孙:
rbd children {pool-name}/{image-name}@{snapshot-name} 例如: rbd children rbd/[email protected]
拍平克隆映像
克隆出来的映像仍保留了对父快照的引用。要从子克隆删除这些到父快照的引用,你可以把快照的信息复制给子克隆,也就是“拍平”它。拍平克隆映像的时间随快照尺寸增大而增加。要删除快照,必须先拍平子映像。
rbd flatten {pool-name}/{image-name} 例如: rbd flatten rbd/my-image
因为拍平的映像包含了快照的所有信息,所以拍平的映像占用的存储空间会比分层克隆要大。
三、RBD 镜像
可以在两个 Ceph 集群中异步备份 RBD images。该能力利用了 RBD image 的日志特性,以确保集群间的副本崩溃一致性。镜像功能需要在同伴集群( peer clusters )中的每一个对应的 pool 上进行配置,可设定自动备份某个存储池内的所有 images 或仅备份 images 的一个特定子集。用 rbd 命令来配置镜像功能。 rbd-mirror 守护进程负责从远端集群拉取 image 的更新,并写入本地集群的对应 image 中。
注意:
1.RBD 镜像功能需要 Ceph Jewel 或更新的发行版本。
2.要使用 RBD 镜像功能,你必须有 2 个 Ceph 集群, 每个集群都要运行 rbd-mirror 守护进程。