微信公众号:运维开发故事 作者:wanger

在 Ceph 分布式存储系统中,缓存池(cache pool)是一种特殊的存储池,用于提升数据访问速度。缓存池通常用于将热点数据(frequently accessed data)缓存在更快速的存储设备上,如 SSD,以提高读取性能。以下是关于 Ceph 缓存池的详细信息:

1. 缓存池的工作原理

缓存池通过创建一个逻辑层,将热点数据从较慢的存储介质(如 HDD)移动到更快速的存储介质(如 SSD)。当客户端请求数据时,首先在缓存池中查找,如果命中缓存,则直接返回数据,否则从后端存储池获取数据,并将数据写入缓存池以备后续访问。


由于长期无人维护,缓存分层在 Reef 版本中已被弃用。

2. 缓存池的类型

Ceph 支持多种缓存策略,包括:

只读缓存(Read Cache)

特点:

  • 缓存类型:只读缓存主要用于加速读操作。它将读取的数据缓存在缓存池中,以提高后续读请求的响应速度。
  • 数据一致性:由于是只读缓存,所有写操作都会直接写入主存储池,而不会影响缓存池的数据。因此,数据的一致性由主存储池保证。
  • 适用场景:适合读多写少的场景,例如视频点播、静态内容分发等。

工作原理:

  • 当客户端发出读请求时,首先检查缓存池中是否有该数据。
  • 如果缓存池中有数据,则直接从缓存池读取,速度较快。
  • 如果缓存池中没有数据,则从主存储池中读取数据,并将该数据缓存到缓存池中,以便后续请求可以直接从缓存池中读取。

写回缓存(Writeback Cache)

特点:

  • 缓存类型:写回缓存用于加速写操作。写操作首先写入缓存池,再异步地将数据写入主存储池。这种方式可以显著提高写操作的性能。
  • 数据一致性:由于写操作首先写入缓存池,缓存池中的数据在某些情况下可能与主存储池不同步。因此,需要确保缓存池的数据最终会写回到主存储池中以保证数据一致性。
  • 适用场景:适合写多读少的场景,例如日志写入、高速写入需求的数据库等。

工作原理:

  • 当客户端发出写请求时,数据首先写入缓存池,并立即返回成功状态。
  • 缓存池中的数据会在后台异步地写入主存储池。
  • 读请求仍然可以从缓存池中读取最新的数据,因为写操作已更新缓存池。

3. 配置缓存池

配置 Ceph 缓存池的步骤包括创建缓存池和关联缓存池与后端存储池。以下是基本的配置步骤:

1. 创建缓存池

ceph osd pool create my_cache_pool 128

2. 将缓存池添加到基础池libvirt-pool的前端,并设置缓存类型为写回缓存

ceph osd tier add libvirt-pool cache_pool
ceph osd tier cache-mode cache_pool writeback

3. 将缓存池与后端存储池关联

这个命令用于将客户端的数据读写请求重新定向到缓存池上

ceph osd tier set-overlay libvirt-pool cache_pool

4. 启用回写缓存(可选)

ceph osd pool set cache_pool hit_set_type bloom
ceph osd pool set cache_pool hit_set_count 1
ceph osd pool set cache_pool hit_set_period 3600
ceph osd pool set cache_pool target_max_bytes 10737418240
ceph osd pool set cache_pool target_max_objects 10000
ceph osd pool set cache_pool min_read_recency_for_promote 1
ceph osd pool set cache_pool min_write_recency_for_promote 1
ceph osd pool set cache_pool min_read_recency 1
ceph osd pool set cache_pool min_write_recency 1
ceph osd pool set cache_pool target_dirty_ratio 0.4
ceph osd pool set cache_pool cache_target_dirty_high_ratio 0.6
ceph osd pool set cache_pool cache_target_full_ratio 0.8

配置crush class

在 Ceph 中创建缓存池(cache pool)后,数据是否会默认存储到固态盘(SSD)上的 OSD(对象存储守护进程)取决于缓存池的配置和 Ceph 的 CRUSH映射规则。默认情况下,缓存池不会自动将数据存储到特定的设备(如 SSD 上的 OSD)。为了确保缓存池的数据存储在 SSD 上,需要手动修改 CRUSH 规则。

需要确保有一个 CRUSH 规则将缓存池的数据存储到 SSD 上的 OSD。如果没有现成的规则,可以创建一个新的 CRUSH 规则:

查看现有的 CRUSH 规则:

ceph osd crush rule dump

创建新的 CRUSH 规则(假设已经有 SSD 类型的设备标记):

这里没有将固态盘识别为ssd的class,需要手动修改他的crush class

获取当前crushmap并反编译它

ceph osd getcrushmap -o crushmapdump
crushtool -d crushmapdump -o crushmapdump-decompiled

将20-24的osd修改为ssd的class,并创建crush rule

vim crushmapdump-decompiled
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd
device 12 osd.12 class hdd
device 13 osd.13 class hdd
device 14 osd.14 class hdd
device 15 osd.15 class hdd
device 16 osd.16 class hdd
device 17 osd.17 class hdd
device 18 osd.18 class hdd
device 19 osd.19 class hdd
device 20 osd.20 class ssd
device 21 osd.21 class ssd
device 22 osd.22 class ssd
device 23 osd.23 class ssd
device 24 osd.24 class ssd

rule replicated_hdd {
    id 1
    type replicated
    min_size 1
    max_size 10
    step take default class hdd
    step chooseleaf firstn 0 type host
    step emit
}
rule replicated_ssd {
    id 2
    type replicated
    min_size 1
    max_size 10
    step take default class ssd
    step chooseleaf firstn 0 type host
    step emit
}

或者

ceph osd crush rule create-replicated replicated_ssd default host ssd
ceph osd crush rule create-replicated replicated_hdd default host hdd

image.png

将缓存池绑定到新创建的 CRUSH 规则

root@node4:~# ceph osd pool set cache_pool crush_rule replicated_ssd
set pool 3 crush_rule to replicated_ssd
root@node4:~# ceph osd pool set libvirt-pool crush_rule replicated_hdd
set pool 2 crush_rule to replicated_hdd

验证缓存池和数据池在不同的rule上

通过上述步骤,可以确保缓存池数据存储在指定的 SSD 设备上,提高访问速度和性能。

删除缓存池

删除缓存层的方法取决于它是写回缓存还是只读缓存。

删除只读缓存

由于只读缓存没有修改的数据,因此可以禁用并删除它而不会丢失缓存中对象的任何最近更改。将缓存模式更改为以none禁用它:

ceph osd tier cache-mode cache_pool none

解除与数据池的绑定

ceph osd tier remove libvirt-pool cache_pool

删除写回缓存

由于写回缓存可能已修改数据,因此在禁用和删除缓存之前,必须采取措施确保不会丢失对缓存中对象的任何最近更改。将缓存模式更改为proxy,以便新的和修改的对象刷新至后端存储池:

ceph osd tier cache-mode cache_pool proxy

查看缓存池以确保所有的对象都被刷新。

rados -p cache_pool ls

如果缓存池中仍有对象,可以手动刷新它们。

rados -p cache_pool cache-flush-evict-all

删除覆盖层,以便客户端不会将流量引导到缓存池

ceph osd tier remove-overlay libvirt-pool

解除存储池与缓存池的关联

ceph osd tier remove libvirt-pool cache_pool

删除缓存池

ceph osd pool delete cache-pool cache_pool --yes-i-really-really-mean-it








公众号:运维开发故事

github:https://github.com/orgs/sunsharing-note/dashboard

博客:https://www.devopstory.cn

爱生活,爱运维

我是wanger,《运维开发故事》公众号团队中的一员,一线运维农民工,云原生实践者,这里不仅有硬核的技术干货,还有我们对技术的思考和感悟,欢迎关注我们的公众号,期待和你一起成长!