7.3. 缓存设置
Ceph 块设备的用户空间实施(即 librbd
)无法利用 Linux 页面缓存,因此它包含自己的内存缓存,称为 RBD 缓存
。RBD 缓存的行为与行为良好的硬盘缓存一样。当操作系统发送障碍或清空请求时,所有脏数据都会写入 OSD。这意味着,使用回写缓存的安全性与使用带有正确发送清除的虚拟机(即 Linux 内核 >= 2.6.32)的良好物理硬盘一样安全。缓存使用最早使用 (LRU) 算法,在回写模式中,它可以联合相邻的请求来获得更好的吞吐量。
Ceph 支持 RBD 的回写缓存。若要启用它,请将 rbd cache = true
添加到 ceph.conf
文件的 [client]
部分。默认情况下,librbd
不执行任何缓存。写入和读取直接进入存储集群,只有数据处于所有副本的磁盘中时写入才会返回。启用缓存后,写入会立即返回,除非存在超过 rbd cache max dirty
unflushed 字节。在这种情况下,写入会触发回写和块,直到清空了足够字节。
Ceph 支持 RBD 的直写缓存。您可以设置缓存的大小,您可以设置从回写缓存切换到通过缓存进行写入的目标和限制。要启用直写模式,请将 rbd cache max dirty
设置为 0。这意味着,只有在数据处于所有副本的磁盘上时写入才会返回,但读取可能来自缓存。缓存位于客户端上的内存中,每个 RBD 镜像都有自己的内存中。由于缓存对客户端而言是本地的,如果其他人访问该镜像,则没有一致性。在 RBD 上运行 GFS 或 OCFS 不适用于启用缓存。
RBD 的 ceph.conf
文件设置应在配置文件的 [client]
部分中设置。设置包括:
- RBD 缓存
- 描述
- 为 RADOS 块设备 (RBD) 启用缓存。
- 类型
- 布尔值
- 必需
- 否
- 默认
-
true
- RBD 缓存大小
- 描述
- 以字节为单位的 RBD 缓存大小。
- 类型
- 64 位整数
- 必填
- 否
- 默认
-
32 MiB
- RBD 缓存最大脏
- 描述
-
以字节为单位的
脏
限制,达到时缓存将触发回写。如果为0
,则使用直写缓存。 - 类型
- 64 位整数
- 必填
- 否
- 约束
-
必须小于
rbd 缓存大小
。 - 默认
-
24 MiB
- RBD 缓存目标脏
- 描述
-
缓存开始将数据写入数据存储前的
脏目标
。不要阻止写入到缓存。 - 类型
- 64 位整数
- 必填
- 否
- 约束
-
必须小于
rbd cache max dirty
。 - 默认
-
16 MiB
- RBD 缓存最大脏年龄
- 描述
- 在开始回写前,脏数据在缓存中的秒数。
- 类型
- 浮点值
- 必填
- 否
- 默认
-
1.0
- rbd_cache_max_dirty_object
- 描述
-
对象的脏限制 - 设为
0
,用于从rbd_cache_size
自动计算。 - 类型
- 整数
- 默认
-
0
- rbd_cache_block_writes_upfront
- 描述
-
如果为
true
,它将在aio_write
调用完成前阻止写入缓存。如果为false
,它将在调用aio_completion
之前阻止。 - 类型
- 布尔值
- 默认
-
false
- RBD 缓存写入,直到清除
- 描述
- 以直写模式开始,并在收到第一个 flush 请求后切换到回写模式。如果 rbd 上运行的虚拟机太旧而无法发送清空,如 Linux 中的 virtio 驱动程序 2.6.32 之前,启用此设置比较保守,但安全设置。
- 类型
- 布尔值
- 必需
- 否
- 默认
-
true