注意
本文档适用于 Ceph 的开发版本。
rbd -- 管理 RADOS 块设备 (RBD) 镜像
概要
描述
rbd 是一个用于操作 RADOS 块设备 (RBD) 镜像的实用工具,由 Linux rbd 驱动程序和 QEMU/KVM 的 rbd 存储驱动程序使用。RBD 镜像是简单的块设备,它们通过对象进行条带化并存储在 RADOS 对象存储中。镜像进行条带化的对象大小必须是 2 的幂。
选项
- -c ceph.conf, --conf ceph.conf
在启动时使用 ceph.conf 配置文件而不是默认的 /etc/ceph/ceph.conf 来确定监视器地址。
- -m monaddress[:port]
连接到指定的监视器(而不是通过 ceph.conf 查找)。
- --cluster cluster-name
使用不同于默认集群名称 ceph 的集群名称。
- -p pool-name, --pool pool-name
与给定存储池交互。大多数命令都需要。
- --namespace namespace-name
在存储池中使用预定义的镜像命名空间。
- --no-progress
不输出进度信息(对于某些命令,默认输出到标准错误)。
参数
- --image-format format-id
指定要使用的对象布局。默认值为 2。
格式 1 - (已弃用)对新的 rbd 镜像使用原始格式。所有版本的 librbd 和内核 rbd 模块都理解此格式,但不支持克隆等新功能。
格式 2 - 使用第二种 rbd 格式,librbd 自 Bobtail 版本以来支持,内核 rbd 模块自内核 3.10 以来支持(“花式”条带化除外,该功能自内核 4.17 以来支持)。这增加了对克隆的支持,并且更容易扩展以允许将来更多功能。
- -s size-in-M/G/T, --size size-in-M/G/T
以 M/G/T 为单位指定新 rbd 镜像的大小或现有 rbd 镜像的新大小。如果未给出后缀,则假定单位为 M。
- --object-size size-in-B/K/M
以 B/K/M 为单位指定对象大小。对象大小将向上舍入到最接近的 2 的幂;如果未给出后缀,则假定单位为 B。默认对象大小为 4M,最小为 4K,最大为 32M。
默认值可以通过配置选项
rbd_default_order更改,该选项接受 2 的幂(默认对象大小为2 ^ rbd_default_order)。
- --stripe-unit size-in-B/K/M
以 B/K/M 为单位指定条带单元大小。如果未给出后缀,则假定单位为 B。有关更多详细信息,请参阅下面的条带化部分。
- --stripe-count num
指定在循环回第一个对象之前要条带化的对象数量。有关更多详细信息,请参阅下面的条带化部分。
- --snap snap
指定特定操作的快照名称。
- --id username
指定与 map 命令一起使用的用户名(不带
client.前缀)。
- --keyring filename
指定一个包含指定用户密钥的密钥环文件,以便与 map 命令一起使用。如果未指定,将搜索默认密钥环位置。
- --keyfile filename
指定一个包含
--id user密钥的文件,以便与 map 命令一起使用。如果同时指定了--keyring,此选项将被覆盖。
lock add 的选项,如果多个客户端使用相同的标签,则允许它们锁定同一个镜像。标签是任意字符串。这对于镜像必须同时由多个客户端打开的情况非常有用,例如虚拟机实时迁移期间,或在集群文件系统下使用。
- --format format
指定输出格式(默认值:plain, json, xml)
- --pretty-format
使 json 或 xml 格式的输出更具可读性。
- -o krbd-options, --options krbd-options
指定通过 rbd 内核驱动程序映射或取消映射镜像时要使用的选项。krbd-options 是一个逗号分隔的选项列表(类似于 mount(8) 挂载选项)。有关更多详细信息,请参阅下面的内核 rbd (krbd) 选项部分。
- --read-only
以只读方式映射镜像。等同于 -o ro。
- --image-feature feature-name
指定在创建镜像时应启用哪个 RBD 格式 2 功能。可以通过多次重复此选项来启用多个功能。支持以下功能:
layering: 分层支持
striping: 条带化 v2 支持
exclusive-lock: 独占锁定支持
object-map: 对象映射支持(需要独占锁定)
fast-diff: 快速差异计算(需要对象映射)
deep-flatten: 快照展平支持
journaling: 日志化 IO 支持(需要独占锁定)
data-pool: 擦除编码存储池支持
指定该镜像将由多个客户端并发使用。这将禁用依赖于镜像独占所有权的功能。
- --whole-object
指定差异应限制为整个对象的范围,而不是显示对象内部增量。当镜像上启用了对象映射功能时,将差异限制为对象范围将显著提高性能,因为可以通过检查内存中的对象映射而不是查询 RADOS 中的每个对象来计算差异。
- --limit
指定允许的快照数量限制。
命令
- bench --io-type <read | write | readwrite | rw> [--io-size size-in-B/K/M/G/T] [--io-threads num-ios-in-flight] [--io-total size-in-B/K/M/G/T] [--io-pattern seq | rand] [--rw-mix-read read proportion in readwrite] image-spec
对镜像生成一系列 IO 并测量 IO 吞吐量和延迟。如果未给出后缀,则 --io-size 和 --io-total 的单位都假定为 B。默认值为:--io-size 4096, --io-threads 16, --io-total 1G, --io-pattern seq, --rw-mix-read 50。
- children snap-spec
列出给定快照上镜像的克隆。这将检查每个存储池,并输出结果的 poolname/imagename。
这需要镜像格式 2。
- clone [--object-size size-in-B/K/M] [--stripe-unit size-in-B/K/M --stripe-count num] [--image-feature feature-name] [--image-shared] parent-snap-spec child-image-spec
将创建父快照的克隆(写时复制子镜像)。除非另行指定,否则对象大小将与父镜像相同。大小将与父快照相同。--stripe-unit 和 --stripe-count 参数是可选的,但必须一起使用。
父快照必须受保护(请参阅 rbd snap protect)。这需要镜像格式 2。
- config global get config-entity key
获取全局级别配置覆盖。
- config global list [--format plain | json | xml] [--pretty-format] config-entity
列出全局级别配置覆盖。
- config global set config-entity key value
设置全局级别配置覆盖。
- config global remove config-entity key
移除全局级别配置覆盖。
- config image get image-spec key
获取镜像级别配置覆盖。
- config image list [--format plain | json | xml] [--pretty-format] image-spec
列出镜像级别配置覆盖。
- config image set image-spec key value
设置镜像级别配置覆盖。
- config image remove image-spec key
移除镜像级别配置覆盖。
- config pool get pool-name key
获取存储池级别配置覆盖。
- config pool list [--format plain | json | xml] [--pretty-format] pool-name
列出存储池级别配置覆盖。
- config pool set pool-name key value
设置存储池级别配置覆盖。
- config pool remove pool-name key
移除存储池级别配置覆盖。
- cp (src-image-spec | src-snap-spec) dest-image-spec
将 src-image 的内容复制到新创建的 dest-image 中。dest-image 将与 src-image 具有相同的大小、对象大小和镜像格式。注意:快照不复制,使用 deep cp 命令包含快照。
- create (-s | --size size-in-M/G/T) [--image-format format-id] [--object-size size-in-B/K/M] [--stripe-unit size-in-B/K/M --stripe-count num] [--thick-provision] [--no-progress] [--image-feature feature-name]… [--image-shared] image-spec
将创建一个新的 rbd 镜像。您还必须通过 --size 指定大小。--stripe-unit 和 --stripe-count 参数是可选的,但必须一起使用。如果启用了 --thick-provision,它将在创建时完全分配镜像的存储空间。这将花费很长时间。注意:厚置备需要将整个镜像的内容清零。
- deep cp (src-image-spec | src-snap-spec) dest-image-spec
将 src-image 的内容深度复制到新创建的 dest-image 中。dest-image 将与 src-image 具有相同的大小、对象大小、镜像格式和快照。
- device list [-t | --device-type device-type] [--format plain | json | xml] --pretty-format
显示通过 rbd 内核模块(默认)或其他支持的设备映射的 rbd 镜像。
- device map [-t | --device-type device-type] [--cookie device-cookie] [--show-cookie] [--snap-id snap-id] [--read-only] [--exclusive] [-o | --options device-options] image-spec | snap-spec
通过 rbd 内核模块(默认)或其他支持的设备(Linux 上的 nbd 或 ubbd,或 FreeBSD 上的 ggate)将指定镜像映射到块设备。
--options 参数是逗号分隔的设备类型特定选项列表(opt1,opt2=val,…)。
- device unmap [-t | --device-type device-type] [-o | --options device-options] [--snap-id snap-id] image-spec | snap-spec | device-path
取消映射通过 rbd 内核模块(默认)或其他支持的设备映射的块设备。
--options 参数是逗号分隔的设备类型特定选项列表(opt1,opt2=val,…)。
- device attach [-t | --device-type device-type] --device device-path [--cookie device-cookie] [--show-cookie] [--snap-id snap-id] [--read-only] [--exclusive] [--force] [-o | --options device-options] image-spec | snap-spec
将指定镜像附加到指定块设备(目前仅支持 Linux 上的 nbd)。此操作不安全,不应通常使用。特别是,指定错误的镜像或错误的块设备可能导致数据损坏,因为 nbd 内核驱动程序不执行任何验证。
--options 参数是逗号分隔的设备类型特定选项列表(opt1,opt2=val,…)。
- device detach [-t | --device-type device-type] [-o | --options device-options] [--snap-id snap-id] image-spec | snap-spec | device-path
分离已映射或附加的块设备(目前仅支持 Linux 上的 nbd)。此操作不安全,不应通常使用。
--options 参数是逗号分隔的设备类型特定选项列表(opt1,opt2=val,…)。
- diff [--from-snap snap-name] [--whole-object] image-spec | snap-spec
转储镜像中自指定起始快照或自镜像创建以来已更改的字节范围列表。每行输出包括起始偏移量(字节)、区域长度(字节)以及“zero”或“data”以指示该区域是否已知为零或可能包含其他数据。
- du [-p | --pool pool-name] [image-spec | snap-spec] [--merge-snapshots]
将计算指定存储池中所有镜像及其关联快照的置备和实际磁盘使用情况。它也可以用于单个镜像和快照。
如果镜像未启用 RBD fast-diff 功能,则此操作将需要查询 OSD 以获取镜像中的每个潜在对象。
--merge-snapshots 将把快照使用的空间合并到它们的父镜像中。
- encryption format image-spec format passphrase-file [--cipher-alg alg]
将镜像格式化为加密格式。以前写入镜像的所有数据将变得不可读。支持的格式:luks1、luks2。支持的加密算法:aes-128、aes-256(默认)。
- export [--export-format format (1 or 2)] (image-spec | snap-spec) [dest-path]
将镜像导出到目标路径(使用 - 表示标准输出)。--export-format 当前接受“1”或“2”。格式 2 允许我们不仅导出镜像的内容,还导出快照和其他属性,例如 image_order、features。
- export-diff [--from-snap snap-name] [--whole-object] (image-spec | snap-spec) dest-path
将镜像的增量差异导出到目标路径(使用 - 表示标准输出)。如果指定了初始快照,则只包含自该快照以来的更改;否则,包含镜像中包含数据的任何区域。结束快照使用标准 --snap 选项或 @snap 语法(见下文)指定。镜像差异格式包含有关镜像大小更改以及起始和结束快照的元数据。它有效地表示镜像中丢弃或“零”区域。
- feature disable image-spec feature-name…
禁用指定镜像上的指定功能。可以指定多个功能。
- feature enable image-spec feature-name…
启用指定镜像上的指定功能。可以指定多个功能。
- flatten [--encryption-format encryption-format --encryption-passphrase-file passphrase-file]… image-spec
如果镜像是一个克隆,则从父快照复制所有共享块,使子镜像独立于父镜像,断开父快照与子镜像之间的链接。如果父快照没有进一步的依赖克隆,则可以取消保护并删除。
这需要镜像格式 2。
- group create group-spec
创建组。
- group image add group-spec image-spec
将镜像添加到组。
- group image list group-spec
列出组中的镜像。
- group image remove group-spec image-spec
将镜像从组中移除。
- group ls [-p | --pool pool-name]
列出 rbd 组。
- group rename src-group-spec dest-group-spec
重命名组。注意:不支持跨存储池重命名。
- group rm group-spec
删除组。
- group snap create group-snap-spec
创建组的快照。
- group snap list group-spec
列出组的快照。
- group snap info group-snap-spec
获取组快照的信息。
- group snap rm group-snap-spec
从组中删除快照。
- group snap rename group-snap-spec snap-name
重命名组的快照。
- group snap rollback group-snap-spec
将组回滚到快照。
- image-meta get image-spec key
获取具有键的元数据值。
- image-meta list image-spec
显示镜像上持有的元数据。第一列是键,第二列是值。
- image-meta remove image-spec key
移除具有值的元数据键。
- image-meta set image-spec key value
设置具有值的元数据键。它们将显示在 image-meta list 中。
- import [--export-format format (1 or 2)] [--image-format format-id] [--object-size size-in-B/K/M] [--stripe-unit size-in-B/K/M --stripe-count num] [--image-feature feature-name] [--estimated-size size-in-M/G/T]… [--image-shared] src-path [image-spec]
创建一个新镜像并从路径导入其数据(使用 - 表示标准输入)。导入操作将尝试尽可能创建稀疏 rbd 镜像。对于从标准输入导入,稀疏化单元是目标镜像的数据块大小(对象大小)。
--stripe-unit 和 --stripe-count 参数是可选的,但必须一起使用。
--export-format 当前接受“1”或“2”。格式 2 允许我们不仅导入镜像的内容,还导入快照和其他属性,例如 image_order、features。
- import-diff src-path image-spec
导入镜像的增量差异并将其应用于当前镜像。如果差异是相对于起始快照生成的,则在继续之前我们会验证该快照是否已存在。如果存在结束快照,则在应用更改之前我们会验证它是否不存在,并在完成后创建快照。
- info image-spec | snap-spec
将转储有关特定 rbd 镜像的信息(例如大小和对象大小)。如果镜像是一个克隆,还会显示其父镜像的信息。如果指定了快照,还会显示它是否受保护。
- journal client disconnect journal-spec
将镜像日志客户端标记为已断开连接。
- journal export [--verbose] [--no-error] src-journal-spec path-name
将镜像日志导出到路径(使用 - 表示标准输出)。它可以用于备份镜像日志,尤其是在尝试危险操作之前。
请注意,如果日志严重损坏,此命令可能无法始终有效。
- journal import [--verbose] [--no-error] path-name dest-journal-spec
从路径导入镜像日志(使用 - 表示标准输入)。
- journal info journal-spec
显示镜像日志信息。
- journal inspect [--verbose] journal-spec
检查并报告镜像日志的结构错误。
- journal reset journal-spec
重置镜像日志。
- journal status journal-spec
显示镜像日志状态。
- lock add [--shared lock-tag] image-spec lock-id
锁定镜像。lock-id 是用户方便的任意名称。默认情况下,这是独占锁,这意味着如果镜像已被锁定,它将失败。--shared 选项会更改此行为。请注意,锁定除了添加锁之外不影响任何操作。它不保护镜像免于被删除。
- lock ls image-spec
显示镜像上持有的锁。第一列是与 lock remove 命令一起使用的锁持有者。
- lock rm image-spec lock-id locker
释放镜像上的锁。锁 ID 和锁持有者由 lock ls 输出。
- ls [-l | --long] [pool-name]
将列出 rbd_directory 对象中列出的所有 rbd 镜像。使用 -l 还会显示快照,并使用更长格式的输出,包括大小、父级(如果是克隆)、格式等。
- merge-diff first-diff-path second-diff-path merged-diff-path
将镜像的两个连续增量差异合并为一个单一差异。第一个差异的结束快照必须与第二个差异的起始快照相等。第一个差异可以是 - 用于标准输入,合并的差异可以是 - 用于标准输出,这允许使用类似 'rbd merge-diff first second - | rbd merge-diff - third result' 的方式合并多个差异文件。请注意,此命令目前仅支持 stripe-count == 1 的源增量差异。
- migration abort image-spec
取消镜像迁移。此步骤可在迁移准备或迁移执行步骤成功或失败后运行,并将镜像返回到其初始(迁移前)状态。对目标镜像的所有修改都将丢失。
- migration commit image-spec
提交镜像迁移。此步骤在迁移准备和迁移执行步骤成功后运行,并删除源镜像数据。
- migration execute image-spec
执行镜像迁移。此步骤在迁移准备步骤成功后运行,并将镜像数据复制到目标。
- migration prepare [--order order] [--object-size object-size] [--image-feature image-feature] [--image-shared] [--stripe-unit stripe-unit] [--stripe-count stripe-count] [--data-pool data-pool] [--import-only] [--source-spec json] [--source-spec-path path] src-image-spec [dest-image-spec]
准备镜像迁移。这是迁移镜像的第一步,即更改镜像位置、格式或其他无法动态更改的参数。目标可以与源匹配,在这种情况下可以省略 dest-image-spec。此步骤之后,源镜像被设置为目标镜像的父镜像,并且镜像可以通过其目标规范以写时复制模式访问。
还可以通过添加 --import-only 选项并通过 --source-spec 或使用 --source-spec-path 选项提供 JSON 编码的源规范文件路径来从只读导入源迁移镜像。
- mirror image demote image-spec
将 RBD 镜像的主镜像降级为非主镜像。
- mirror image disable [--force] image-spec
禁用镜像的 RBD 镜像功能。如果镜像的存储池配置为
image模式,则必须为每个镜像单独禁用。- mirror image enable image-spec mode
启用镜像的 RBD 镜像功能。如果镜像的存储池配置为
image模式,则必须为每个镜像单独启用。镜像模式可以是
journal(默认)或snapshot。journal模式需要 RBD 日志功能。- mirror image promote [--force] image-spec
将 RBD 镜像的非主镜像升级为主镜像。
- mirror image resync image-spec
强制将 RBD 镜像重新同步到主镜像。
- mirror image status image-spec
显示镜像的 RBD 镜像状态。
- mirror pool demote [pool-name]
将存储池或命名空间中的所有主镜像降级为非主镜像。存储池或命名空间中所有启用镜像的镜像都将降级。
- mirror pool disable [pool-name]
禁用存储池或命名空间中的 RBD 镜像功能。以这种方式禁用存储池或命名空间上的镜像功能时,所有已启用镜像功能(无论是默认启用还是显式启用)的镜像(在存储池或命名空间内)的镜像功能也将被禁用。
- mirror pool enable pool-name mode [--remote-namespace remote-namespace-name]
在存储池或命名空间中启用 RBD 镜像。镜像模式可以是
pool或image。如果配置为pool模式,则存储池或命名空间中所有启用了日志功能的镜像都将被镜像。如果配置为image模式,则需要在每个镜像上显式启用镜像(通过mirror image enable命令)。可以使用--remote-namespace选项将命名空间镜像到远程存储池上的不同命名空间。- mirror pool info [pool-name]
显示存储池或命名空间镜像配置的信息。对于存储池和命名空间,它包括镜像模式、镜像 UUID 和远程命名空间。对于存储池,它还包括站点名称、对等 UUID、远程集群名称和远程客户端名称。
- mirror pool peer add [pool-name] remote-cluster-spec
向存储池添加镜像对等。remote-cluster-spec 为 [remote client name@]remote cluster name。
remote client name 的默认值为“client.admin”。
这要求在存储池上启用镜像。
- mirror pool peer remove [pool-name] uuid
从存储池中移除镜像对等。对等 UUID 可从
mirror pool info命令获取。- mirror pool peer set [pool-name] uuid key value
更新镜像对等设置。key 可以是
client或cluster,value 对应于远程客户端名称或远程集群名称。- mirror pool promote [--force] [pool-name]
将存储池或命名空间中的所有非主镜像升级为主镜像。存储池或命名空间中所有启用镜像的镜像都将升级。
- mirror pool status [--verbose] [pool-name]
显示存储池或命名空间中所有镜像镜像的状态。使用
--verbose,显示存储池或命名空间中每个启用镜像的镜像的附加输出状态详细信息。- mirror snapshot schedule add [-p | --pool pool] [--namespace namespace] [--image image] interval [start-time]
添加镜像快照计划。
interval可以分别使用 d、h、m 后缀指定为天、小时或分钟。start-time是 ISO 8601 格式的时间字符串。不提供--pool、--namespace和--image选项将创建一个全局计划,该计划适用于集群中所有启用镜像的镜像。- mirror snapshot schedule list [-R | --recursive] [--format format] [--pretty-format] [-p | --pool pool] [--namespace namespace] [--image image]
列出镜像快照计划。
- mirror snapshot schedule remove [-p | --pool pool] [--namespace namespace] [--image image] interval [start-time]
移除镜像快照计划。
- mirror snapshot schedule status [-p | --pool pool] [--format format] [--pretty-format] [--namespace namespace] [--image image]
显示镜像快照计划状态。
- mv src-image-spec dest-image-spec
重命名镜像。注意:不支持跨存储池重命名。
- namespace create pool-name/namespace-name
在存储池中创建新的镜像命名空间。
- namespace list pool-name
列出存储池中定义的镜像命名空间。
- namespace remove pool-name/namespace-name
从存储池中移除空的镜像命名空间。
- object-map check image-spec | snap-spec
验证对象映射是否正确。
- object-map rebuild image-spec | snap-spec
重建指定镜像的无效对象映射。可以指定镜像快照以重建快照的无效对象映射。
- pool init [pool-name] [--force]
初始化存储池以供 RBD 使用。新创建的存储池在使用前必须进行初始化。
- resize (-s | --size size-in-M/G/T) [--allow-shrink] [--encryption-format encryption-format --encryption-passphrase-file passphrase-file]… image-spec
调整 rbd 镜像大小。还需要指定 size 参数。--allow-shrink 选项允许减小大小。
- rm image-spec
删除 rbd 镜像(包括所有数据块)。如果镜像有快照,则此操作失败,不会删除任何内容。
- snap create snap-spec
创建新快照。需要指定快照名称参数。
- snap limit clear image-spec
移除以前在镜像上设置的快照数量限制。
- snap limit set [--limit] limit image-spec
设置镜像上允许的快照数量限制。
- snap ls image-spec
转储特定镜像的快照列表。
- snap protect snap-spec
保护快照免于删除,以便可以从它创建克隆(请参阅 rbd clone)。快照必须在创建克隆之前受保护;保护意味着存在引用此快照的依赖克隆子镜像。rbd clone 将在未受保护的快照上失败。
这需要镜像格式 2。
- snap purge image-spec
从镜像中删除所有未受保护的快照。
- snap rename src-snap-spec dest-snap-spec
重命名快照。注意:不支持跨存储池和镜像重命名。
- snap rm [--force] snap-spec
移除指定的快照。
- snap rollback snap-spec
将镜像内容回滚到快照。这将遍历整个块数组并将数据头内容更新为快照版本。
- snap unprotect snap-spec
取消保护快照免于删除(撤消 snap protect)。如果仍然存在克隆子镜像,snap unprotect 会失败。(请注意,克隆可能存在于与父快照不同的存储池中。)
这需要镜像格式 2。
- sparsify [--sparse-size sparse-size] image-spec
回收清零镜像范围的空间。默认稀疏大小为 4096 字节,可以通过 --sparse-size 选项更改,但有以下限制:它应该是 2 的幂,不小于 4096,不大于镜像对象大小。
- status image-spec
显示镜像的状态,包括哪些客户端打开了它。
- trash ls [pool-name]
列出垃圾箱中的所有条目。
- trash mv [--expires-at <expires-at>] image-spec
将镜像移动到回收站。镜像,甚至正在被克隆积极使用的镜像,都可以移动到回收站并在以后删除。使用
--expires-at设置镜像的过期时间,之后才允许删除。- trash purge [pool-name]
从回收站中删除所有过期的镜像。
- trash restore image-id
从回收站恢复镜像。
- trash rm [--force] image-id
从回收站中删除镜像。如果镜像的延迟删除时间尚未到期,可以使用
--force强制删除。正在被克隆积极使用或具有快照的镜像无法删除。- trash purge schedule add [-p | --pool pool] [--namespace namespace] interval [start-time]
添加回收站清除计划。
- trash purge schedule list [-R | --recursive] [--format format] [--pretty-format] [-p | --pool pool] [--namespace namespace]
列出回收站清除计划。
- trash purge schedule remove [-p | --pool pool] [--namespace namespace] interval [start-time]
移除回收站清除计划。
- trash purge schedule status [-p | --pool pool] [--format format] [--pretty-format] [--namespace namespace]
显示回收站清除计划状态。
- watch image-spec
监视镜像上的事件。
镜像、快照、组和日志规范
pool-name 的默认值为“rbd”,namespace-name 的默认值为“”。如果镜像名称包含斜杠字符 (‘/’),则需要 pool-name。
journal-name 是 image-id。
您可以单独指定每个名称,使用 --pool、--namespace、--image 和 --snap 选项,但不建议使用,而是推荐上述规范语法。
条带化
RBD 镜像通过许多对象进行条带化,这些对象然后由 Ceph 分布式对象存储 (RADOS) 存储。因此,镜像的读写请求分布在集群中的许多节点上,通常可以防止单个节点在单个镜像变大或繁忙时成为瓶颈。
条带化由三个参数控制
- object-size
我们条带化的对象大小是 2 的幂。它将向上舍入到最接近的 2 的幂。默认对象大小为 4 MB,最小为 4K,最大为 32M。
- stripe-unit
在移动到下一个对象之前,每个 [stripe-unit] 连续字节存储在同一个对象中。
- stripe-count
在我们将 [stripe-unit] 字节写入 [stripe-count] 个对象后,我们循环回初始对象并写入另一个条带,直到对象达到其最大大小。此时,我们继续到接下来的 [stripe-count] 个对象。
默认情况下,[stripe-unit] 与对象大小相同,[stripe-count] 为 1。指定不同的 [stripe-unit] 和/或 [stripe-count] 通常被称为使用“花式”条带化,并且需要格式 2。
内核 rbd (krbd) 选项
这些选项大部分主要用于调试和基准测试。默认值在内核中设置,因此可能取决于正在运行的内核版本。
每个客户端实例 rbd device map 选项
fsid=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee - 客户端应假定的 FSID。
ip=a.b.c.d[:p] - 客户端应使用的 IP 和可选端口。
share - 启用客户端实例与其他映射的共享(默认)。
noshare - 禁用客户端实例与其他映射的共享。
crc - 为 msgr1 联机协议启用 CRC32C 校验和(默认)。对于 msgr2.1 协议,此选项被忽略:在“crc”模式下始终开启完整校验和,在“secure”模式下始终关闭。
nocrc - 为 msgr1 联机协议禁用 CRC32C 校验和。请注意,仅禁用负载校验和,头部校验和始终开启。对于 msgr2.1 协议,此选项被忽略。
cephx_require_signatures - 要求 msgr1 消息签名功能(自 3.19 起,默认)。此选项已弃用,将来会删除,因为自 Bobtail 版本以来该功能已受支持。
nocephx_require_signatures - 不要求 msgr1 消息签名功能(自 3.19 起)。此选项已弃用,将来会删除。
tcp_nodelay - 在客户端套接字上禁用 Nagle 算法(自 4.0 起,默认)。
notcp_nodelay - 在客户端套接字上启用 Nagle 算法(自 4.0 起)。
cephx_sign_messages - 为 msgr1 联机协议启用消息签名(自 4.4 起,默认)。对于 msgr2.1 协议,此选项被忽略:消息签名内置于“secure”模式,在“crc”模式下不提供。
nocephx_sign_messages - 为 msgr1 联机协议禁用消息签名(自 4.4 起)。对于 msgr2.1 协议,此选项被忽略。
mount_timeout=x - rbd device map 和 rbd device unmap 序列中各个步骤的超时时间(默认 60 秒)。特别是,自 4.2 起,当与集群没有网络连接时,这可用于确保 rbd device unmap 最终超时。
osdkeepalive=x - OSD 保持活动超时(默认 5 秒)。
osd_idle_ttl=x - OSD 空闲 TTL(默认 60 秒)。
每个映射(块设备)rbd device map 选项
rw - 以读写方式映射镜像(默认)。被 --read-only 覆盖。
ro - 以只读方式映射镜像。等同于 --read-only。
queue_depth=x - 队列深度(自 4.2 起,默认 128 个请求)。
lock_on_read - 除了写入和丢弃外,在读取时获取独占锁(自 4.9 起)。
exclusive - 禁用自动独占锁转换(自 4.12 起)。等同于 --exclusive。
lock_timeout=x - 等待获取独占锁的超时时间(自 4.17 起,默认 0 秒,表示无超时)。
notrim - 关闭丢弃和写入零卸载支持,以避免取消完全置备的镜像的置备(自 4.17 起)。启用后,丢弃请求将以 -EOPNOTSUPP 失败,写入零请求将回退到手动清零。
abort_on_full - 当集群已满或数据池达到其配额时,以 -ENOSPC 失败写入请求(自 5.0 起)。默认行为是阻塞直到清除满状态。
alloc_size - 底层 OSD 对象存储后端的最小分配单元(自 5.1 起,默认 64K 字节)。这用于舍入并丢弃太小的丢弃。对于 bluestore,建议的设置是 bluestore_min_alloc_size(目前所有类型的驱动器都设置为 4K,以前硬盘驱动器设置为 64K,固态硬盘设置为 16K)。对于 filestore 且 filestore_punch_hole = false,建议的设置是镜像对象大小(通常为 4M)。
crush_location=x - 根据 CRUSH 层次结构指定客户端的位置(自 5.8 起)。这是一组键值对,由“|”分隔,键与值由“:”分隔。请注意,“|”可能需要引用或转义,以避免被 shell 解释为管道。键是存储桶类型名称(例如,使用默认存储桶类型的 rack、datacenter 或 region),值是存储桶名称。例如,要指示客户端位于机架“myrack”、数据中心“mydc”和区域“myregion”
crush_location=rack:myrack|datacenter:mydc|region:myregion
每个键值对都是独立的:“myrack”不需要位于“mydc”中,“mydc”反过来也不需要位于“myregion”中。该位置不是到层次结构根的路径,而是一组独立匹配的节点,这归因于存储桶名称在 CRUSH 映射中是唯一的。“多路径”位置受支持,因此可以指示多个并行层次结构的位置。
crush_location=rack:myrack1|rack:myrack2|datacenter:mydc
read_from_replica=no - 禁用副本读取,始终选择主 OSD(自 5.8 起,默认)。
read_from_replica=balance - 在复制池上发出读取时,随机选择一个 OSD 来提供服务(自 5.8 起)。
此模式仅在 Octopus(即“ceph osd require-osd-release octopus”之后)之后才可安全用于一般用途。否则,它应仅限于只读工作负载,例如处处映射为只读的镜像或快照。
read_from_replica=localize - 在复制池上发出读取时,选择最本地的 OSD 来提供服务(自 5.8 起)。本地性度量是根据客户端的位置(由 crush_location 给出)计算的;具有最低值存储桶类型的匹配获胜。例如,对于默认存储桶类型,匹配机架中的 OSD 比匹配数据中心中的 OSD 更近,后者又比匹配区域中的 OSD 更近。
此模式仅在 Octopus(即“ceph osd require-osd-release octopus”之后)之后才可安全用于一般用途。否则,它应仅限于只读工作负载,例如处处映射为只读的镜像或快照。
compression_hint=none - 不设置压缩提示(自 5.8 起,默认)。
compression_hint=compressible - 向底层 OSD 对象存储后端提示数据可压缩,启用被动模式下的压缩(自 5.8 起)。
compression_hint=incompressible - 向底层 OSD 对象存储后端提示数据不可压缩,禁用主动模式下的压缩(自 5.8 起)。
ms_mode=legacy - 使用 msgr1 联机协议(自 5.11 起)。
ms_mode=crc - 使用 msgr2.1 联机协议,选择“crc”模式,也称为纯模式(自 5.11 起)。如果守护程序拒绝“crc”模式,则连接失败。
ms_mode=secure - 使用 msgr2.1 联机协议,选择“secure”模式(自 5.11 起)。“secure”模式提供完整的传输中加密,确保机密性和真实性。如果守护程序拒绝“secure”模式,则连接失败。
ms_mode=prefer-crc - 使用 msgr2.1 联机协议,选择“crc”模式(自 5.11 起,默认)。如果守护程序拒绝“crc”模式而支持“secure”模式,则同意“secure”模式。
ms_mode=prefer-secure - 使用 msgr2.1 联机协议,选择“secure”模式(自 5.11 起)。如果守护程序拒绝“secure”模式而支持“crc”模式,则同意“crc”模式。
rxbounce - 接收数据时使用弹跳缓冲区(自 5.17 起)。默认行为是直接读入目标缓冲区。如果目标缓冲区不能保证稳定(即在读取时保持不变),则需要弹跳缓冲区。在 Windows 中尤其如此,其中系统范围的“虚拟”(一次性)页面可能会映射到目标缓冲区中,以生成单个大 I/O。否则,可能会出现“libceph: ... bad crc/signature”或“libceph: ... integrity error, bad crc”错误以及相关的性能下降。
udev - 等待 udev 设备管理器完成执行所有匹配的“add”规则并释放设备后退出(默认)。此选项不传递给内核。
noudev - 不等待 udev 设备管理器。启用后,设备在退出时可能无法立即完全使用。
rbd device unmap 选项
force - 强制解除映射已打开的块设备(自 4.9 起)。驱动程序将等待正在运行的请求完成,然后解除映射;在启动解除映射后发送到驱动程序的请求将失败。
udev - 等待 udev 设备管理器完成执行所有匹配的“remove”规则并清理设备后退出(默认)。此选项不传递给内核。
noudev - 不等待 udev 设备管理器。
示例
创建一个 100 GB 的新 rbd 镜像
rbd create mypool/myimage --size 102400
使用非默认对象大小 (8 MB)
rbd create mypool/myimage --size 102400 --object-size 8M
删除一个 rbd 镜像(小心!)
rbd rm mypool/myimage
创建一个新快照
rbd snap create mypool/myimage@mysnap
创建受保护快照的写时复制克隆
rbd clone mypool/myimage@mysnap otherpool/cloneimage
查看快照存在哪些克隆
rbd children mypool/myimage@mysnap
删除快照
rbd snap rm mypool/myimage@mysnap
通过内核映射镜像,并启用 cephx
rbd device map mypool/myimage --id admin --keyfile secretfile
通过内核映射镜像,使用不同于默认 ceph 的集群名称
rbd device map mypool/myimage --cluster cluster-name
解除映射镜像
rbd device unmap /dev/rbd0
创建镜像并从中克隆
rbd import --image-format 2 image mypool/parent
rbd snap create mypool/parent@snap
rbd snap protect mypool/parent@snap
rbd clone mypool/parent@snap otherpool/child
创建具有较小条带单元的镜像(以便在某些工作负载中更好地分配小写入)
rbd create mypool/myimage --size 102400 --stripe-unit 65536B --stripe-count 16
将镜像从一种镜像格式更改为另一种镜像格式,导出它,然后以所需的镜像格式导入它
rbd export mypool/myimage@snap /tmp/img
rbd import --image-format 2 /tmp/img mypool/myimage2
锁定镜像以供独占使用
rbd lock add mypool/myimage mylockid
释放锁
rbd lock remove mypool/myimage mylockid client.2485
列出回收站中的镜像
rbd trash ls mypool
延迟删除镜像(使用 --expires-at 设置过期时间,默认是现在)
rbd trash mv mypool/myimage --expires-at "tomorrow"
从回收站中删除镜像(小心!)
rbd trash rm mypool/myimage-id
强制从回收站中删除镜像(小心!)
rbd trash rm mypool/myimage-id --force
从回收站恢复镜像
rbd trash restore mypool/myimage-id
从回收站恢复镜像并重命名
rbd trash restore mypool/myimage-id --image mynewimage
为镜像创建镜像快照计划
rbd mirror snapshot schedule add --pool mypool --image myimage 12h 14:00:00-05:00
可用性
rbd 是 Ceph 的一部分,Ceph 是一个大规模可扩展的开源分布式存储系统。请参阅 Ceph 文档 https://docs.ceph.net.cn 获取更多信息。