文章目录
块是一个字节序列(例如,512字节的数据块)。 基于块的存储接口是使用旋转介质(如硬盘,CD,软盘甚至传统的9轨磁带)存储数据的最常用方法。 无处不在的块设备接口使虚拟块设备成为与Ceph等海量数据存储系统交互的理想选择。
Ceph 块设备也叫RBD块设备。
Ceph块设备是精简配置的,可调整大小的并存储在Ceph集群中多个OSD条带化的数据。 Ceph块设备利用RADOS功能,如快照,复制和一致性。 Ceph的RADOS块设备(RBD)使用内核模块或librbd库与OSD进行交互。
注意 内核模块可以使用Linux页缓存。 对于基于librbd的应用程序,Ceph支持RBD缓存。
Ceph的块设备向内核模块或KVM(如QEMU)以及OpenStack和CloudStack等基于云的计算系统(其依赖于libvirt和QEMU与Ceph块设备集成)提供高性能和无限的可伸缩性。可以使用相同的集群同时操作Ceph RADOS网关、CephFS文件系统和Ceph块设备。
要点:要使用Ceph块设备,必须有权访问正在运行的Ceph集群。
在使用Ceph块设备之前,请确保Ceph存储集群处于active + clean状态。
验证是否具有适当版本的Linux内核。 有关详细信息,请参阅OS建议。
# lsb_release -a
# uname -r
命令
rbd命令可以创建,列出,修改和删除块设备映像。 还可用来克隆映像,创建快照,将映像回滚到快照,查看快照等。有关使用rbd命令的详细信息,请参阅RBD - 管理RADOS块设备(RBD)映像以获取详细信息。
创建块设备池
-
在Ceph节点上,使用ceph工具创建存储池(建议使用名称’rbd’)。
ceph osd pool create rbd 128
-
在Ceph节点上,使用rbd工具初始化存储池以供RBD使用:
rbd pool init <pool-name>
注意 当没有提供池名称时,rbd工具假定默认池名称为“rbd”。
创建块设备用户
除非指定,否则rbd命令将使用ID admin访问Ceph集群。 此ID允许对集群进行完全管理访问。 建议尽可能使用受限制的用户。
要创建Ceph用户,请使用ceph auth get-or-create,用户名,监视器权限和OSD权限:
# ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]'
例如,要创建名为qemu的用户ID,该用户ID具有对池vms的读写访问权限和对池images的只读访问权限,请执行以下命令:
# ceph auth get-or-create client.qemu mon 'profile rbd' osd 'profile rbd pool=vms, profile rbd-read-only pool=images'
ceph auth get-or-create命令的输出将是指定用户的密钥环,可以写入/etc/ceph/ceph.client.{ID}.keyring。
注意 通过提供–id {id}可选参数,可以在使用rbd命令时指定用户ID。
创建块设备
在将块设备添加到节点之前,必须先在Ceph存储集群中为其创建映像。 要创建块设备映像,请执行以下操作:
第一种:
# rbd create image_name --size image_size --image-feature layering [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
# rbd create foo_1 --size 4096 --image-feature layering -p rbd
第二种:
# rbd create --size image_size {pool-name}/{image-name}
# rbd create --size 8192 test/docker_1
Tip:image_size的单位为MB;
如果在创建映像时未指定池,则它将存储在默认池rbd中。 例如,要在默认池rbd中创建存储名为foo的1GB映像,请执行以下命令:
# rbd create --size 1024 foo
注意 必须先创建池,然后才能将其指定为源。
列出块设备映像
要列出rbd池中的块设备,请执行以下命令(即,rbd是默认池名称):
# rbd ls
docker_1
foo_1
要列出特定池中的块设备,请执行以下操作,但将{poolname}替换为池的名称:
# rbd ls {poolname}
例如:
# rbd ls test
若要列出rbd池中延迟删除的块设备,请执行以下操作:
# rbd trash ls
要列出特定池中延迟删除的块设备,请执行以下操作,但将{poolname}替换为池的名称:
# rbd trash ls {poolname}
例如:
# rbd trash ls test
获取映像信息
要获取rbd池中特定映像信息,请执行以下操作,但将{image-name}替换为映像的名称:
# rbd info {image-name}
例如:
# rbd info foo_1
rbd image 'foo_1':
size 4 GiB in 1024 objects
order 22 (4 MiB objects)
id: 37a66b8b4567
block_name_prefix: rbd_data.37a66b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Sat Oct 12 16:57:36 2019
要获取特定池中的映像信息,请执行以下操作,但将{image-name}替换为映像名称,并将{pool-name}替换为池的名称:
# rbd info {pool-name}/{image-name}
例如:
# rbd info test/docker_1
rbd image 'docker_1':
size 8 GiB in 2048 objects
order 22 (4 MiB objects)
id: 37a96b8b4567
block_name_prefix: rbd_data.37a96b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Oct 12 17:14:56 2019
调整块设备映像的大小
Ceph Block Device映像是自动精简配置的。 在开始向其保存数据之前,它们实际上不使用任何物理存储。 但是,它们具有使用–size选项设置的容量。 如果要增加(或减少)Ceph块设备映像的大小,请执行以下操作:
# rbd resize --size 4096 foo_1 (增加)
# rbd resize --size 1024 foo_1 --allow-shrink (减少)
删除块设备映像
要删除块设备,请执行以下操作,但将{image-name}替换为要删除的映像的名称:
# rbd rm {image-name}
例如:
# rbd rm foo_1
要删除特定池中的块设备,请执行以下操作,但将{image-name}替换为要删除的映像的名称,并将{pool-name}替换为池的名称:
# rbd rm {pool-name}/{image-name}
例如:
# rbd rm test/docker_1
要延迟删除特定池中块设备,请执行以下操作,但将{image-name}替换为要移动的映像名称,并将{pool-name}替换为池的名称:
# rbd trash mv {pool-name}/{image-name}
例如:
# rbd trash mv test/foo_1
要删除特定池中被延迟的块设备,请执行以下操作,但将{image-id}替换为要删除的映像的id,并将{pool-name}替换为池的名称:
# rbd trash rm {pool-name}/{image-id}
例如:
# rbd trash rm test/2bf4474b0dc51
注意:
- 即使这个映像存在快照,或者由某一个克隆正在使用,都可以将镜像移入trash,但是不能从trash中删除。
- 可以使用-expires-at设置延迟时间(默认为now),如果延迟时间尚未到期,则除非使用-force,否则无法删除它。
恢复块设备映像
要恢复rbd池中延迟删除的块设备,请执行以下操作,但将{image-id}替换为映像的id:
# rbd trash restore {image-id}
例如:
# rbd trash restore 2bf4474b0dc51
要恢复特定池中的延迟删除的块设备,执行以下操作,但是要用映像的id替换{image-id},并使用池的名称替换{pool-name}:
# rbd trash restore {pool-name}/{image-id}
例如:
# rbd trash restore test/2bf4474b0dc51
还可以使用–image在恢复映像时重命名映像。
例如:
# rbd trash restore test/2bf4474b0dc51 --image new-name
内核模块操作
获取映像列表
要挂载块设备映像,请先返回映像列表。
# rbd list
docker_1
foo_1
映射块设备
使用rbd将映像映射到内核模块。 必须指定映像名称,池名称和用户名。 如果尚未加载,rbd将自动加载RBD内核模块。
# rbd device map {pool-name}/{image-name} --id {user-name}
例如:
# rbd device map foo_1 --id admin
/dev/rbd0
如果使用了cephx身份验证,则还必须指定密钥。 它可能来自密钥环或包含秘密的文件。
# rbd device map foo_1 --id admin --keyring /path/to/keyring
# rbd device map docker_1 --id admin --keyfile /path/to/file
显示已映射的块设备
要使用rbd命令显示映射到内核模块的块设备映像,请指定device list参数。
# rbd device list
id pool image snap device
0 rbd foo_1 - /dev/rbd0
取消映射块设备
要使用rbd命令取消映射块设备映像,请指定device unmap参数和设备名称(即,按照惯例,与块设备映像名称相同)。
# rbd device unmap /dev/rbd/{poolname}/{imagename}
例如:
# rbd device unmap /dev/rbd/rbd/foo
命令显示映射到内核模块的块设备映像,请指定device list参数。
# rbd device list
id pool image snap device
0 rbd foo_1 - /dev/rbd0
取消映射块设备
要使用rbd命令取消映射块设备映像,请指定device unmap参数和设备名称(即,按照惯例,与块设备映像名称相同)。
# rbd device unmap /dev/rbd/{poolname}/{imagename}
例如:
# rbd device unmap /dev/rbd/rbd/foo