注意
本文档适用于 Ceph 的开发版本。
配置设置
有关更多详细信息,请参阅块设备。
通用IO设置
- rbd_compression_hint
向 OSD 发送写操作提示。如果设置为
compressible且 OSDbluestore_compression_mode设置为passive,则 OSD 将尝试压缩数据。如果设置为incompressible且 OSD 压缩设置为aggressive,则 OSD 将不会尝试压缩数据。- 类型:
str- 默认值:
none- 有效选项:
nonecompressibleincompressible
- rbd_read_from_replica_policy
确定哪个 OSD 将接收读操作的策略。如果设置为
default,则每个 PG 的主 OSD 将始终用于读操作。如果设置为balance,则读操作将发送到副本集内随机选择的 OSD。如果设置为localize,则读操作将发送到由 CRUSH 映射确定的最近的 OSD。与rbd_balance_snap_reads和rbd_localize_snap_reads或rbd_balance_parent_reads和rbd_localize_parent_reads不同,它会影响所有读操作,而不仅仅是快照或父级。注意:此功能要求集群配置的最低兼容 OSD 版本为 Octopus。- 类型:
str- 默认值:
default- 有效选项:
defaultbalancelocalize
- rbd_default_order
这配置了新镜像的默认对象大小。该值用作 2 的幂,即
default_object_size = 2 ^ rbd_default_order。配置一个介于 12 和 25(含)之间的值,转换为 4KiB 的下限和 32MiB 的上限。- 类型:
uint- 默认值:
22
缓存设置
Ceph 块设备的用户空间实现(即 librbd)无法利用 Linux 页面缓存,因此它包含自己的内存缓存,称为“RBD 缓存”。RBD 缓存的行为就像行为良好的硬盘缓存一样。当操作系统发送屏障或刷新请求时,所有脏数据都会写入 OSD。这意味着使用写回缓存就像使用行为良好的物理硬盘一样安全,前提是 VM 正确发送刷新(即 Linux 内核 >= 2.6.32)。缓存使用最近最少使用 (LRU) 算法,在写回模式下,它可以合并连续请求以获得更好的吞吐量。
librbd 缓存默认启用,并支持三种不同的缓存策略:写绕过(write-around)、写回(write-back)和写直通(write-through)。在写绕过和写回策略下,写操作会立即返回,除非有超过 rbd_cache_max_dirty 个未写入字节到存储集群。写绕过策略与写回策略的不同之处在于,它不会尝试从缓存中服务读取请求,而写回策略会,因此对于高性能写入工作负载来说速度更快。在写直通策略下,只有当数据位于所有副本的磁盘上时,写操作才会返回,但读取可以来自缓存。
在收到刷新请求之前,缓存的行为类似于写直通缓存,以确保对于不发送刷新以确保崩溃一致性行为的旧操作系统安全运行。
如果 librbd 缓存被禁用,则写入和读取直接发送到存储集群,并且只有当数据位于所有副本的磁盘上时,写入才会返回。
注意
缓存位于客户端内存中,每个 RBD 镜像都有自己的缓存。由于缓存是客户端本地的,因此如果其他客户端访问镜像,则没有一致性。在 RBD 之上运行 GFS 或 OCFS 在启用缓存时将无法工作。
RBD 的选项设置应在配置文件的 [client] 部分或中央配置存储中设置。这些设置包括
- rbd_cache
为 RADOS 块设备 (RBD) 启用缓存。
- 类型:
bool- 默认值:
true
- rbd_cache_policy
选择 librbd 的缓存策略。
- 类型:
str- 默认值:
writearound- 有效选项:
writethroughwritebackwritearound
- rbd_cache_writethrough_until_flush
最初以
writethrough模式启动,并在收到第一个刷新请求后切换到writeback。启用此功能是一种保守但安全的策略,以防在 RBD 卷上运行的 VM 太旧而无法发送刷新,例如 Linux 内核早于 2.6.32 中的virtio驱动程序。- 类型:
bool- 默认值:
true
- rbd_cache_size
每个卷的 RBD 客户端缓存大小(以字节为单位)。
- 类型:
大小- 默认值:
32Mi- policies:
write-back and write-through
- rbd_cache_max_dirty
缓存触发写回的
dirty限制(以字节为单位)。如果为0,则使用写直通缓存。- 类型:
大小- 默认值:
24Mi- constraint:
必须小于
rbd_cache_size。- policies:
write-around and write-back
- rbd_cache_target_dirty
缓存开始将数据写入数据存储之前的
dirty target。不会阻止写入缓存。- 类型:
大小- 默认值:
16Mi- constraint:
必须小于
rbd_cache_max_dirty。- policies:
write-back
- rbd_cache_max_dirty_age
脏数据在缓存中停留的秒数,超过此时间后开始写回。
- 类型:
float- 默认值:
1.0- policies:
write-back
预读设置
librbd 支持预读/预取以优化小型顺序读取。在 VM 的情况下,这通常应该由访客操作系统处理,但引导加载程序可能不会发出高效的读取。如果禁用缓存或策略为 write-around,则会自动禁用预读。
- rbd_readahead_trigger_requests
触发预读所需的顺序请求数
- 类型:
uint- 默认值:
10
- rbd_readahead_max_bytes
预读请求的最大大小。如果为零,则禁用预读。
- 类型:
大小- 默认值:
512Ki
- rbd_readahead_disable_after_bytes
从 RBD 镜像读取此字节数后,将禁用该镜像的预读,直到它关闭。这允许访客操作系统在启动后接管预读。如果为零,则预读保持启用状态。
- 类型:
大小- 默认值:
50Mi
镜像特性
RBD 支持高级特性,可以在创建镜像时通过命令行指定,或者通过 rbd_default_features = <feature numeric values sum> 或 rbd_default_features = <comma-delimited list of CLI values> 配置默认特性。
分层
- 描述:
分层启用克隆。
- 内部值:
1
- CLI 值:
layering
- 添加于:
v0.52 (Bobtail)
- KRBD 支持:
since v3.10
- 默认值:
yes
条带化 v2
- 描述:
条带化将数据分散到多个对象中。条带化有助于顺序读/写工作负载的并行性。
- 内部值:
2
- CLI 值:
striping
- 添加于:
v0.55 (Bobtail)
- KRBD 支持:
since v3.10 (仅默认条带化,“fancy”条带化添加于 v4.17)
- 默认值:
yes
排他锁
- 描述:
启用后,它要求客户端在进行写入之前获取对象的锁。排他锁只应在任何给定时间只有一个客户端访问镜像时启用。
- 内部值:
4
- CLI 值:
exclusive-lock
- 添加于:
v0.92 (Hammer)
- KRBD 支持:
since v4.9
- 默认值:
yes
对象映射
- 描述:
对象映射支持依赖于排他锁支持。块设备是精简配置的,这意味着它们只存储实际写入的数据,即它们是 稀疏的。对象映射支持有助于跟踪哪些对象实际存在(设备上存储了数据)。启用对象映射支持可以加快克隆、导入和导出稀疏填充镜像以及删除的 I/O 操作。
- 内部值:
8
- CLI 值:
object-map
- 添加于:
v0.93 (Hammer)
- KRBD 支持:
since v5.3
- 默认值:
yes
快速差异
- 描述:
快速差异支持依赖于对象映射支持和排他锁支持。它为对象映射添加了另一个属性,这使得生成镜像快照之间的差异要快得多。计算快照或卷的实际数据使用量(
rbd du)也快得多。- 内部值:
16
- CLI 值:
fast-diff
- 添加于:
v9.0.1 (Infernalis)
- KRBD 支持:
since v5.3
- 默认值:
yes
深度展平
- 描述:
深度展平使
rbd flatten可以在镜像本身之外对镜像的所有快照起作用。没有它,镜像的快照仍将依赖于父级,因此在快照被删除之前不能删除父级。深度展平使父级独立于其克隆,即使它们有快照,代价是使用额外的 OSD 设备空间。- 内部值:
32
- CLI 值:
deep-flatten
- 添加于:
v9.0.2 (Infernalis)
- KRBD 支持:
since v5.1
- 默认值:
yes
日志记录
- 描述:
日志记录支持依赖于排他锁支持。日志记录按发生的顺序记录对镜像的所有修改。RBD 镜像可以使用日志将崩溃一致的镜像复制到远程集群。最好让
rbd-mirror仅在需要时管理此功能,因为长期启用它可能会导致大量的额外 OSD 空间消耗。- 内部值:
64
- CLI 值:
journaling
- 添加于:
v10.0.1 (Jewel)
- KRBD 支持:
no
- 默认值:
no
数据池
- 描述:
在纠删码池上,镜像数据块对象需要存储在与镜像元数据不同的池上。
- 内部值:
128
- 添加于:
v11.1.0 (Kraken)
- KRBD 支持:
since v4.11
- 默认值:
no
操作
- 描述:
用于限制较旧的客户端对镜像执行某些维护操作(例如克隆、创建快照)。
- 内部值:
256
- 添加于:
v13.0.2 (Mimic)
- KRBD 支持:
since v4.16
迁移
- 描述:
用于限制较旧的客户端在镜像处于迁移状态时打开镜像。
- 内部值:
512
- 添加于:
v14.0.1 (Nautilus)
- KRBD 支持:
no
非主镜像
- 描述:
用于限制使用基于快照的镜像对非主镜像进行更改。
- 内部值:
1024
- 添加于:
v15.2.0 (Octopus)
- KRBD 支持:
no
克隆设置
- rbd_default_clone_format
这设置了用于跟踪克隆镜像的内部格式。值
1要求附加到受保护的快照,直到克隆被删除或展平才能删除。值2允许克隆附加到任何快照,并允许删除使用中的父快照,但需要 Mimic 或更高版本的客户端。如果集群配置为需要 Mimic 或更高版本的客户端,则默认值auto将使用 v2 格式。- 类型:
str- 默认值:
auto- 有效选项:
12auto
QoS设置
librbd 支持通过多种方式限制每个镜像的 IO。这些限制都适用于给定进程中的给定镜像——在多个地方使用的同一个镜像(例如两个独立的 VM)将具有独立的限制。
IOPS: 每秒 I/O 操作次数(任何类型的 I/O)
read IOPS: 每秒读取 I/O 操作次数
write IOPS: 每秒写入 I/O 操作次数
bps: 每秒字节数(任何类型的 I/O)
read bps: 每秒读取字节数
write bps: 每秒写入字节数
这些限制中的每一个都独立运行。它们默认都处于关闭状态。每种类型的限制都使用令牌桶算法来限制 I/O,能够配置限制(随时间的平均速度)和短期内更高速率(突发)的潜力(burst_seconds)。当达到这些限制中的任何一个并且没有剩余的突发容量时,librbd 会将该类型 I/O 的速率降低到限制。
例如,如果配置了 100MB 的读取 bps 限制,但写入没有限制,则写入可以尽可能快地进行,而读取将平均限制在 100MB/s。如果设置了 150MB 的读取 bps 突发,并且将读取突发秒数设置为五秒,则读取可以以 150MB/s 的速度进行长达五秒,然后回落到 100MB/s 的限制。
以下选项配置这些限制
- rbd_qos_iops_limit
每秒 I/O 操作的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_iops_burst
I/O 操作的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_iops_burst_seconds
I/O 操作的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_read_iops_limit
每秒读取操作的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_read_iops_burst
读取操作的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_read_iops_burst_seconds
读取操作的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_write_iops_limit
每秒写入操作的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_write_iops_burst
写入操作的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_write_iops_burst_seconds
写入操作的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_bps_limit
每秒 I/O 字节的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_bps_burst
I/O 字节的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_bps_burst_seconds
I/O 字节的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_read_bps_limit
每秒读取字节的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_read_bps_burst
读取字节的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_read_bps_burst_seconds
读取字节的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_write_bps_limit
每秒写入字节的期望限制
- 类型:
uint- 默认值:
0
- rbd_qos_write_bps_burst
写入字节的期望突发限制
- 类型:
uint- 默认值:
0
- rbd_qos_write_bps_burst_seconds
写入字节的期望突发持续时间(以秒为单位)
- 类型:
uint- 默认值:
1- min:
1
- rbd_qos_schedule_tick_min
这确定了如果达到限制,I/O 可以解除阻塞的最短时间(以毫秒为单位)。对于令牌桶算法而言,这是将令牌添加到桶中的最小时间间隔。
- 类型:
uint- 默认值:
50- min:
1
- rbd_qos_exclude_ops
可选地将操作从 QoS 中排除。此设置接受整数位掩码值或逗号分隔的操作名称字符串。此设置始终在内部存储为整数位掩码值。操作位掩码值与操作名称的映射如下:+1 -> read, +2 -> write, +4 -> discard, +8 -> write_same, +16 -> compare_and_write
- 类型:
str