一个块就是由若干字节组成的序列,例如 4 MB 的数据块。基于块的存储接口是使用旋转媒体(例如硬盘、CD、软盘)存储数据最常见的方式。块设备接口的普及,也使得虚拟块设备成为与大量数据存储系统(例如 Ceph)进行交互的理想选择。
Ceph 块设备允许共享物理资源,并且可以调整大小。它们会在 Ceph 集群中的多个 OSD 上等量存储数据。Ceph 块设备会利用 RADOS 功能,例如创建快照、复制和一致性。Ceph 的 RADOS 块设备 (RBD) 使用内核扩展模块或 librbd
库与 OSD 交互。
Ceph 的块设备为内核扩展模块提供高性能及无限的可扩展性。它们支持虚拟化解决方案(例如 QEMU)或依赖于 libvirt
的基于云的计算系统(例如 OpenStack)。您可以使用同一个集群来同时操作对象网关、CephFS 和 RADOS 块设备。
rbd
命令可让您创建、列出、内省和删除块设备映像。您还可以使用它来执行其他操作,例如,克隆映像、创建快照、将映像回滚到快照或查看快照。
将块设备添加到客户端之前,您需要在现有存储池中创建一个相关的映像(请参见第 11 章 “管理存储池”):
cephadm@adm >
rbd create --size MEGABYTES POOL-NAME/IMAGE-NAME
例如,要创建名为“myimage”的 1 GB 映像,并使其将信息存储在名为“mypool”的存储池中,请执行以下命令:
cephadm@adm >
rbd create --size 1024 mypool/myimage
如果您省略了大小单位缩写(“G”或“T”),映像大小将以兆字节为单位。请在大小数值之后使用“G”或“T”来指定千兆字节或太字节。
自 SUSE Enterprise Storage 5 起,可以将块设备映像的数据直接存储在纠删码 (EC) 存储池中。RADOS 块设备映像由数据和元数据两部分组成。您只能将 RADOS 块设备映像的“数据”部分存储在 EC 存储池中。要这么做,存储池的“overwrite”标志需要设置为 true,并且用于存储存储池的所有 OSD 都必须使用 BlueStore。
不能将映像的“元数据”部分存储在 EC 存储池中。您需要使用 rbd create
命令的 --pool=
选项来指定用于存储映像元数据的副本存储池。
通过以下步骤可在新创建的 EC 存储池中创建 RBD 映像:
cephadm@adm >
ceph
osd pool create POOL_NAME 12 12 erasurecephadm@adm >
ceph
osd pool set POOL_NAME allow_ec_overwrites true #Metadata will reside in pool "OTHER_POOL", and data in pool "POOL_NAME"cephadm@adm >
rbd
create IMAGE_NAME --size=1G --data-pool POOL_NAME --pool=OTHER_POOL
RADOS 块设备映像是瘦配置 — 在您开始将数据保存到这些映像之前,它们实际上并不会使用任何物理存储。但是,这些映像具有您使用 --size
选项设置的最大容量。如果您要增大(或减小)映像的最大大小,请运行以下命令:
cephadm@adm >
rbd resize --size 2048 POOL_NAME/IMAGE_NAME # to increasecephadm@adm >
rbd resize --size 2048 POOL_NAME/IMAGE_NAME --allow-shrink # to decrease
创建 RADOS 块设备之后,便可以像任何其他磁盘设备一样使用它:进行格式化、将其装入以便能够交换文件,以及在完成时将其卸载。
确保您的 Ceph 集群的存储池中包含要映射的磁盘映像。假设存储池名为 mypool
,映像名为 myimage
。
cephadm@adm >
rbd list mypool
将映像映射到新的块设备。
cephadm@adm >
rbd map --pool mypool myimage
要指定用户名,请使用 --id 用户名
。如果您使用 cephx
身份验证,则还需要指定密钥。该机密可能来自密钥环,或某个包含机密的文件:
cephadm@adm >
rbd map --pool rbd myimage --id admin --keyring /path/to/keyring
或者
cephadm@adm >
rbd map --pool rbd myimage --id admin --keyfile /path/to/file
列出所有映射的设备:
cephadm@adm >
rbd showmapped
id pool image snap device
0 mypool myimage - /dev/rbd0
我们要使用的设备是 /dev/rbd0
。
您可以使用 /dev/rbd/存储池名称/映像名称
作为永久设备路径来代替 /dev/rbd设备编号
。例如:
/dev/rbd/mypool/myimage
在 /dev/rbd0
设备上创建 XFS 文件系统。
root #
mkfs.xfs /dev/rbd0
log stripe unit (4194304 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/rbd0 isize=256 agcount=9, agsize=261120 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=2097152, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
装入设备并检查它是否已正确装入。将 /mnt
替换为您的装入点。
root #
mount /dev/rbd0 /mntroot #
mount | grep rbd0 /dev/rbd0 on /mnt type xfs (rw,relatime,attr2,inode64,sunit=8192,...
现在,您便可以将数据移入/移出设备,就如同它是本地目录一样。
如果您发现 RBD 设备的大小不再够用,可以轻松增大大小。
增大 RBD 映像的大小,例如增大到 10GB。
cephadm@adm >
rbd resize --size 10000 mypool/myimage
Resizing image: 100% complete...done.
扩大文件系统以填入设备的新大小。
root #
xfs_growfs /mnt
[...]
data blocks changed from 2097152 to 2560000
当您访问完设备后,可以将其取消映射并卸载。
cephadm@adm >
rbd unmap /dev/rbd0root #
unmount /mnt
因为在引导之后手动映射和装入 RBD 映像以及在关机之前卸载和取消映射会非常麻烦,我们提供了 rbdmap
脚本和 systemd
单元。请参考第 12.2.1 节 “rbdmap:在引导时映射 RBD 设备”。
rbdmap
是一个外壳脚本,可对一个或多个 RBD 映像自动执行 rbd map
和 rbd unmap
操作。虽然您随时都可以手动运行该脚本,但其主要优势是在引导时自动映射和装入 RBD 映像(以及在关机时卸载和取消映射),此操作由 Init 系统触发。ceph-common
包中随附了一个 systemd
单元文件 rbdmap.service
用于执行此操作。
该脚本使用单个自变量,可以是 map
或 unmap
。使用任一自变量时,该脚本都会分析配置文件。它默认为 /etc/ceph/rbdmap
,但可通过环境变量 rbdmapFILE
覆盖。该配置文件的每一行相当于一个要映射或取消映射的 RBD 映像。
配置文件采用以下格式:
image_specification rbd_options
image_specification
存储池中映像的路径。以 pool_name/image_name 格式指定。
rbd_options
要传递给底层 rbd map
命令的参数的可选列表。这些参数及其值应该以逗号分隔的字符串形式指定,例如:
PARAM1=VAL1,PARAM2=VAL2,...
该示例让 rbdmap
脚本运行以下命令:
cephadm@adm >
rbd map POOL_NAME/IMAGE_NAME --PARAM1 VAL1 --PARAM2 VAL2
下面的示例中介绍了如何使用相应的密钥指定用户名和密钥环:
cephadm@adm >
rbdmap map mypool/myimage id=rbd_user,keyring=/etc/ceph/ceph.client.rbd.keyring
以 rbdmap map
形式运行时,该脚本会分析配置文件,并且对于每个指定的 RBD 映像,它会尝试先映射映像(使用 rbd map
命令),再装入映像。
以 rbdmap unmap
形式运行时,配置文件中列出的映像将卸载并取消映射。
rbdmap unmap-all
会尝试卸载然后取消映射所有当前已映射的 RBD 映像,而不论它们是否列在配置文件中。
如果成功,rbd map 操作会将映像映射到 /dev/rbdX 设备,此时会触发 udev 规则,以创建易记设备名称符号链接 /dev/rbd/pool_name/image_name
,该链接指向实际映射的设备。
为了装入和卸载成功,易记设备名称在 /etc/fstab
中需有对应项。写入 RBD 映像的 /etc/fstab
项时,指定“noauto”(或“nofail”)装入选项。这可防止 Init 系统过早(尚未出现有问题的设备时)尝试装入设备,因为 rbdmap.service
通常是在引导序列中相当靠后的时间触发。
有关 rbd
选项的完整列表,请参见 rbd
手册页 (man 8 rbd
)。
有关 rbdmap
用法的示例,请参见 rbdmap
手册页 (man 8 rbdmap
)。
如果您发现 RBD 设备的大小不再够用,可以轻松增大大小。
增大 RBD 映像的大小,例如增大到 10GB。
cephadm@adm >
rbd resize --size 10000 mypool/myimage
Resizing image: 100% complete...done.
扩大文件系统以填入设备的新大小。
root #
xfs_growfs /mnt
[...]
data blocks changed from 2097152 to 2560000
RBD 快照是 RADOS 块设备映像的快照。通过快照,您可以保留映像状态的历史。Ceph 还支持快照分层,这可让您轻松快速地克隆 VM 映像。Ceph 使用 rbd
命令和许多高级接口(包括 QEMU、libvirt
、OpenStack 和 CloudStack)支持块设备快照。
在创建映像的快照之前,请停止输入和输出操作,并刷新所有待处理写操作。如果映像包含文件系统,则在创建快照时,文件系统必须处于一致状态。
如果启用了 cephx
,则必须指定用户名或 ID,以及包含用户相应密钥的密钥环的路径。有关详细信息,请参见 第 8 章 “使用 cephx
进行身份验证”。您还可以添加 CEPH_ARGS
环境变量,以免重新输入以下参数。
cephadm@adm >
rbd --id user-ID --keyring=/path/to/secret commandscephadm@adm >
rbd --name username --keyring=/path/to/secret commands
例如:
cephadm@adm >
rbd --id admin --keyring=/etc/ceph/ceph.keyring commandscephadm@adm >
rbd --name client.admin --keyring=/etc/ceph/ceph.keyring commands
将用户和机密添加到 CEPH_ARGS
环境变量,如此您便无需每次都输入它们。
下面的过程说明如何在命令行上使用 rbd
命令创建、列出和删除快照。
要使用 rbd
创建快照,请指定 snap create
选项、存储池名称和映像名称。
cephadm@adm >
rbd --pool pool-name snap create --snap snap-name image-namecephadm@adm >
rbd snap create pool-name/image-name@snap-name
例如:
cephadm@adm >
rbd --pool rbd snap create --snap snapshot1 image1cephadm@adm >
rbd snap create rbd/image1@snapshot1
要列出映像的快照,请指定存储池名称和映像名称。
cephadm@adm >
rbd --pool pool-name snap ls image-namecephadm@adm >
rbd snap ls pool-name/image-name
例如:
cephadm@adm >
rbd --pool rbd snap ls image1cephadm@adm >
rbd snap ls rbd/image1
要使用 rbd
回滚快照,请指定 snap rollback
选项、存储池名称、映像名称和快照名称。
cephadm@adm >
rbd --pool pool-name snap rollback --snap snap-name image-namecephadm@adm >
rbd snap rollback pool-name/image-name@snap-name
例如:
cephadm@adm >
rbd --pool pool1 snap rollback --snap snapshot1 image1cephadm@adm >
rbd snap rollback pool1/image1@snapshot1
将映像回滚到快照意味着会使用快照中的数据重写当前版本的映像。执行回滚所需的时间将随映像大小的增加而延长。从快照克隆较快,而从映像到快照的回滚较慢,因此克隆是返回先前存在状态的首选方法。
要使用 rbd
删除快照,请指定 snap rm
选项、存储池名称、映像名称和用户名。
cephadm@adm >
rbd --pool pool-name snap rm --snap snap-name image-namecephadm@adm >
rbd snap rm pool-name/image-name@snap-name
例如:
cephadm@adm >
rbd --pool pool1 snap rm --snap snapshot1 image1cephadm@adm >
rbd snap rm pool1/image1@snapshot1
Ceph OSD 会以异步方式删除数据,因此删除快照不能立即释放磁盘空间。
要使用 rbd
删除映像的所有快照,请指定 snap purge
选项和映像名称。
cephadm@adm >
rbd --pool pool-name snap purge image-namecephadm@adm >
rbd snap purge pool-name/image-name
例如:
cephadm@adm >
rbd --pool pool1 snap purge image1cephadm@adm >
rbd snap purge pool1/image1
Ceph 支持为一个块设备快照创建多个写入时复制 (COW) 克隆的功能。快照分层可让 Ceph 块设备客户端能够极快地创建映像。例如,您可以创建块设备映像并将 Linux VM 写入其中,然后创建映像的快照、保护快照,并创建您所需数量的“写入时复制”克隆。快照是只读的,因此克隆快照简化了语义,如此可快速创建克隆。
下面的命令行示例中提到的“父”和“子”这两个术语是指 Ceph 块设备快照(父)和从快照克隆的相应映像(子)。
每个克隆的映像(子)都存储了对其父映像的引用,这可让克隆的映像打开父快照并读取其内容。
快照的 COW 克隆的行为方式与任何其他 Ceph 块设备映像完全相同。可针对克隆的映像执行读取、写入、克隆和调整大小操作。系统对克隆的映像没有特殊限制。但是,快照的写入时复制克隆会引用快照,因此您必须在克隆快照之前保护快照。
--image-format 1
您无法为通过弃用的 rbd create --image-format 1
选项创建的映像创建快照。Ceph 仅支持克隆默认的 format 2 映像。
Ceph 块设备分层是一个简单的过程。您必须有一个映像。您必须创建映像的快照。您必须保护快照。在您执行这些步骤之后,就可以开始克隆快照了。
克隆的映像具有对父快照的引用,并且包含存储池 ID、映像 ID 和快照 ID。包含存储池 ID 意味着您可以将快照从一个存储池克隆到另一个存储池中的映像。
映像模板:一种常见的块设备分层用例是创建主映像和用作克隆模板的快照。例如,用户可为 Linux 发行套件(如 SUSE Linux Enterprise Server)创建映像并为它创建快照。用户可以定期更新映像和创建新的快照(例如,先执行 zypper ref && zypper patch
,接着执行 rbd snap create
)。随着映像日趋成熟,用户可以克隆任何一个快照。
扩展模板:更高级的用例包括扩展比基本映像提供的信息更多的模板映像。例如,用户可以克隆映像(VM 模板)并安装其他软件(例如,数据库、内容管理系统或分析系统),然后创建扩展映像的快照,这个扩展映像可以如基本映像一样更新。
模板池:使用块设备分层的一种方法是创建包含主映像(用作模板)的池,然后创建这些模板的快照。之后,您便可以扩大用户的只读特权,使他们可以克隆快照,却不能写入存储池或在存储池中执行。
映像迁移/恢复:使用块设备分层的一种方法是将数据从一个存储池迁移或恢复到另一个存储池。
克隆会访问父快照。如果用户意外删除了父快照,则所有克隆都会损坏。为了防止数据丢失,您需要先保护快照,然后才能克隆它。
cephadm@adm >
rbd --pool pool-name snap protect \ --image image-name --snap snapshot-namecephadm@adm >
rbd snap protect pool-name/image-name@snapshot-name
例如:
cephadm@adm >
rbd --pool pool1 snap protect --image image1 --snap snapshot1cephadm@adm >
rbd snap protect pool1/image1@snapshot1
您无法删除受保护的快照。
要克隆快照,您需要指定父存储池、映像、快照、子存储池和映像名称。您需要先保护快照,然后才能克隆它。
cephadm@adm >
rbd clone --pool pool-name --image parent-image \ --snap snap-name --dest-pool pool-name \ --dest child-imagecephadm@adm >
rbd clone pool-name/parent-image@snap-name \ pool-name/child-image-name
例如:
cephadm@adm >
rbd clone pool1/image1@snapshot1 pool1/image2
您可以将快照从一个存储池克隆到另一个存储池中的映像。例如,可以在一个存储池中将只读映像和快照作为模板维护,而在另一个存储池中维护可写入克隆。
必须先取消保护快照,然后才能删除它。另外,您无法删除克隆所引用的快照。您需要先平展快照的每个克隆,然后才能删除快照。
cephadm@adm >
rbd --pool pool-name snap unprotect --image image-name \ --snap snapshot-namecephadm@adm >
rbd snap unprotect pool-name/image-name@snapshot-name
例如:
cephadm@adm >
rbd --pool pool1 snap unprotect --image image1 --snap snapshot1cephadm@adm >
rbd snap unprotect pool1/image1@snapshot1
要列出快照的子项,请执行以下命令:
cephadm@adm >
rbd --pool pool-name children --image image-name --snap snap-namecephadm@adm >
rbd children pool-name/image-name@snapshot-name
例如:
cephadm@adm >
rbd --pool pool1 children --image image1 --snap snapshot1cephadm@adm >
rbd children pool1/image1@snapshot1
克隆的映像会保留对父快照的引用。删除子克隆对父快照的引用时,可通过将信息从快照复制到克隆,高效“平展”映像。平展克隆所需的时间随着映像大小的增加而延长。要删除快照,必须先平展子映像。
cephadm@adm >
rbd --pool pool-name flatten --image image-namecephadm@adm >
rbd flatten pool-name/image-name
例如:
cephadm@adm >
rbd --pool pool1 flatten --image image1cephadm@adm >
rbd flatten pool1/image1
由于平展的映像包含快照中的所有信息,平展的映像占用的存储空间将比分层克隆多。
RBD 映像可以在两个 Ceph 集群之间异步镜像。此功能使用 RBD 日志映像功能来确保集群之间的复制在崩溃时保持一致。镜像在同伴集群中逐池配置,并且可以配置为自动镜像池中的所有映像或仅镜像特定的映像子集。镜像使用 rbd
命令进行配置。rbd-mirror
守护进程负责从远程同伴集群提取映像更新,并将它们应用于本地集群中的映像。
要使用 RBD 镜像,您需要有两个 Ceph 集群,每个集群都运行 rbd-mirror
守护进程。
您无法使用基于内核的 iSCSI 网关镜像通过 iSCSI 导出的 RBD 设备。
有关 iSCSI 的更多详细信息,请参见第 18 章 “Ceph iSCSI 网关”。
两个 rbd-mirror
守护进程负责检查远程同伴集群上的映像日记并针对本地集群重放日记事件。RBD 映像日志功能会按发生的顺序记录对映像进行的所有修改。如此可确保远程映像崩溃状态一致的镜像可在本地使用。
rbd-mirror
守护进程在
rbd-mirror 包中提供。您可以在 OSD 节点、网关节点甚至是专用节点上安装该包。不建议您将 rbd-mirror 安装在管理节点上。安装、启用和启动 rbd-mirror:
root@minion >
zypper install rbd-mirrorroot@minion >
systemctl enable ceph-rbd-mirror@server_name.serviceroot@minion >
systemctl start ceph-rbd-mirror@server_name.service
每个 rbd-mirror
守护进程都必须能够同时连接到两个集群。
以下过程说明如何使用 rbd
命令来执行配置镜像的基本管理任务。镜像在 Ceph 集群中逐池进行配置。
您需要在两个同伴集群上执行存储池配置步骤。为清楚起见,这些过程假设名为“local”和“remote”的两个集群可从单台主机访问。
有关如何连接到不同的 Ceph 集群的更多详细信息,请参见 rbd
手册页 (man 8 rbd
)。
在下面的示例中,集群名称与同名的 Ceph 配置文件 /etc/ceph/remote.conf
相对应。
要针对存储池启用镜像,请指定 mirror pool enable
子命令、存储池名称和镜像模式。镜像模式可以是存储池或映像:
将会镜像启用了日志特性的存储池中的所有映像。
需要针对每个映像明确启用镜像。有关详细信息,请参见第 12.4.3.2 节 “启用映像镜像”。
例如:
cephadm@adm >
rbd --cluster local mirror pool enable POOL_NAME poolcephadm@adm >
rbd --cluster remote mirror pool enable POOL_NAME pool
要对存储池禁用镜像,请指定 mirror pool disable
子命令和存储池名称。使用这种方法对存储池禁用镜像时,还会对已为其明确启用镜像的所有映像(该存储池中)禁用镜像。
cephadm@adm >
rbd --cluster local mirror pool disable POOL_NAMEcephadm@adm >
rbd --cluster remote mirror pool disable POOL_NAME
为了让 rbd-mirror
守护进程发现它的同伴集群,需要向存储池注册该同伴集群。要添加镜像同伴集群,请指定 mirror pool peer add
子命令、存储池名称和集群规格:
cephadm@adm >
rbd --cluster local mirror pool peer add POOL_NAME client.remote@remotecephadm@adm >
rbd --cluster remote mirror pool peer add POOL_NAME client.local@local
要删除镜像同伴集群,请指定 mirror pool peer remove
子命令、存储池名称和对等 UUID(可通过 rbd mirror pool info
命令获得):
cephadm@adm >
rbd --cluster local mirror pool peer remove POOL_NAME \ 55672766-c02b-4729-8567-f13a66893445cephadm@adm >
rbd --cluster remote mirror pool peer remove POOL_NAME \ 60c0e299-b38f-4234-91f6-eed0a367be08
与存储池配置不同,映像配置只需要针对单个镜像同伴 Ceph 集群执行。
系统会将镜像的 RBD 映像指定为主要或非主要。这是映像的属性,而不是存储池的属性。不能修改指定为非主要的映像。
当首次对某个映像启用镜像时(如果存储池镜像模式是“存储池”并且映像已启用日志映像功能,则为隐式启用,或可通过 rbd
命令显式启用(请参见第 12.4.3.2 节 “启用映像镜像”)),映像会自动升级为主要映像。
RBD 镜像使用 RBD 日志功能来确保复制的映像始终在崩溃时保持一致状态。在将映像镜像到同伴集群之前,必须启用日志功能。可以在创建映像时通过将 --image-feature exclusive-lock,journaling
选项提供给 rbd
命令来启用该功能。
或者,日志功能可以针对预先存在的 RBD 映像动态启用。要启用日记,请指定 feature enable
子命令、存储池和映像名称以及功能名称:
cephadm@adm >
rbd --cluster local feature enable POOL_NAME/IMAGE_NAME journaling
journaling
功能依赖于 exclusive-lock
功能。如果 exclusive-lock
功能尚未启用,则您需要先启用它,再启用 journaling
功能。
您可以在 Ceph 配置文件中的 rbd default features
选项中追加 journaling
值,以便默认对所有新映像启用日志。例如:
rbd default features = layering,exclusive-lock,object-map,deep-flatten,journaling
应用此更改之前,请慎重考虑对所有新映像启用日志是否适合您的部署,因为这样做可能会对性能产生负面影响。
如果镜像配置为“映像”模式,则需要为存储池中的每个映像明确启用镜像。要为特定映像启用镜像,请指定 mirror image enable
子命令以及存储池和映像名称:
cephadm@adm >
rbd --cluster local mirror image enable POOL_NAME/IMAGE_NAME
要为特定映像禁用镜像,请指定 mirror image disable
子命令以及存储池和映像名称:
cephadm@adm >
rbd --cluster local mirror image disable POOL_NAME/IMAGE_NAME
在需要将主要指定移动到同伴集群中映像的故障转移情况下,您需要停止访问主要映像、降级当前主要映像、升级新的主要映像,然后继续访问替代集群上的映像。
可以使用 --force
选项强制升级。降级不能传播到同伴集群时(例如,当集群发生故障或通讯中断时),就需要强制升级。这将导致两个同伴集群之间出现节点分裂情况,并且映像不再同步,直到发出了 resync
子命令。
要将特定映像降级为非主要映像,请指定 mirror image demote
子命令以及存储池和映像名称:
cephadm@adm >
rbd --cluster local mirror image demote POOL_NAME/IMAGE_NAME
要将存储池中的所有主要映像都降级为非主要映像,请指定 mirror pool demote
子命令以及存储池名称:
cephadm@adm >
rbd --cluster local mirror pool demote POOL_NAME
要将特定映像升级为主要映像,请指定 mirror image promote
子命令以及存储池和映像名称:
cephadm@adm >
rbd --cluster remote mirror image promote POOL_NAME/IMAGE_NAME
要将存储池中的所有非主要映像都升级为主要映像,请指定 mirror pool promote
子命令以及存储池名称:
cephadm@adm >
rbd --cluster local mirror pool promote POOL_NAME
因为主要或非主要状态是针对映像的,所以可以使用两个集群来分割 I/O 负载并进行故障转移或故障回复。
如果 rbd-mirror
守护进程检测到分区事件,则在该情况解决之前,它不会尝试镜像受影响的映像。要继续镜像映像,请先降级确定过期的映像,然后请求与主要映像重新同步。要请求映像重新同步,请指定 mirror image resync
子命令以及存储池和映像名称:
cephadm@adm >
rbd mirror image resync POOL_NAME/IMAGE_NAME
系统会存储每个主要镜像映像的同伴集群复制状态。此状态可使用 mirror image status
和 mirror pool status
子命令检索:
要请求镜像映像状态,请指定 mirror image status
子命令以及存储池和映像名称:
cephadm@adm >
rbd mirror image status POOL_NAME/IMAGE_NAME
要请求镜像存储池摘要状态,请指定 mirror pool status
子命令以及存储池名称:
cephadm@adm >
rbd mirror pool status POOL_NAME
将 --verbose
选项添加到 mirror pool status
子命令会额外地输出存储池中每个镜像映像的状态详细信息。
Ceph 块设备的用户空间实现 (librbd
) 无法利用 Linux 页面缓存。因此,它具有自己的内存中缓存。RBD 缓存的行为与硬盘缓存类似。当 OS 发送屏障或刷新请求时,所有“脏”数据都会写入 OSD。这意味着只要虚拟机可以正确发送刷新请求,使用写回缓存与使用运行良好的物理硬盘一样安全。该缓存运用最久未使用 (LRU) 算法,并且在写回模式下可以合并相邻请求以提高吞吐量。
Ceph 支持为 RBD 提供写回缓存。要启用该缓存,请将
[client] ... rbd cache = true
添加到 ceph.conf
文件的 [client]
段落。librbd
默认不会执行任何缓存。写和读都直接到达存储集群,并且只有当数据的所有副本都写入磁盘后写操作才会返回。如果启用了缓存,写操作会立即返回,除非未刷新的字节数大于 rbd cache max dirty
选项中设置的数值。在此情况下,写操作会触发写回机制并一直阻塞,直至有足够多的字节得到刷新。
Ceph 支持为 RBD 提供直写缓存。您可以设置缓存的大小,以及从写回缓存切换到直写缓存的目标和限值。要启用直写模式,请设置
rbd cache max dirty = 0
这意味着只有当数据的所有副本都写入磁盘后写操作才会返回,但可能会从缓存中读取数据。缓存信息保存在客户端的内存中,并且每个 RBD 都有自己的缓存。由于对客户端而言缓存位于本地,因此如果有其他客户端访问映像,不会存在缓存一致性的问题。如果启用了缓存,在 RBD 上将不能运行 GFS 或 OCFS。
RBD 的设置应位于 ceph.conf
配置文件的 [client]
段落下。其设置包括:
rbd cache
对 RADOS 块设备 (RBD) 启用缓存。默认值为“true”。
rbd cache size
RBD 缓存大小(以字节为单位)。默认值为 32 MB。
rbd cache max dirty
使缓存触发写回机制的“脏”数据上限(以字节为单位)。rbd cache max dirty
的值必须小于 rbd cache size
的值。如果设置为 0,将使用直写缓存。默认值为 24 MB。
rbd cache target dirty
达到该“脏数据目标”后,缓存即会开始向数据存储空间写入数据。该设置不会使写入缓存的操作阻塞。默认值为 16 MB。
rbd cache max dirty age
写回开始前,脏数据在缓存中暂存的时间(以秒为单位)。默认值为 1。
rbd cache writethrough until flush
开始进入直写模式,在收到第一条刷新请求后切换到写回模式。启用此设置虽然较为保守,但却是一种安全的做法,如此可应对在 rbd
上运行的虚拟机太旧而无法发送刷新请求的情况(例如,内核低于 2.6.32 的 Linux 中的 Virtio 驱动程序)。默认值为“true”。
一般而言,服务质量 (QoS) 指的是流量优先级设置和资源预留方法。它对于具有特殊要求的流量传输尤为重要。
下列 QoS 设置仅由用户空间 RBD 实现 librbd
使用,kRBD
实现不使用这些设置。由于 iSCSI 使用的是 kRBD
,因此不使用 QoS 设置。不过,对于 iSCSI,您可以使用标准内核工具在内核块设备层上配置 QoS。
rbd qos iops limit
指定的每秒 I/O 操作次数上限。默认值为 0(无限制)。
rbd qos bps limit
指定的每秒 I/O 字节数上限。默认值为 0(无限制)。
rbd qos read iops limit
指定的每秒读操作次数上限。默认值为 0(无限制)。
rbd qos write iops limit
指定的每秒写操作次数上限。默认值为 0(无限制)。
rbd qos read bps limit
指定的每秒内读取的字节数上限。默认值为 0(无限制)。
rbd qos write bps limit
指定的每秒内写入的字节数上限。默认值为 0(无限制)。
rbd qos iops burst
指定的 I/O 操作次数突发上限。默认值为 0(无限制)。
rbd qos bps burst
指定的 I/O 字节数突发上限。默认值为 0(无限制)。
rbd qos read iops burst
指定的读操作次数突发上限。默认值为 0(无限制)。
rbd qos write iops burst
指定的写操作次数突发上限。默认值为 0(无限制)。
rbd qos read bps burst
指定的读取的字节数突发上限。默认值为 0(无限制)。
rbd qos write bps burst
指定的写入的字节数突发上限。默认值为 0(无限制)。
rbd qos schedule tick min
QoS 的最小时间表刻度(以毫秒为单位)。默认值为 50。
RADOS 块设备支持预读/预提取功能,以优化小块的顺序读取。如果使用虚拟机,此操作通常应由 guest 操作系统处理,但引导加载程序可能不会发出有效的读请求。如果禁用缓存,则会自动禁用预读功能。
rbd readahead trigger requests
触发预读所必需的顺序读取请求数。默认值为 10。
rbd readahead max bytes
预读请求的最大大小。如果设置为 0,则会禁用预读功能。默认值为 512kB。
rbd readahead disable after bytes
从 RBD 映像读取该数量的字节后,该映像的预读功能将会禁用,直至其关闭。使用此设置,guest 操作系统引导时便可接管预读工作。如果设置为 0,预读将始终处于启用状态。默认值为 50 MB。
RADOS 块设备支持可增强 RBD 映像功能的高级特性。您可以在创建 RBD 映像时在命令行上指定这些特性,或者在 Ceph 配置文件中使用 rbd_default_features
选项来指定。
您可以通过以下两种方式指定 rbd_default_features
选项的值:
指定为相应特性的内部值之和。每项特性都有自己的内部值,例如,“layering”的内部值为 1,“fast-diff”的内部值为 16。因此,若要默认激活这两项特性,请指定以下选项:
rbd_default_features = 17
指定为各特性的逗号分隔列表。上面的示例应如下所示:
rbd_default_features = layering,fast-diff
iSCSI 不支持具有以下特性的 RBD 映像:deep-flatten
、object-map
、journaling
、fast-diff
、striping
以下是 RBD 的高级特性列表:
layering
分层允许您使用克隆。
内部值为 1,默认值为“yes”。
striping
条带特性会将数据分布在多个对象之间,有助于提升顺序读取/写入工作负载的并行度。它可防止大型或繁忙的 RADOS 块设备出现单节点瓶颈。
内部值为 2,默认值为“yes”。
exclusive-lock
如果启用,客户端需要在写入数据之前锁定对象。仅当一次只有一个客户端在访问映像时才应启用互斥锁。内部值为 4。默认值为“yes”。
object-map
对象映射支持依赖于互斥锁支持。块设备采用的是精简供给,也就是说这些设备只存储实际存在的数据。对象映射支持有助于跟踪哪些对象实际存在(在驱动器上存储了数据)。启用对象映射支持可以加快克隆、导入和导出数据稀疏的映像以及删除所需的 I/O 操作。
内部值为 8,默认值为“yes”。
fast-diff
Fast-diff 支持依赖于对象映射支持和互斥锁支持。它会向对象映射添加另一个属性,使其更快地生成映像各快照之间的差异以及快照的实际数据使用率。
内部值为 16,默认值为“yes”。
deep-flatten
Deep-flatten 使 rbd flatten
(请参见第 12.3.3.6 节 “平展克隆的映像”)除了对映像本身有效外,还对映像的所有快照有效。如果没有该特性,映像的快照将仍然依赖于其父映像,因而如果未删除快照,您将无法删除父映像。Deep-flatten 使父映像可独立于其克隆,即使这些克隆有快照也不例外。
内部值为 32,默认值为“yes”。
journaling
日志支持依赖于互斥锁支持。日志会按修改发生的顺序记录映像的所有修改。RBD 镜像(请参见第 12.4 节 “镜像”)会使用日志将崩溃一致性映像复制到远程集群。
内部值为 64,默认值为“no”。
旧客户端(例如 SLE11 SP4)可能无法映射 RBD 映像,因为使用 SUSE Enterprise Storage 6 部署的集群会强制执行一些旧客户端不支持的特性(RBD 映像级特性和 RADOS 级特性)。发生此情况时,OSD 日志将显示类似如下的讯息:
2019-05-17 16:11:33.739133 7fcb83a2e700 0 -- 192.168.122.221:0/1006830 >> \ 192.168.122.152:6789/0 pipe(0x65d4e0 sd=3 :57323 s=1 pgs=0 cs=0 l=1 c=0x65d770).connect \ protocol feature mismatch, my 2fffffffffff < peer 4010ff8ffacffff missing 401000000000000
如果您打算在 CRUSH 索引存储桶类型“straw”与“straw2”之间切换,请做好相应规划。这样做预计会对集群负载产生重大影响,因为更改存储桶类型将导致集群大规模重新平衡。
禁用任何不支持的 RBD 映像特性。例如:
cephadm@adm >
rbd feature disable pool1/image1 object-mapcephadm@adm >
rbd feature disable pool1/image1 exclusive-lock
将 CRUSH 索引存储桶类型由“straw2”更改为“straw”:
保存 CRUSH 索引:
cephadm@adm >
ceph osd getcrushmap -o crushmap.original
反编译 CRUSH 索引:
cephadm@adm >
crushtool -d crushmap.original -o crushmap.txt
编辑 CRUSH 索引,并用“straw”替换“straw2”。
重新编译 CRUSH 索引:
cephadm@adm >
crushtool -c crushmap.txt -o crushmap.new
设置新 CRUSH 索引:
cephadm@adm >
ceph osd setcrushmap -i crushmap.new